在 Nginx 中配置 WebSocket 支持需要确保代理正确处理 WebSocket 的协议升级(Upgrade)和连接保持(Connection)。以下是 完整配置指南 和 关键优化技巧:
1. 基础 WebSocket 代理配置
server {
listen 80;
server_name example.com;
location /ws/ {
proxy_pass http://backend_ws; # WebSocket后端服务器地址
proxy_http_version 1.1; # 必须使用HTTP/1.1
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
upstream backend_ws {
server 10.0.0.1:8080; # WebSocket服务地址(如Node.js、Socket.io)
}
关键指令说明:
指令 | 作用 |
---|---|
proxy_http_version 1.1 |
WebSocket 必须基于 HTTP/1.1 协议。 |
proxy_set_header Upgrade |
传递客户端的 Upgrade: websocket 头到后端。 |
proxy_set_header Connection |
将 Connection: upgrade 头透传给后端,完成协议升级。 |
2. 高级优化配置
(1) 超时控制
WebSocket 是长连接,需调整超时时间:
location /ws/ {
proxy_pass http://backend_ws;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400s; # 连接保持时间(24小时)
proxy_send_timeout 86400s;
}
(2) 负载均衡
多个 WebSocket 后端服务器时:
upstream backend_ws {
server 10.0.0.1:8080;
server 10.0.0.2:8080;
ip_hash; # 同一IP固定访问同一后端(保持会话)
}
(3) HTTPS/WSS 配置
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location /ws/ {
proxy_pass http://backend_ws;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
3. 完整配置示例
http {
upstream websocket_servers {
ip_hash;
server 10.0.0.1:8080 weight=3;
server 10.0.0.2:8080;
}
server {
listen 80;
server_name ws.example.com;
# WebSocket 路径
location /chat/ {
proxy_pass http://websocket_servers;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
# 超时与缓冲优化
proxy_read_timeout 86400s;
proxy_buffer_size 16k;
proxy_buffers 4 32k;
}
# HTTP 跳转 HTTPS(可选)
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name ws.example.com;
ssl_certificate /etc/letsencrypt/live/ws.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ws.example.com/privkey.pem;
location /chat/ {
proxy_pass http://websocket_servers;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
}
4. 测试 WebSocket 连接
(1) 使用 curl
测试协议升级
curl -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" -H "Host: example.com" http://localhost/ws/
- 正常响应应包含
HTTP/1.1 101 Switching Protocols
。
(2) 浏览器端测试
// JavaScript 示例
const socket = new WebSocket("wss://example.com/ws/");
socket.onopen = () => console.log("Connected!");
socket.onmessage = (e) => console.log("Message:", e.data);
5. 常见问题排查
问题1:连接立即断开
- 原因:Nginx 未正确传递
Upgrade
头。 - 解决:检查配置中是否遗漏
proxy_set_header
指令。
问题2:WSS (WebSocket Secure) 失败
- 原因:证书无效或配置错误。
- 排查:
openssl s_client -connect example.com:443 -servername example.com -showcerts
问题3:负载不均衡
- 现象:所有流量打到同一后端。
- 解决:确保使用
ip_hash
或 Nginx Plus 的sticky
指令。
6. 性能优化建议
- 调整内核参数:
echo "net.ipv4.tcp_keepalive_time = 300" >> /etc/sysctl.conf sysctl -p
- 启用多 Worker 进程:
worker_processes auto; # 自动匹配CPU核心数
- 监控连接数:
watch -n 1 "netstat -anp | grep -E 'nginx|8080' | grep ESTABLISHED"
通过以上配置,Nginx 可以高效代理 WebSocket 流量,适用于实时聊天、在线游戏、股票行情等场景。对于高并发场景,建议结合 limit_conn
限制单 IP 连接数。
- - - - - - - 剩余部分未读 - - - - - - -
扫描关注微信公众号获取验证码,阅读全文
你也可以查看我的公众号文章,阅读全文
你还可以登录,阅读全文
原文出处:
内容由AI生成仅供参考,请勿使用于商业用途。如若转载请注明原文及出处。
出处地址:http://www.07sucai.com/tech/979.html
版权声明:本文来源地址若非本站均为转载,若侵害到您的权利,请及时联系我们,我们会在第一时间进行处理。