Nginx配置反向代理处理SSE请求

作者:じ☆ve不哭

发布时间:2023-10-27T15:07:56

在项目中使用SSE向前台推送数据,发现本地没问题,但是服务器连接SSE接口出现超时不能请求问题。排查后发现是Nginx的问题。

配置

# 反向代理配置
server {
    listen       80;
    server_name  xx.xx.xx.xx;
    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 REMOTE-HOST $remote_addr;
    proxy_set_header HTTP_AUTHORIZATION $http_authorization;

    # SSE 连接时的超时时间
    proxy_read_timeout 1800s;

    # 取消缓冲
    proxy_buffering off;

    # 关闭代理缓存
    proxy_cache off;

    # 禁用分块传输编码
    #chunked_transfer_encoding off

    location ^~ /api/ {
        proxy_pass  http://localhost:82/;

    }

    location ^~ /dev/file/download/ {
        proxy_pass  http://localhost:82;
    }


    location / {
        root   /home/xxxxx/xxxx-admin-web;
        index index.html index.htm;
        try_files $uri $uri/ /index.html;
    }
}

参数说明

  • proxy_set_header设置一些必要的头部信息,如连接方式、真实客户端IP等。
  • proxy_read_timeout 指令来设置 SSE 连接的超时时间。默认情况下,Nginx 会在 60 秒后关闭空闲的连接,这对于 SSE 来说是不合适的,所以我们将超时时间设置为一天(86400 秒)。这样,客户端和服务器之间的连接可以持续保持打开状态。
  • proxy_buffering off 指令来确保数据可以实时传输,而不需要等待缓冲区满。在SSE请求中禁用缓冲,以便正确处理SSE流式数据。
  • proxy_cache 对于 SSE(Server-Sent Events)连接,通常不建议启用 Nginx 的代理缓存(proxy_cache)。因为 SSE 是一种长连接技术,它通过保持持久连接来实时推送数据给客户端,而代理缓存会将响应数据缓存起来并在后续请求中返回缓存的响应,这与 SSE 的工作方式相违背。如果启用代理缓存,Nginx 可能会缓存 SSE 的数据,并在后续的连接中返回相同的缓存数据,这样会导致客户端收到重复的消息,破坏了 SSE 的实时性和准确性。
  • chunked_transfer_encoding 参数可以根据你的需求决定是否关闭。在 SSE 中,通常不需要禁用分块传输编码,因为它允许将数据以数据块的形式逐步传输,与 SSE 的流式数据特性相符合。
  • proxy_pass 指令正确反向代理到你的 SSE 应用程序的地址和端口,以使连接正确工作。

验证

cd /usr/local/nginx
# 验证nginx.conf配置是否正确
./sbin/nginx -t
# 重启nginx
./sbin/nginx -s reload