Nginx 配置Websocket代理 Nginx 代理 Websocket

WebSocket 是一种网络通信协议,它在单个 TCP 连接上提供全双工(双向)通信信道。与 HTTP 不同,WebSocket 允许服务器主动向客户端推送数据,而不需要客户端先发送请求。这使得 WebSocket 非常适用于需要实时数据交换的应用,如在线游戏、聊天应用、实时体育更新等。

WebSocket 连接通过 HTTP 协议开始,通过一种称为"升级"的机制,将 HTTP 连接升级为 WebSocket 连接。客户端发送一个包含 Upgrade: websocketConnection: Upgrade 头部的 HTTP 请求,服务器如果支持 WebSocket,则会响应一个 101 状态码(切换协议)来确认升级。

与传统 HTTP 的区别:
特性 HTTP WebSocket
通信方式 请求-响应(半双工) 双向实时通信(全双工)
连接生命周期 短连接(每次请求新建) 长连接(保持连接)
数据推送 只能客户端主动请求 服务器可主动推送数据
头部开销 每次请求都有完整头部 建立连接后头部开销小
延迟 较高(每次建立连接) 极低(保持连接)
WebSocket 工作原理:
  1. 握手阶段:客户端通过 HTTP Upgrade 请求建立连接
  2. 协议升级:服务器返回 101 Switching Protocols
  3. 数据交换:双方通过建立的连接自由发送数据

完成配置文件

bash 复制代码
# 连接升级映射(推荐)
map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

location /websocket {
    # 基本代理配置
    proxy_pass http://websocket_backend;
    proxy_http_version 1.1;
    
    # WebSocket 升级头
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    
    # 客户端信息传递
    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;
    
    # 超时设置(重要)
    proxy_read_timeout 3600s;    # 读取超时(长连接)
    proxy_send_timeout 3600s;    # 发送超时
    proxy_connect_timeout 30s;   # 连接超时
    
    # 缓冲区设置
    proxy_buffering off;         # 禁用缓冲(实时性要求高时)
    
    # 其他优化
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Port $server_port;
}
关键参数解释:
  1. map $http_upgrade $connection_upgrade
    • 用于根据客户端请求中的Upgrade头来设置Connection头。如果客户端请求升级协议,则设置Connectionupgrade,否则为close
  2. proxy_http_version 1.1
    • WebSocket代理必须使用HTTP/1.1,因为WebSocket握手基于HTTP/1.1的Upgrade机制。
  3. proxy_set_header Upgrade $http_upgrade
    • 将客户端的Upgrade头原样传递给后端服务器。
  4. proxy_set_header Connection $connection_upgrade
    • 根据map指令的结果设置Connection头,值为upgradeclose
  5. 其他代理头
    • HostX-Real-IPX-Forwarded-ForX-Forwarded-Proto等用于传递客户端信息给后端服务器。
  6. 超时设置
    • proxy_read_timeout:设置从后端服务器读取响应的超时时间,对于WebSocket长连接,需要设置得较长(如3600秒)。
    • proxy_send_timeout:设置向后端服务器发送请求的超时时间。
    • proxy_connect_timeout:设置与后端服务器建立连接的超时时间。
SSL 终止配置:
bash 复制代码
server {
    listen 443 ssl;
    server_name example.com;
    
    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;
    
    location /websocket {
        proxy_pass http://backend_ws;  # 后端使用普通 WS
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        
        # 传递 SSL 信息
        proxy_set_header X-Forwarded-Proto https;
    }
}

什么场景下使用?

  1. 实时应用:如聊天应用、实时游戏、股票行情推送、体育直播更新等。
  2. 协作工具:如在线文档编辑、远程桌面、白板等。
  3. 物联网(IoT):设备通过WebSocket与服务器保持长连接,实时上报数据和接收指令。
  4. 监控系统:实时监控服务器状态、应用性能等。

在需要实时双向通信的应用场景中,使用 Nginx 代理 WebSocket 是生产环境的最佳实践。

相关推荐
NPE~1 分钟前
自动化工具Drissonpage 保姆级教程(含xpath语法)
运维·后端·爬虫·自动化·网络爬虫·xpath·浏览器自动化
神梦流10 分钟前
GE 引擎的内存优化终局:静态生命周期分析指导下的内存分配与复用策略
linux·运维·服务器
Lsir10110_1 小时前
【Linux】进程信号(下半)
linux·运维·服务器
skywalk81631 小时前
unbound dns解析出现问题,寻求解决之道
运维·服务器·dns·unbound
酉鬼女又兒1 小时前
零基础入门Linux指南:每天一个Linux命令_pwd
linux·运维·服务器
云飞云共享云桌面1 小时前
高性能图形工作站的资源如何共享给10个SolidWorks研发设计用
linux·运维·服务器·前端·网络·数据库·人工智能
skywalk81631 小时前
走近科学:unbound dns域名服务器自己本地解析出现问题,寻求解决之道
运维·服务器·dns·unbound
袁煦丞 cpolar内网穿透实验室1 小时前
远程调试内网 Kafka 不再求运维!cpolar 内网穿透实验室第 791 个成功挑战
运维·分布式·kafka·远程工作·内网穿透·cpolar
AZ996ZA1 小时前
自学linux的第二十一天【DHCP 服务从入门到实战】
linux·运维·服务器·php
神梦流3 小时前
GE 引擎的非标准数据流处理:稀疏张量与自定义算子在图优化中的语义保持
linux·运维·服务器