跳至主要內容

Nginx 支持 websocket 配置

鸟书大约 2 分钟webnginxconfig 配置websocket

介绍

WebSocket 是一种在单个 TCP 连接上进行全双工通讯的协议,它在 HTTP 的基础上,提供了服务器与客户端之间通信的信道。

要在 Nginx 中配置 WebSocket 支持,需要设置 proxy_pass 来转发请求到后端服务器,并确保 Nginx 不会对 WebSocket 连接的 Upgrade 请求进行错误处理。

websocket 支持配置

首先,确保你的Nginx版本支持WebSocket。通常,这意味着你需要有HTTP/1.1持久连接的支持,这在Nginx 1.3.13及更高版本中是可用的。

在Nginx配置文件中(通常是/etc/nginx/nginx.conf),你需要修改http或server块来支持WebSocket。关键部分在于proxy_pass指令和相关的proxy_http_version、proxy_set_header指令。

这里是一个基本的示例配置,假设你的WebSocket后端服务运行在本地机器上的ws://localhost:8080:

http 块配置

http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }
}

server 块配置

server {
    listen       80;
    server_name  birdbook.com.cn;
    location /ws {
        proxy_pass http://localhost:8080/ws;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_cache_bypass $http_upgrade;
        proxy_read_timeout 86400;

        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;
    }
}

在这个配置中:

  • listen 80; 指定监听的端口

  • server_name birdbook.com.cn; 设置服务器名称,用于虚拟主机

  • location /ws 定义了处理WebSocket请求的路径

  • proxy_pass http://localhost:8080/ws; 指定后端WebSocket服务的位置

  • proxy_http_version 1.1; 确保使用HTTP/1.1,因为 WebSocket 握手依赖于 HTTP/1.1

  • proxy_set_header 指令用于传递必要的升级头部信息和其他头部

  • proxy_set_header Upgrade $http_upgrade;

  • proxy_set_header Connection "upgrade"; 这两行是 WebSocket 支持的关键,它们告诉 Nginx 将 Upgrade 和 Connection 头部原样转发给后端服务器,这样后端服务器才能识别并处理 WebSocket 升级请求。

  • proxy_cache_bypass $http_upgrade 确保不会缓存 WebSocket 连接,因为 WebSocket 通常涉及动态交互

  • proxy_no_cache $http_upgrade 另一个确保不缓存 WebSocket 数据的指令

  • proxy_read_timeout 设置 Nginx 等待后端服务器响应的超时时间。对于 WebSocket,你可能需要设置一个较长的超时时间,因为 WebSocket 连接是持久的

  • 查看更多 proxy_set_header 信息