IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Docker下Nginx实现WebSocket+SSL反向代理 -> 正文阅读

[系统运维]Docker下Nginx实现WebSocket+SSL反向代理

问题背景:开发网页应用大部分基于 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 特定域名(与生成证书时的域名相匹配)
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-08-07 12:29:14  更:2021-08-07 12:30:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:35:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码