Nginx 配置 SSE 和 WebSocket 转发
一、配置背景(火狐游览器不支持,建议谷歌游览器开发测试)
在使用 Django 框架开发 Web 应用时,为了实现实时通信,可以选择使用以下两种技术:
- SSE (Server-Sent Events): 适用于服务器向客户端推送单向数据流。
- WebSocket: 适用于双向通信场景。
为了将 SSE 和 WebSocket 的请求正确转发到后端服务,Nginx 需要根据特定的请求路径进行配置。
二、Nginx 配置示例
(一)基础配置(这是在一个文件内容)
- 定义变量用于处理 WebSocket 的 Upgrade 和 Connection 请求头:
map $http_upgrade $connection_upgrade {default upgrade;'' close;
}
- 服务器配置:
server {listen 80;server_name 192.168.1.9;# 处理静态文件的路径location /static/ {alias /home/lan/backHub/PopSubBack/PopSubBack/staticfiles/;}# 正常的接口请求转发到 后端location / {proxy_pass http://127.0.0.1:8000; # 转发到后端proxy_set_header Host $http_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;}# 转发 SSE 请求location ~ ^/sse/ { # 匹配以 /sse/ 开头的路径proxy_pass http://127.0.0.1:8000; # 转发到ASGI 后端服务proxy_http_version 1.1;proxy_set_header Connection '';proxy_buffering off; # 禁用缓冲,确保实时性proxy_read_timeout 3600s; # 设置超时时间}# 转发 WebSocket 请求location ^~ /ws/ {proxy_pass http://127.0.0.1:8000; # 转发到 ASGI 服务器# 保证连接不会超时proxy_read_timeout 300s;proxy_send_timeout 300s;# 转发 WebSocket 请求头proxy_set_header Host $http_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;# WebSocket 特有配置proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection $connection_upgrade;# 可选: 传递 Authorization 头部,如果需要身份验证proxy_set_header Authorization $http_authorization;}
}
- 打开并编辑 Nginx 配置文件:
sudo nano /etc/nginx/sites-available/your_site_name
然后通过创建符号链接,将配置文件从 sites-available 启用到 sites-enabled 目录:
三、配置说明
(一)SSE 配置
-
路径匹配:
- 使用
location ~ ^/sse/
匹配所有以/sse/
开头的路径。
- 使用
-
实时性优化:
proxy_buffering off
: 禁用缓冲,确保数据流能及时推送到客户端。proxy_read_timeout 3600s
: 设置长时间超时,避免连接因长时间无活动而被关闭。
-
HTTP 版本:
- 强制使用 HTTP 1.1,以支持持久连接。
(二)WebSocket 配置
-
路径匹配:
- 使用
location ^~ /ws/
匹配所有以/ws/
开头的路径。
- 使用
-
升级请求:
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
- 确保请求头包含
Upgrade
和Connection
字段,以支持 WebSocket 协议。
-
超时设置:
proxy_read_timeout
和proxy_send_timeout
设置为 300 秒,防止因无活动而断开连接。
-
HTTP 版本:
- 强制使用 HTTP 1.1,以支持 WebSocket 的双向通信。
四、总结
通过上述配置,Nginx 能够:
- 根据请求路径匹配规则,将普通 HTTP 请求、SSE 请求和 WebSocket 请求分别转发到对应的后端服务。
- 为 SSE 和 WebSocket 提供必要的配置,确保连接的稳定性和实时性。
在实际部署中,可以根据服务需求进一步调整参数,例如路径规则、超时时间和认证机制。