WebSocket是一种在单个TCP连接上进行全双工通信的协议,常用于实时通信应用。本教程将详细介绍如何使用Nginx作为反向代理来配置WebSocket服务。
以下是一个基本的Nginx WebSocket反向代理配置:
server {
listen 80;
server_name yourdomain.com;
location /ws/ {
proxy_pass http://backend_server;
# WebSocket必需配置
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 可选优化配置
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_read_timeout 86400s;
proxy_send_timeout 86400s;
}
}
HTTP版本:
proxy_http_version 1.1;
WebSocket需要HTTP/1.1协议支持
升级头信息:
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
这两行告诉Nginx将连接从HTTP协议升级为WebSocket协议
超时设置:
proxy_read_timeout 86400s; # 24小时
proxy_send_timeout 86400s;
WebSocket通常是长连接,需要设置较长的超时时间
负载均衡:
upstream websocket_servers {
server 10.0.0.1:8080;
server 10.0.0.2:8080;
server 10.0.0.3:8080;
}
然后在location中使用:
proxy_pass http://websocket_servers;
对于安全的WebSocket连接(wss://),需要配置SSL:
server {
listen 443 ssl;
server_name yourdomain.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location /ws/ {
proxy_pass http://backend_server;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 其他配置...
}
}
upstream websocket_cluster {
server 10.0.0.1:8080;
server 10.0.0.2:8080;
ip_hash; # 保持客户端与同一后端服务器的连接
}
server {
listen 80;
server_name ws.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
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;
# SSL优化配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256...';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# WebSocket配置
location /ws/ {
proxy_pass http://websocket_cluster;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 86400s;
proxy_send_timeout 86400s;
# 限制连接数
limit_conn conn_limit_per_ip 10;
limit_conn_status 429;
}
# 健康检查端点
location /health {
proxy_pass http://websocket_cluster;
access_log off;
}
}
连接断开问题:
502 Bad Gateway错误:
/var/log/nginx/error.log
WebSocket连接无法建立:
负载均衡问题:
ip_hash
保持会话粘性worker_connections
值tcp_nopush
和tcp_nodelay
选项测试Nginx配置语法:
sudo nginx -t
重新加载Nginx配置:
sudo systemctl reload nginx
使用WebSocket客户端工具测试连接,如wscat
:
wscat -c ws://yourdomain.com/ws/
通过以上配置,Nginx可以有效地作为WebSocket服务的反向代理,提供负载均衡、SSL终止和其他高级功能,同时保持WebSocket连接的高效和稳定。