Server-Sent Events (SSE) 是一种服务器推送技术,允许服务器向浏览器推送实时数据。
与 WebSocket 相比,SSE 具有以下特点:
• 单向通信:服务器到客户端的数据推送
• 基于 HTTP 协议,配置简单
• 自动重连机制
• 适合实时通知、实时数据更新等场景
以下是一个生产环境可用的完整 Nginx 配置文件:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
multi_accept on;
use epoll;
}
http {
# 基础配置
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 日志格式定义
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 访问日志
access_log /var/log/nginx/access.log main;
# 基础优化配置
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# GZIP 压缩配置(SSE 路径下需要关闭)
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
# 上游服务器配置
upstream backend_servers {
server 127.0.0.1:8080;
server 127.0.0.1:8081 backup;
keepalive 32; # 保持连接池
}
# 服务器配置
server {
listen 80;
listen [::]:80;
server_name example.com;
# SSL 配置(如果需要)
# listen 443 ssl;
# ssl_certificate /path/to/cert.pem;
# ssl_certificate_key /path/to/key.pem;
# ssl_protocols TLSv1.2 TLSv1.3;
# 静态文件目录
root /var/www/html;
index index.html;
# 普通 API 路径
location /api/ {
proxy_pass http://backend_servers;
proxy_http_version 1.1;
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;
}
# SSE 通知流配置
location /api/notifications/stream {
proxy_pass http://backend_servers;
# SSE 必要的配置
proxy_http_version 1.1;
proxy_set_header Connection '';
proxy_buffering off;
# 关闭特定路径的 gzip
gzip off;
# 超时设置
proxy_connect_timeout 60s;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
# TCP 配置
tcp_nodelay on;
keepalive_timeout 65;
# SSE 专用头部
add_header Content-Type text/event-stream;
add_header Cache-Control no-cache;
add_header X-Accel-Buffering no;
# CORS 配置(如需要)
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
# OPTIONS 预检请求处理
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain charset=UTF-8';
add_header 'Content-Length' 0;
return 204;
}
}
# 股票实时数据端点(使用正则匹配)
location ~ ^/api/stocks/([^/]+)/live$ {
proxy_pass http://backend_servers;
# 复用 SSE 配置
include /etc/nginx/sse.conf; # 可以将通用的 SSE 配置提取到单独的文件
# 特定的日志格式
access_log /var/log/nginx/sse_access.log main;
}
# 健康检查端点
location /health {
access_log off;
return 200 'OK';
}
# 错误页面配置
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
# 包含其他配置文件
include /etc/nginx/conf.d/*.conf;
}
1. 全局配置
1. worker 配置
•
worker_processes auto
: 自动设置工作进程数•
worker_connections 1024
: 每个工作进程的最大连接数
2. 事件模块配置
•
use epoll
: 使用 epoll 事件驱动•
multi_accept on
: 允许同时接受多个连接
2. HTTP 核心配置
1. 基础优化
•
sendfile on
: 启用高效文件传输•
tcp_nopush on
: 优化数据包发送•
tcp_nodelay on
: 禁用 Nagle 算法
2. 上游服务器配置
upstream backend_servers {
server 127.0.0.1:8080;
server 127.0.0.1:8081 backup;
keepalive 32;
}
3. SSE 专用配置选项
1. 连接设置
• 长连接支持
• 禁用缓冲
• 自定义超时时间
2. 响应头设置
• SSE 内容类型
• 缓存控制
• CORS 支持