Nginx 代理 WebSocket 、TCP协议

Nginx 代理 WebSocket

什么是 WebSocket
WebSocket 是一种网络传输协议,可在单个 TCP 连接上进行全双工通信,位于 OSI 模型的应用层。WebSocket 中的握手和 HTTP 中的握手过程兼容,且可以使用 HTTP 中的 Upgrade 协议头将连接从 HTTP 升级到 WebSocket。

代理结构
WebSocket 可以工作在 80/443 端口,并且使用 ws:// 或 wss:// 标记协议类型。可以 nginx 代理 WebSocket,实现从 HTTP/1.1 到 Websocket 转化,结构图如下:

Client HTTPS <--wss--> Nginx Websocket Proxy <-- ws --> App Server

WebSocket 代理配置:  放置于http 模块之内
PS: 该方法也可用于对 Kubernetes API 的代理。

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

server {
...

  location /chat/ {
    proxy_pass http://192.168.100.18:9663;
    proxy_http_version 1.1;
    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;
    }
  }
}

说明:
关键部分是在 HTTP 的请求中添加了如下 header,将协议从 HTTP1.1 升级到 WebSocket:

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;

# 响应
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade

=======================================================================

nginx tcp 反向代理:stream和http是在同一级别上
列子1:
stream {
  upstream cloudsocket {
    hash $remote_addr consistent;
    # $binary_remote_addr;
    server 192.168.182.155:3306 weight=5 max_fails=3 fail_timeout=30s;
  }
  server {
    listen 3306; #数据库服务器监听端口
    proxy_connect_timeout 10s;
    proxy_timeout 300s; #设置客户端和代理服务之间的超时时间,如果5分钟内没操作将自动断开。
    proxy_pass cloudsocket;
    }

  }

例子2:
stream {
  upstream socket_proxy {
    hash $remote_addr consistent;
    server 192.168.96.128:22 weight=5 max_fails=3 fail_timeout=300s;
  }
  server {
    listen 22;
    proxy_connect_timeout 100s;
    proxy_timeout 300s;
    proxy_pass socket_proxy;
    }
  }

 

列子3:

stream{
  upstream tcpstream{
    hash $remote_addr consistent;
    server 127.0.0.1:8088 max_fails=3 fail_timeout=10s;
    }
  server{
    listen 80;
    proxy_connect_timeout 20s;
    proxy_timeout 5m;
    proxy_pass tcpstream;
    }
  }

posted @   walkersss  阅读(1526)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· DeepSeek “源神”启动!「GitHub 热点速览」
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
点击右上角即可分享
微信分享提示