阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

使用Nginx+Docker配置HTTPS负载均衡

111次阅读
没有评论

共计 4227 个字符,预计需要花费 11 分钟才能阅读完成。

了解 Docker

Docker 是一个 golang 编写的开源轻量级的、可移植的、自给自足的容器,Docker 主要应用在以下场景:

  • web 应用的自动化打包和发布;
  • 自动化测试和持续集成、发布;
  • 在服务型环境中部署和调整数据库或其他的后台应用;
  • 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。

Docker 系统有两个程序:docker 服务端和 docker 客户端。其中 docker 服务端是一个服务进程,管理着所有的容器。docker 客户端则扮演着 docker 服务端的远程控制器,可以用来控制 docker 的服务端进程。大部分情况下,docker 服务端和客户端运行在一台机器上。

  • 镜像:一个镜像相当于一个 root 文件系统,包含运行需要的文件、库、资源、配置
  • 容器:容器是镜像的实例化操作,容器有自己独立的文件系统、网络配置、进程空间,每个容器是独立的运行机制,容器是无状态的,数据应保存在数据卷中。
  • 仓库:管理 docker 镜像的发布

docker 安装及配置

在 CentOS 系列系统中可直接使用 yum 命令进行搜索安装,安装完毕后可运行 docker version 查看安装的版本,docker 包含了很有公用的镜像,可使用 docker search 进行搜索安装。

yum install docker -y
docker pull nginx
# 运行 4 个 docker 镜像,网站目录在./ningx/html/ 下,日志文件在 ./nginx/logs/ 下
docker run -it -p 8081:80 –name nginx1 -v `pwd`/nginx/html1/:/usr/share/nginx/html/ -v `pwd`/nginx/logs1/:/var/log/nginx/  -d nginx
docker run -it -p 8082:80 –name nginx2 -v `pwd`/nginx/html2/:/usr/share/nginx/html/ -v `pwd`/nginx/logs2/:/var/log/nginx/ -d nginx
docker run -it -p 8083:80 –name nginx3 -v `pwd`/nginx/html3/:/usr/share/nginx/html/ -v `pwd`/nginx/logs3/:/var/log/nginx/ -d nginx
docker run -it -p 8084:80 –name nginx4 -v `pwd`/nginx/html4/:/usr/share/nginx/html/ -v `pwd`/nginx/logs4/:/var/log/nginx/ -d nginx

安装 docker php-fpm

docker pull php:7.1-fpm
docker run -p 9000:9000 –name php-fpm1 -d -v /opt/app/docker/nginx/app1/:/var/www/html:ro php:7.1-fpm
docker run –name nginx1 -p 8081:80 -d -v /opt/app/docker/nginx/html1:/usr/share/nginx/html:ro -v /opt/app/docker/nginx/conf1:/etc/nginx/conf.d:ro -v /opt/app/docker/nginx/logs1:/var/log/nginx –link php-fpm1:php nginx
echo “<?php phpinfo();” > /opt/app/docker/nginx/app1/index.php

推荐《Docker 从入门到实践》,具体可打开 https://www.linuxidc.com/Linux/2016-02/128290.htm

nginx 配置

nginx 的安装就不再描述了,最简单快捷的可使用 yum 进行安装,可可以自行去官网进行下载编译安装,以下是我的 nginx 负载均衡 https 到 docker 的配置文件:

注:我的运行环境在 aws 上,你可以将 docker 和 nginx 安装在一台机器上,也可以将 docker 部署在 1 台或 4 台机器,nginx 部署在一台机器,再结合 keepalived 做高可用就可实现高可用双机热备的 https 负载均衡啦~

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    log_format  main  ‘$remote_addr – $remote_user [$time_local] “$request” ‘
                      ‘$status $body_bytes_sent “$http_referer” ‘
                      ‘”$http_user_agent” “$http_x_forwarded_for”‘;
   
    access_log  /var/log/nginx/access.log  main;
   
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay        on;
    keepalive_timeout  65;
    types_hash_max_size 2048;
   
    include            /etc/nginx/mime.types;
    default_type        application/octet-stream;
       
    index  index.html index.htm;
   
    upstream docker_nginx {
        ip_hash; #同一个 ip 一定时间内负载到一台机器
        server 172.31.0.155:8081; # docker 虚拟的第 1 台 nginx 机器
        server 172.31.0.155:8082; # docker 虚拟的第 2 台 nginx 机器
        server 172.31.0.155:8083; # docker 虚拟的第 3 台 nginx 机器
        server 172.31.0.155:8084; # docker 虚拟的第 4 台 nginx 机器
    }
   
    server {
        # 使用 openssl 自建的 rsa 证书
        ssl_certificate /opt/ssl/nginx.ipp365.com.crt;
        ssl_certificate_key /opt/ssl/nginx.ipp365.com.key;
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
   
        listen 443;
        ssl on;
        server_name nginx.ipp365.com;
       
        location / {
                # 代理到真实机器,如果真实机器也安装了 https 则使用 https
                # 一般代理集群对流量进行了 https 后,真实机器可不再使用 https
                proxy_pass http://docker_nginx;
        }
    }
}

创建 ssl 自建的证书

线上证书一般去 ca 申请的,测试的话可以使用 openssl 自己创建两个证书,创建命令如下:

# 生成一个 2048 位密钥文件
openssl genrsa -out privkey.pem 2048
# 使用密钥文件生成一个证书
openssl req -new -x509 -key privkey.pem -out cacert.pem -days 1095

SSL 常见错误

问题:此网站出具的安全证书不是由受信任的证书颁发机构颁发的。

服务器正在使用的 SSL 证书不是通过正式的全球信任的 CA 颁发。推荐购买 GlobalSign SSL,GeoTrust SSL ,Symante SSL 证书,SSL 通常是因为没有正确安装证书,请再检查一下是否删除了原来的测试证书,如果网站使用的证书是正确的,请重新启动 webserver。

问题:此网站出具的安全证书是为其他网站地址颁发的。

一个 SSL 证书所对应的域名是一个全域名 FQDN(Fully Qualified Domain Name),如果证书中的域名是 www.domain.com,则通过其他相近的域名:web.domain.com,app.domain.com,domain.com,系统都会报告和证书中的域名不匹配。如果有多相同主域名的站点需要申请证书,推荐通配型 SSL 证书;如果不是相同主域名则需要购买多域名型 SSL 证书。

问题:本页面包含有不安全的内容。

如果一个页面需要通过 HTTPS 访问被访问,则其中所有的元素都必须是 HTTPS 方式,如果有:图片、JS 脚本,FLASH 插件是通过 HTTP 方式去调用的,就会出现这个错误,最常见的,就是调用 flash 播放插件:codebase=’http://download.macromedia.com/pub/shockwave/
cabs/flash/swflash.cab’,将 http 改成 HTTPS 即可,刷新后测试 SSL 问题有没有解决。

问题:此网站出具的安全证书已过期或还未生效。

这个标识网站使用的 SSL 证书已经过期,请先检查网站证书的有效期,如果网站证书有效期在本日以后,则请检查本地电脑的日期设置,是否正确。如果证书过期了,请尽快联系易维信客服,续费!就能处理好 SSL 错误了。
问题:为什么使用匿名 Diffie-Hellman(ADH) 算法时会收到 ”no shared cipher” 错误?

默认情况下,出于安全原因,OpenSSL 并不启用 ADH 算法。仅在你确实明白了这个算法的副作用时,你才可以启用此算法。
为了使用匿名 Diffie-Hellman(ADH) 算法,你必须在编译 OpenSSL 时使用 ”-DSSL_ALLOW_ADH” 配置选项,并在 SSLCipherSuite 指令中添加 ”ADH”。

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-21发表,共计4227字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中