配置nginx支持https,其实也简单,搞个证书,然后修改下配置文件就好了。我以前一篇文章(使用docker部署多个nginx站点并配置负载均衡)为例,做个记录。

如前所述,我使用docker,部署了3个nginx。一个做负载均衡服务器,另外两个做应用。结构如下:

使用docker部署nginx并支持https_docker


那么,支持https,也是在负载均衡这里进行设置。详细记录如下:

一、制作证书

反正docker跑在linux下,证书就在linux里制作了。
1、安装openssl
yum install -y openssl openssl-devel

2、制作密钥
openssl genrsa -out szdata.key 2048

3、制作证书

openssl req -new -x509 -days 3650 -key szdata.key -out szdata.crt

输入信息,回车,回车,就好了。

使用docker部署nginx并支持https_docker_02

二、重新创建nginx容器

像我的情况,重新创建负载均衡这个容器就行了。脚本如下:

sudo docker run --name nginx-szdata-lb --privileged -it -p 8443:443 \
-v /home/admin/szdata/nginx/conf/lb.conf:/etc/nginx/nginx.conf:ro \
-v /home/admin/szdata/nginx/conf/conf.d:/etc/nginx/conf.d:ro \
-v /home/admin/szdata/nginx/logs:/var/log/nginx \
-v /home/admin/szdata/nginx/cert:/etc/nginx/cert \
-d nginx

使用docker部署nginx并支持https_https_03

使用docker部署nginx并支持https_docker_04


docker容器删除、重建很平常,这时就体现出挂载方式部署的优越性了。不然配置文件跟着被删,太麻烦。

三、修改nginx配置

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    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;

    keepalive_timeout  65;

    #gzip  on;

	#负载均衡
    upstream szdata-web{
	   server 192.168.175.128:8001;
	   server 192.168.175.128:8002;
    }

	#重点
    server {
        listen 443 ssl;
        server_name localhost;  
        # 注意文件位置,是从/etc/nginx/下开始算起的
        ssl_certificate cert/szdata.crt;
        ssl_certificate_key cert/szdata.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 / {
            proxy_set_header HOST $host;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://szdata-web;
        }

        location /pubzy/ {
            alias   /usr/share/nginx/html/;
        }
    }
    #这个好像没什么卵用。不起作用。存疑。
    server {
        listen       80;
        server_name  localhost;    
        return 301 https://$host$request_uri; 
    }

}

有关负载均衡,请看我前一篇文章:使用docker部署多个nginx站点并配置负载均衡

然后输入 https://ip:8443/,就可以访问了。

四、小结

从配置看,nginx还是用了转发。外部使用https请求,nginx转发到了http。

总的来看,设置nginx支持https还是比较简单的。自己制作的网站证书,虽然浏览器不认,但这并不妨碍浏览器与服务器之间进行加密传输。试想如果没有https,那么我们登录的时候,账号密码就是明文传输,今时今日的客户无法接收。所以https是标配。

不过,站点改为https后,之前如果有一些外链是http的话,将引用不了。