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

请求帮助:使用Nginx Layer 4代理基于域名转发至不同后端

Nginx四层代理基于域名(SNI)转发配置方案

Nginx的四层代理(stream模块)本身仅基于IP和端口转发,无法直接识别HTTP/HTTPS请求的域名。要实现根据请求域名转发HTTPS流量,需要利用SSL握手阶段的SNI(Server Name Indication)字段,通过ssl_preread模块读取该字段来匹配转发规则。

配置前提

确保你的Nginx编译时包含以下模块(可通过nginx -V查看编译参数):

  • --with-stream:启用四层代理功能
  • --with-stream_ssl_preread_module:启用SNI读取功能

完整配置示例

stream {
    # 定义后端服务器组
    upstream backend_default {
        server 192.168.1.100:443; # 替换为你的默认后端地址
    }

    upstream backend2 {
        server 192.168.1.200:443; # 替换为目标后端地址
    }

    server {
        listen 8080;
        ssl_preread on; # 开启SNI信息读取,不终止SSL连接

        # 通过map指令匹配SNI域名,映射到对应上游
        map $ssl_preread_server_name $upstream {
            storage.googleapis.com backend2;
            google.com backend2;
            default backend_default; # 未匹配域名走默认后端
        }

        proxy_pass $upstream;
    }
}

关键配置说明

  • ssl_preread on:让Nginx在不解密SSL流量的前提下,提取握手包中的SNI域名,存储到$ssl_preread_server_name变量中。
  • map指令:建立SNI域名与上游服务器组的映射关系,精准匹配指定域名转发到backend2,其余域名走默认后端。

测试验证

使用curl通过代理发起请求,curl会自动在SSL握手时发送SNI信息:

# 匹配域名,转发到backend2
curl -x http://你的代理IP:8080 https://storage.googleapis.com
curl -x http://你的代理IP:8080 https://google.com

# 未匹配域名,走默认后端
curl -x http://你的代理IP:8080 https://example.com

注意事项

  • 该方案仅适用于HTTPS请求:HTTP请求的Host头在四层流量中无法被Nginx识别,若需处理HTTP流量,建议使用Nginx七层代理(http模块)。
  • 后端需支持透传代理:Nginx仅转发SSL流量,不会终止SSL连接,后端服务器需能正常处理来自Nginx的SSL请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 11:26:12