nginx实现多协议调度需分层配置:http/https走http块,tcp/udp走独立stream块;必须编译启用对应模块,严格区分端口与语义,websocket需透传upgrade头,grpc须走https+http/2,tcp/udp转发不解析应用层。

Nginx 本身不自动识别协议类型,也不支持单端口多协议“智能猜测”。要实现多协议流量调度,核心是按协议分层、分模块、分端口明确配置——HTTP/HTTPS 用 http 块,TCP/UDP 用独立 stream 块,各自承担对应层级的职责。
必须启用对应模块并放在正确上下文
Nginx 编译时需包含 --with-http_ssl_module(HTTPS)、--with-http_v2_module(HTTP/2)、--with-stream(TCP/UDP)等模块。若缺失,配置会直接报错,如 unknown directive "stream" 或 nginx: [emerg] "http2" directive is not allowed here。
HTTP 和 HTTPS 流量走 http 块,严格区分端口与语义
- HTTP 明文服务监听 80 端口:
不需证书,不启用 SSL,仅作反向代理或静态服务 - HTTPS 加密服务监听 443 端口:
必须带ssl http2参数,指定有效证书路径,TLS 版本限定为 v1.2+,禁用弱套件 - gRPC 必须走 HTTPS + HTTP/2:使用
grpc_pass替代proxy_pass,后端需原生支持 HTTP/2
WebSocket 需显式透传升级头并延长超时
WebSocket 建立在 HTTP Upgrade 机制上,但后续通信脱离 HTTP 生命周期。Nginx 不自动维持,需手动配置:
-
proxy_http_version 1.1; -
proxy_set_header Upgrade $http_upgrade; -
proxy_set_header Connection "upgrade"; -
proxy_read_timeout 86400;(避免空闲断连)
TCP/UDP 流量必须用 stream 块,且与 http 完全隔离
-
stream块位于nginx.conf顶层,与http、events同级 - 支持原始字节转发,不解析应用层内容
- 可结合
ssl_preread模块做 TLS 握手前识别,实现 HTTPS 与 TCP 的 443 端口分流 - 示例:MySQL 代理、Redis 负载、自定义二进制协议透传
混合协议网关需统一健康检查与路由策略
- HTTP 类服务可用
upstream内置被动健康检查(5xx、超时、拒绝连接) - TCP 类服务在
stream中通过health_check指令主动探测(如发送PING、校验响应) - 跨协议路由决策可借助
map指令,例如根据$host或$arg_protocol动态选择http或stream分发路径
不复杂但容易忽略











