DotNet跨平台 - docker+nginx+ssl 负载均衡
环境:CentOS7
服务器需要安装:docker、nginx、OpenSSL
一、部署方案
在linux服务器上,我们的Web站点程序采用docker容器部署,为了演示负载均衡,我们在同一台linux服务器上部署两个web站点容器,然后配置nginx做反向代理和负载均衡,再给站点配置SSL证书。
二、安装openssl
//yum安装openssl:
yum install openssl
yum install openssl-devel
三、安装nginx
//安装nginx: curl -o nginx.rpm http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm rpm -ivh nginx.rpm yum install nginx
四、安装docker
参考:DotNet跨平台 - docker部署.net core2.0项目
五、配置nginx
1.用nginx来做负载均衡
有多种配置方法,这里我们用的是ip_hash,这种模式会根据来源IP和后端配置来做hash分配,确保固定IP只访问一个后端。
其他配置方法可以参考:https://www.cnblogs.com/xusion/articles/2853352.html
我们将两个web站点容器的IP指定为172.18.0.2和172.18.0.3,如何指定IP我们下面会讲
#我们部署了两个web站点容器,端口号分别为8056和8057
upstream blance { ip_hash; server 172.18.0.2:8056 weight=5 max_fails=3 fail_timeout=30s; server 172.18.0.3:8057 weight=5 max_fails=3; }
2.配置ssl证书
首先需要申请ssl证书,大家可以在阿里云申请免费的证书,这个大家可以参考:https://www.cnblogs.com/osfipin/p/freessl.html
证书申请下来后,将下载下来的两个文件上传至服务器,我们上传至/etc/ssl/cert/ 这个目录,https的默认端口是443,完整的server配置如下:
# Settings for a TLS enabled server. server { listen 443 ssl; server_name yourwebsite.cn; #填写绑定证书的域名 #ssl on; #root /usr/share/nginx/html; #index index.html index.htm; ssl_certificate /etc/ssl/cert/_.yourwebsite.cn_bundle.crt; ssl_certificate_key /etc/ssl/cert/yourwebsite.cn.key; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置 ssl_prefer_server_ciphers on; location / { #文件夹 root html; #主页文件 index index.html index.htm; proxy_pass http://blance; } }
3.配置上传文件大小限制
如果站点需要上传文件,你会发现大一点的文件无法上传成功,那是因为nginx默认是限制文件大小的,我们可以做一下配置,一共有三种方法,可以根据实际需要来配置:
可以选择在http{ }中设置:client_max_body_size 20m;
也可以选择在server{ }中设置:client_max_body_size 20m;
还可以选择在location{ }中设置:client_max_body_size 20m;
三者到区别是:http{} 中控制着所有nginx收到的请求。而报文大小限制设置在server{}中,则控制该server收到的请求报文大小,同理,如果配置在location中,则报文大小限制,只对匹配了location 路由规则的请求生效。
nginx.conf 文件修改后记着要执行 nginx –s reload 命令来生效
六、启动容器
所有的准备工作都做好后,我们执命令来启动站点容器 --name 指定容器名字,--ip指定容器ip:
docker run --restart=always --name yourname --ip 172.18.0.2 -d -p 8056:8056 website:1.0
docker run --restart=always --name yourname --ip 172.18.0.3 -d -p 8057:8056 website:1.0
我们通过docker ps命令来查看我们的两个站点容器的运行状态,如果都正常启动了,那么恭喜你!
七、一些知识点
#每次重启站点容器,站点的IP就可能发生变化,这样我们在nginx.conf里配置的IP就会失效,所以我们上面启动容器的时候指定了IP。
#获取容器内部IP使用命令
docker inspect 容器ID
#然后过滤出 IPAddress 即可查看容器的 IP
docker inspect 容器ID | grep IPAddress
#docker network命令用来管理docker的网络,首先创建一个网络,命名为mynetwork,然后运行容器,指定该网络
docker network create --subnet=172.18.0.0/16 mynetwork
docker run --restart=always --name yourname --net mynetwork --ip 172.18.0.3 -d -p 8057:8056 website:1.0
有时候我们需要进入容器内部查看一下文件,因为容器内没有安装vim,所以需要我们手动安装一下
mv /etc/apt/sources.list /etc/apt/sources.list.bak
echo "deb http://mirrors.163.com/debian/ jessie main non-free contrib" >> /etc/apt/sources.list
echo "deb http://mirrors.163.com/debian/ jessie-proposed-updates main non-free contrib" >>/etc/apt/sources.list
echo "deb-src http://mirrors.163.com/debian/ jessie main non-free contrib" >>/etc/apt/sources.list
echo "deb-src http://mirrors.163.com/debian/ jessie-proposed-updates main non-free contrib" >>/etc/apt/sources.list
#更新安装源
apt-get update
apt-get install -y vim
完整的nginx.conf如下:
user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic. include /usr/share/nginx/modules/*.conf; 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" "$upstream_addr "'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; client_max_body_size 10m; include /etc/nginx/mime.types; default_type application/octet-stream; # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf; upstream blance { ip_hash; server 172.18.0.2:8056 weight=5 max_fails=3 fail_timeout=30s; server 172.18.0.3:8057 weight=5 max_fails=3; } server { listen 80; server_name yourwebsite.cn; #root /usr/share/nginx/html; rewrite ^(.*)$ https://$server_name$1 permanent; # 把http的域名请求转成https # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { root html; index index.html index.htm; proxy_pass http://yourwebsite.cn; } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } # Settings for a TLS enabled server. server { listen 443 ssl; server_name yourwebsite.cn; #填写绑定证书的域名 #ssl on; #root /usr/share/nginx/html; #index index.html index.htm; ssl_certificate /etc/ssl/cert/_.yourwebsite.cn_bundle.crt; ssl_certificate_key /etc/ssl/cert/yourwebsite.cn.key; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置 ssl_prefer_server_ciphers on; location / { #文件夹 root html; #主页文件 index index.html index.htm; proxy_pass http://blance; } } }