关于nginx:Docker下Nginx实现WebSocketSSL反向代理

58次阅读

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

问题背景:开发网页利用大部分基于 http 协定,在应用一些额定性能波及隐衷平安,譬如视频、音频传输会须要通过 https 建设链接。在不对原有的网页架构进行更改的前提下,须要通过 Nginx 对客户端发动的 https 申请进行代理,客户端与 Nginx 服务器之前通信应用 WebSocket + SSL,Nginx 服务与服务器之间应用 WebSocket 进行通信。

一、Docker 环境装置

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

二、Nginx 镜像包导出,以及载入

docker pull nginx:mainline-alpine-perl

docker save e310e1d4a8bb -o /home/nginx.tar // 存储镜像为 tar 包

docker load -i nginx.tar // 转移 jar 包,从新载入

docker run --name nginx -d -p 8010:8010 -p 8011:8011 -p 433:433 nginx:mainline-alpine-perl --restart always //restart =‘always’参数指定服务是否自启动

docker run --name nginx -d -p 8010:8010 -p 8011:8011 -p 433:433 nginx // 运行 nginx 镜像并建设端口映射

三、nginx.conf 文件、目录挂载

无挂载目录

docker stop nginx

find / -name nginx.conf

cd /XXX/XXX/XXX/ //find 命令所查找的门路名称

vim nginx.conf

docker start nginx

挂载目录

docker exec -it nginx /bin/bash // 进入容器外部

docker run --name nginx -d -p 8090:80 -p 443:443 -v /home/nginx/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/conf.d:/etc/nginx/conf.d -v /home/ssl:/home nginx // 挂载目录, 批改对应目录下的文件即可

四、证书生成(解决自签名证书有效)

chrome 验证证书很严格,必须带有 Subject Alternative Name.

linux 下查找 openssl.cnf 文件。cp 一份到以后 open 文件夹上面。

cp /etc/pki/tls/openssl.cnf ~/open/

第一步,在 [req] 节增加:

req_extetions = v3_req

第二步,增加 v3_req 节的配置

[v3_req] # Extensions to add to a certificate request 
basicConstraints = CA:FALSE 
keyUsage = nonRepudiation, digitalSignature, keyEncipherment 
subjectAltName = @alt_names

第三步,在 alt_names 增加受信赖域名, 这个受信赖的域名用途就是,咱们生成的证书只能是以下域名应用才行,否则会报 COMMON_NAME_INVALID 谬误。

[alt_names]
DNS.1 = localhost(特定域名)DNS.2 = 特定域名
DNS.3 = 特定域名

第四步,生成证书

openssl req -sha256 -newkey rsa:2048 -nodes -keyout  server.key -x509 -days 3650 -out  server.crt -config ./openssl.cnf -extensions v3_req // 生成证书时,国家、省份、城市、组织、个人、域名、邮箱等均按失常状况填写即可。

第五步,将证书搁置到 Nginx 指定门路的文件夹,并将 server 对应的证书配置项批改为证书所在的门路。

五、nginx 配置文件(默认介绍 +SSL 配置)

nginx 默认配置介绍

# 运行用户,默认即是 nginx,能够不进行设置
user  nginx;
#Nginx 过程,个别设置为和 CPU 核数一样
worker_processes  1;

#谬误日志寄存目录
error_log  /var/log/nginx/error.log warn;
#过程 pid 寄存地位
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; #nginx 拜访日志寄存地位

    sendfile        on; #开启高效传输模式
    #tcp_nopush     on; #缩小网络报文段的数量

    keepalive_timeout  65; #放弃连贯的工夫,也叫超时工夫

    #gzip  on; #开启 gzip 压缩

    include /etc/nginx/conf.d/*.conf; #蕴含的子配置项地位和文件
}

nginx.conf SSL 配置

http {
    server {
        listen       443 ssl;
        server_name 特定域名(localhost);
        
        ssl_certificate server.crt;
        ssl_certificate_key server.key;
        error_log   logs/error.log;
        client_max_body_size 60M;
        client_body_buffer_size 512k;
        location ~/.* {proxy_pass   http://127.0.0.1:7080;}
    }
    
    server {
        listen 8083 ssl;
        server_name 特定域名(localhost);
    
        ssl_certificate server.crt;
        ssl_certificate_key server.key;
        ssl_protocols SSLv3 SSLv2 TLSv1 TLSv1.1 TLSv1.2;
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;
        # ssl_prefer_server_ciphers on;

        location /ws{
             #反向代理到 mqtt 的 ws 端口 8083,同时协定转换为 http,这样服务器端代码就不须要做批改
            proxy_pass http://192.168.55.111:8083;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            #因为服务器端源码 (倡议大家做好大小写匹配) 只匹配了 "Upgrade" 字符串, 所以如果这里填 "upgrade" 服务器端会将这条 http 申请当成一般的申请, 导致 websocket 握手失败
            proxy_set_header Connection "Upgrade";
            proxy_set_header Remote_addr $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_read_timeout 600s;
        }
    }   
}

六、浏览器证书装置

对于自生成的证书,须要在浏览器内手动装置。证书装置形式可参考 证书装置。

批改 C:\Windows\System32\drivers\etc\hosts 的文件配置,填写下列映射:

192.5.52.128 特定域名(与生成证书时的域名相匹配)

正文完
 0