nginx websocket 400 - 我用 nginx 反代 socket.io 做推送的时候出现了这个问题,本文主要记录使用 socket.io 做推送并使用 nginx 反代,以及解决遇到的问题,比如这个 400 错误以及设置超时等。
至于 socket.io 的使用,我已经写过一篇文章了,请查看:使用 socket.io 给浏览器推送消息 ,当时还是在另一家公司做项目,最近在自己创业,做 也贝印品,当时需要在用户扫码支付完成后发送推送提示付款成功,自然用到了 socket.io 结果反代后提示 400 错误,以下是解决过程:
nginx websocket 400 的解决过程
首先,我看到了 nginx 官方的文档:WebSocket proxying ,按照文档的意思,首先,nginx 1.3.13 起才支持 websocket 这点我相信绝大部分人是满足的,毕竟,我使用的版本已经是 1.13.6.1 了,你可以尝试用 nginx -v 查看版本信息。
接着就是 nginx 的配置了,需要添加以下几行:
proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";
而且默认是 60秒 超时,即服务端和客户端在60秒内没有数据交换时连接会被释放,官方的建议是 增大 proxy_read_timeout,比如设置为 proxy_read_timeout 180s; 则3分钟后才超时,官方的另一个建议是客户端和服务端发送ping 去检测超时,这个 socket.io 同样支持。比如:
const io = require('socket.io')(server, { pingInterval: 10000, });
则代表每 10 秒发送一次心跳检测,你可以根据需要增大。