Nginx 如何配置 WebSocket 代理?

推荐答案

-- -------------------- ---- -------
---- -
    --- ------------- ------------------- -
        ------- --------
        --      ------
    -

    ------ -
        ------ ---
        ----------- ------------

        -------- ---- -
            ---------- ----------------------
            ------------------ ----
            ---------------- ------- --------------
            ---------------- ---------- --------------------
            ---------------- ---- ------
            ---------------- --------- -------------
            ---------------- --------------- ---------------------------
            ---------------- ----------------- --------
        -
    -
-

本题详细解读

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 请求,并保持与客户端和后端服务器的实时通信。

纠错
反馈