nginx或tengine服务器,配置HTTPS下使用WebSocket的线上环境实践!

问题描述:

HTTPS 下发起WS连接,连接失败,Chrom 浏览器报错。

复制代码
socket.js:19 Mixed Content: The page at 'https://app.XXX.com' was loaded over HTTPS, but attempted to connect to the insecure WebSocket endpoint 'ws://172.16.10.80:9035/websocket/416377519315353600'. This request has been blocked; this endpoint must be available over WSS.

问题排查:

HTTPS 连接下浏览器不允许WS协议,只允许WSS协议

问题解决:

(1)确定后端接口提供ws 能力

WS 在线测试工具:websocket/ws/wss在线调试测试工具

  • ws://172.16.10.80:9035/websocket/

确定接口能提供ws 的能力

(2)、nginx 配置websocket代理【客户端不直连websocket接口】

复制代码
#全局配置
.............
map $http_upgrade $connection_upgrade {
      default upgrade;
      '' close;
    }

.....................

server  {
        listen 443 ssl;
        server_name app.XXX.com;
        ssl_certificate /home/application/nginx/cert/XXX.com/XXX.com.crt;
        ssl_certificate_key /home/application/nginx/cert/XXX.com/XXX.link.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;
        gzip_buffers 4 16k;


location ^~/websocket {
   rewrite ^/websocket/(.*)$ /$1 break;
   proxy_pass http://172.16.10.80:9035;
   proxy_read_timeout 300s;
   proxy_send_timeout 300s;
   proxy_set_header Host $host;
   proxy_set_header X-Real-IP $remote_addr;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_http_version 1.1;
   proxy_set_header Upgrade $http_upgrade;
   proxy_set_header Connection  $connection_upgrade;
}

...................

}
  • rewrite 地址重写
  • proxt_http_version 1.1 表示反向代理发送的HTTP协议的版本是1.1,HTTP1.1支持长连接
  • proxy_pass http://172.16.10.80:9035 表示反向代理的uri, 如果多个地址可使用负载均衡变量表示
  • proxy_set_header Host host; 表示传递时请求头不变, host是nginx内置变量,表示的是当前的请求头,proxy_set_header表示设置请求头
  • proxy_set_header X-Real-IP $remote_addr; 表示传递时来源的ip还是现在的客户端的ip
  • proxy_read_timeout 300s; 表示两次请求之间的间隔超过 300s 后才关闭这个连接,默认的60s,自动关闭的元凶
  • proxy_send_timeout 300s; 指定设置了发送请求给upstream服务器的超时时间。超时设置不是为了整个发送期间,而是在两次write操作期间。如果超时后,upstream没有收到 新的数据,Nginx会关闭连接,默认的60s
  • proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 表示X-Forwarded-For头不发生改变
  • proxy_set_header Upgrade $http_upgrade; 表示设置Upgrade不变
  • proxy_set_header Connection connection_upgrade; 表示如果 http_upgrade为upgrade,则请求为upgrade(websocket),如果不是,就关闭连接

(3)、前端代码改造,区分ws 还是 WSS

  • 因我们的站点支持HTTP 和 HTTPS 双协议栈网站访问,使用同一套前端代码,因此就需要前端同学 在代理中加入判断,当我访问的是HTTP 站点的时候,走WS 协议,同理 当我访问的是HTTPS 站点的时候,走WSS 协议

  • 大致JS代码如下:

访问测试:

相关推荐
风乍起吹皱一池春水几秒前
Linux 文件及用户的一些日常命令
linux·服务器
渡我白衣4 分钟前
计算机组成原理(5):计算机的性能指标
服务器·网络·c++·人工智能·网络协议·tcp/ip·网络安全
炼丹精神小伙6 分钟前
VS Code 多跳板机连到目标服务器
运维·服务器
同聘云9 分钟前
阿里云国际站服务器防火墙如何使用及防护???
服务器·阿里云·云计算
陌sr,14 分钟前
关于TMK的生成及安全注入方式
android·运维·服务器·安全·pos机·edc·刷卡
gaize121314 分钟前
华为云与火山引擎云服务对比分析
服务器·云计算
云和数据.ChenGuang16 分钟前
运维工程师技术之nginx搭配php
运维·nginx·php·运维技术·数据库运维工程师·运维教程
wanhengidc19 分钟前
云手机 一款多功能利器
运维·服务器·安全·智能手机·生活
WTCLLB26 分钟前
打印机双面扫描文件保存到windows11家庭版电脑,提示出错:正在连接服务器,服务器响应错误
运维·服务器·电脑
dishugj28 分钟前
【Linux】CENTOS 7服务器chronyd同步本地时间服务器时间设置详解
linux·运维·服务器