请求帮助:使用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
相关产品推荐
相关产品推荐

