WebSocket协议允许客户端与服务器之间建立全双工通信通道,非常适合实时应用。以下是使用Nginx作为WebSocket反向代理的详细配置方法。
server {
listen 80;
server_name yourdomain.com;
location /websocket/ {
proxy_pass http://backend_server;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
# 可选:设置代理超时时间
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
}
HTTP版本升级:
proxy_http_version 1.1;
WebSocket需要HTTP/1.1协议支持。
协议升级头:
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
这些头信息允许将HTTP连接升级为WebSocket连接。
超时设置:
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
WebSocket连接通常是长连接,需要适当增加超时时间。
http {
# 共享内存区域,用于WebSocket连接
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 443 ssl;
server_name yourdomain.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
# WebSocket路径
location /ws/ {
proxy_pass http://websocket_backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $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;
# 缓冲区设置
proxy_buffering off;
}
# 其他HTTP请求
location / {
proxy_pass http://http_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
upstream websocket_backend {
server 127.0.0.1:8080;
# 可以添加更多后端服务器实现负载均衡
}
upstream http_backend {
server 127.0.0.1:8000;
}
}
连接断开问题:
proxy_read_timeout
和proxy_send_timeout
是否设置足够大502 Bad Gateway错误:
WebSocket连接无法建立:
Upgrade
和Connection
头正确设置负载均衡:
upstream websocket_backend {
server backend1.example.com:8080;
server backend2.example.com:8080;
server backend3.example.com:8080;
}
连接保持:
proxy_set_header Connection $connection_upgrade;
缓冲区优化:
proxy_buffering off;
SSL优化(如果使用HTTPS):
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
配置完成后,可以使用以下工具测试WebSocket连接:
- 浏览器开发者工具
- wscat
命令行工具
- Postman(支持WebSocket)
通过以上配置,Nginx可以有效地作为WebSocket的反向代理,支持实时通信应用的部署。