Nginx配置websocket反向代理
前言
做实时聊天、推送、在线游戏,需要用 WebSocket。Nginx 当反向代理的时候,默认不支持 WebSocket 协议,需要额外配置。本文讲一下怎么配。
WebSocket 是什么
WebSocket 是一种全双工通信协议,浏览器和服务器建立连接后,可以一直保持连接,互相实时推送消息。
为什么需要特殊配置
普通 HTTP 请求是短连接,请求完就断了。WebSocket 是长连接,而且用的是 Upgrade 协议头。Nginx 默认的反向代理不支持这种升级,需要加特殊配置。
基础配置
location /ws/ {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
关键就是这三行:
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
完整配置示例
server {
listen 80;
server_name www.example.com;
root /var/www/html;
index index.html;
# WebSocket 代理
location /ws/ {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_read_timeout 300s;
}
# 普通 HTTP 代理
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
超时配置
WebSocket 是长连接,默认超时时间短了会自动断开。
proxy_read_timeout 300s;
proxy_send_timeout 300s;
意思是:5分钟没有数据传输才断开。
常见坑
坑1:WebSocket 连接失败
前端连 WebSocket 一直失败。
原因: Nginx 没配 Upgrade 和 Connection 头。
解决: 加上那三行关键配置。
坑2:连接几秒就自动断了
连上了,过一会儿就断了。
原因: Nginx 默认超时时间太短(60秒)。
解决: 调大 proxy_read_timeout。
坑3:HTTPS 下 WebSocket 连不上
HTTP 下正常,HTTPS 下连不上。
原因: 前端用了 ws://,但网站是 https 的,浏览器不让。
解决: 前端用 wss://(加密的 WebSocket)。
坑4:连接数太多被拒
很多人同时在线,新的连接被拒了。
原因: Nginx 或后端服务器连接数限制。
解决: 调大 Nginx 和后端的连接数限制。
总结
WebSocket 代理就三行核心配置:
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
记住: WebSocket 是长连接,记得调大超时时间,别让它自动断了。
遇到问题加QQ23979811 协助处理