推荐答案
// www.javascriptcn.com code example
http {
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
server_name example.com;
location /ws/ {
proxy_pass http://backend_server;
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_set_header X-Forwarded-Proto $scheme;
}
}
}本题详细解读
1. WebSocket 代理的基本原理
WebSocket 是一种全双工通信协议,允许客户端和服务器之间进行实时通信。Nginx 作为反向代理服务器,可以通过配置将 WebSocket 请求转发到后端服务器。
2. 配置关键点
proxy_http_version 1.1: WebSocket 协议基于 HTTP/1.1,因此需要将代理的 HTTP 版本设置为 1.1。proxy_set_header Upgrade $http_upgrade: 设置Upgrade头为$http_upgrade,用于指示协议升级为 WebSocket。proxy_set_header Connection $connection_upgrade: 设置Connection头为$connection_upgrade,用于保持连接。map $http_upgrade $connection_upgrade: 这个映射用于根据$http_upgrade的值动态设置$connection_upgrade。如果$http_upgrade为空,则关闭连接。
3. 其他常用配置
proxy_set_header Host $host: 设置Host头为原始请求的Host。proxy_set_header X-Real-IP $remote_addr: 设置X-Real-IP头为客户端 IP 地址。proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for: 设置X-Forwarded-For头,用于记录客户端的原始 IP 地址。proxy_set_header X-Forwarded-Proto $scheme: 设置X-Forwarded-Proto头,用于记录原始请求的协议(HTTP 或 HTTPS)。
4. 示例配置解释
location /ws/: 匹配所有以/ws/开头的请求路径。proxy_pass http://backend_server: 将请求转发到后端服务器backend_server。
通过以上配置,Nginx 可以正确代理 WebSocket 请求,并保持与客户端和后端服务器的实时通信。