基于域名实现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
相关产品推荐
相关产品推荐

