You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于域名实现Nginx Stream TCP连接代理转发方案问询

解决方案:分HTTP/HTTPS场景实现域名路由

场景1:客户端发送HTTP请求(非加密)

如果客户端的请求是HTTP协议,直接用Nginx的http块即可——HTTP请求自带Host头,能通过server_name直接匹配域名并转发:

http {
    # 定义后端服务器组(也可直接在proxy_pass中写地址)
    upstream backend_a {
        server 192.168.1.10;
    }
    upstream backend_b {
        server 192.168.1.11;
    }
    upstream backend_c {
        server 192.168.1.12;
    }
    upstream backend_d {
        server 192.168.1.13;
    }

    # 监听客户端的8080/8081/8082端口
    server {
        listen 8080;
        listen 8081;
        listen 8082;

        server_name a.example.com;
        location / {
            proxy_pass http://backend_a;
            # 传递必要请求头给后端
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }

    server {
        listen 8080;
        listen 8081;
        listen 8082;

        server_name b.example.com;
        location / {
            proxy_pass http://backend_b;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }

    # 复制上述server块,分别配置c.example.com和d.example.com的转发规则
}

场景2:客户端发送HTTPS请求(带SNI)

如果是HTTPS请求,需要用stream块配合ssl_preread模块解析SSL握手时的SNI(服务器名称标识)字段,再通过映射转发到对应后端:

stream {
    # 映射SNI域名到后端地址(端口根据后端实际服务调整)
    map $ssl_preread_server_name $backend {
        a.example.com 192.168.1.10:443;
        b.example.com 192.168.1.11:443;
        c.example.com 192.168.1.12:443;
        d.example.com 192.168.1.13:443;
        # 可选:配置默认转发地址
        default 127.0.0.1:80;
    }

    # 监听客户端端口,启用ssl_preread解析SNI
    server {
        listen 8080 ssl_preread;
        listen 8081 ssl_preread;
        listen 8082 ssl_preread;

        proxy_pass $backend;
    }
}

关键注意事项

  • ssl_preread模块是Nginx默认编译的,若你的Nginx没有该模块,重新编译时需添加参数:--with-stream_ssl_preread_module。
  • Nginx 1.27.0新增的stream块server_name特性,本质仍依赖SNI解析,仅对SSL/TLS连接生效,写法更简化:
    stream {
        server {
            listen 8080 ssl_preread;
            server_name a.example.com;
            proxy_pass 192.168.1.10:443;
        }
        # 为每个域名单独配置server块
    }
    
  • 若同时存在HTTP和HTTPS请求,可分别配置http和stream块,或按端口区分不同协议(比如8080走HTTP,8081走HTTPS)。

内容的提问来源于stack exchange,提问作者HadiH2o

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 18:27:21