nginx 配置支持websocket服务
location /ilab/api/task {
proxy_pass https://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
这段 Nginx 配置是与反向代理(proxy_pass)相关的 HTTP 头部和协议设置,主要用于 WebSocket 支持、客户端真实 IP 传递等高级代理功能。以下是逐行解释:
1. proxy_http_version 1.1;
作用:强制代理使用 HTTP/1.1 协议(默认是 HTTP/1.0)。
为什么需要:
HTTP/1.1 支持长连接(Keep-Alive),提升性能。
WebSocket 必须依赖 HTTP/1.1(因为 WebSocket 握手需要在 HTTP/1.1 的 Upgrade 头中完成)。
2. proxy_set_header Upgrade $http_upgrade;
作用:将客户端的 Upgrade 请求头原样传递给后端服务器。
关键变量:
$http_upgrade:客户端请求中的 Upgrade 头值(例如 websocket)。
典型场景:
当客户端发起 WebSocket 连接时,请求头会包含 Upgrade: websocket,此配置确保该头部被传递到后端。
3. proxy_set_header Connection $connection_upgrade;
作用:动态设置 Connection 头,根据客户端请求决定是否保持连接升级。
关键变量:
$connection_upgrade:如果客户端请求包含 Upgrade 头,则值为 upgrade,否则为 close。
与 WebSocket 的关系:
配合 Upgrade 头,告诉后端服务器需要将连接升级为 WebSocket。
4. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
作用:添加客户端真实 IP 到 X-Forwarded-For 头。
关键变量:
KaTeX parse error: Double subscript at position 12: proxy_add_x_̲forwarded_for:自…remote_addr)到现有的 X-Forwarded-For 头(如果存在)。
为什么重要:
后端服务器可以通过此头获取原始客户端的真实 IP(而不是 Nginx 的 IP)。
格式示例:X-Forwarded-For: 客户端IP, 代理1IP, 代理2IP
5. proxy_set_header X-Real-IP $remote_addr;
作用:将客户端真实 IP 直接传递给后端,存放到 X-Real-IP 头。
关键变量:
$remote_addr:客户端的真实 IP 地址。
与 X-Forwarded-For 的区别:
X-Real-IP 只包含最后一个直连客户端的 IP,而 X-Forwarded-For 可能包含代理链中的所有 IP。
这段 Nginx 配置是与反向代理(proxy_pass)相关的 HTTP 头部和协议设置,主要用于 WebSocket 支持、客户端真实 IP 传递等高级代理功能。以下是逐行解释:
- proxy_http_version 1.1;
作用:强制代理使用 HTTP/1.1 协议(默认是 HTTP/1.0)。
为什么需要:
HTTP/1.1 支持长连接(Keep-Alive),提升性能。
WebSocket 必须依赖 HTTP/1.1(因为 WebSocket 握手需要在 HTTP/1.1 的 Upgrade 头中完成)。 - proxy_set_header Upgrade $http_upgrade;
作用:将客户端的 Upgrade 请求头原样传递给后端服务器。
关键变量:
$http_upgrade:客户端请求中的 Upgrade 头值(例如 websocket)。
典型场景:
当客户端发起 WebSocket 连接时,请求头会包含 Upgrade: websocket,此配置确保该头部被传递到后端。 - proxy_set_header Connection $connection_upgrade;
作用:动态设置 Connection 头,根据客户端请求决定是否保持连接升级。
关键变量:
$connection_upgrade:如果客户端请求包含 Upgrade 头,则值为 upgrade,否则为 close。
与 WebSocket 的关系:
配合 Upgrade 头,告诉后端服务器需要将连接升级为 WebSocket。 - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
作用:添加客户端真实 IP 到 X-Forwarded-For 头。
关键变量:
KaTeX parse error: Double subscript at position 12: proxy_add_x_̲forwarded_for:自…remote_addr)到现有的 X-Forwarded-For 头(如果存在)。
为什么重要:
后端服务器可以通过此头获取原始客户端的真实 IP(而不是 Nginx 的 IP)。
格式示例:X-Forwarded-For: 客户端IP, 代理1IP, 代理2IP - proxy_set_header X-Real-IP $remote_addr;
作用:将客户端真实 IP 直接传递给后端,存放到 X-Real-IP 头。
关键变量:
$remote_addr:客户端的真实 IP 地址。
与 X-Forwarded-For 的区别:
X-Real-IP 只包含最后一个直连客户端的 IP,而 X-Forwarded-For 可能包含代理链中的所有 IP。
典型使用场景
- WebSocket 代理
前 3 行(HTTP/1.1 + Upgrade + Connection)是 WebSocket 代理的必需配置,例如:
location /ws/ {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
- 传递真实客户端 IP
后 2 行(X-Forwarded-For + X-Real-IP)常用于日志记录、限速或地理定位等需要真实 IP 的场景。
总结
- WebSocket 支持:通过强制 HTTP/1.1 并传递 Upgrade 和 Connection 头。
- IP 透传:确保后端服务能获取客户端真实 IP(尤其在多层代理环境中)。
- 安全性:这些配置不会暴露敏感信息,但需确保后端服务信任这些头部(防止伪造)。