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;
      }
  }
} 
posted @ 2020-05-07 11:36  小丑不戴面具  阅读(280)  评论(0编辑  收藏  举报