Nginx SSE 完整配置说明

文摘   2024-11-10 10:00   湖北  

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. 1. worker 配置

  • • worker_processes auto: 自动设置工作进程数

  • • worker_connections 1024: 每个工作进程的最大连接数

  • 2. 事件模块配置

    • • use epoll: 使用 epoll 事件驱动

    • • multi_accept on: 允许同时接受多个连接

    2. HTTP 核心配置

    1. 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. 1. 连接设置

    • • 长连接支持

    • • 禁用缓冲

    • • 自定义超时时间

  • 2. 响应头设置

    • • SSE 内容类型

    • • 缓存控制

    • • CORS 支持




    字节笔记本
    专注于科技领域的分享,AIGC,全栈开发,产品运营
     最新文章