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

如何通过Nginx Proxy Manager基于主机名转发未终止SSL的HTTP/HTTPS流量?

核心结论

Nginx Proxy Manager(NPM)的原生UI无法直接实现场景1的需求——因为UI的Streams板块仅支持全局TCP转发,不支持基于SNI的域名匹配;而常规代理配置会强制在NPM层终止SSL,不符合“不终止SSL转发到后端A”的要求。

要实现场景1,必须手动添加自定义Nginx配置,以下是具体方案:

解决方案:基于SNI的TCP转发配置

场景1需要Nginx在TCP层读取SSL握手时的SNI字段,不终止SSL直接转发流量到后端A,同时还要兼顾场景2的正常运行。

步骤1:创建自定义配置文件

在NPM的数据目录(默认是/data/nginx/custom)下新建stream.conf文件,写入以下内容:

stream {
    # 处理HTTPS流量(443端口):通过SNI匹配泛域名
    map $ssl_preread_server_name $tls_target {
        *.app.domain.tld 后端A_IP:443;
        # 其他域名如果需要转发可以在这里添加,场景2的HTTPS由NPM UI配置处理,无需在此添加
    }

    server {
        listen 443;
        proxy_pass $tls_target;
        ssl_preread on; # 关键配置:不终止SSL,仅读取SNI字段
        proxy_timeout 1d; # 保持长连接,适配后端的SSL会话
    }

    # 处理HTTP流量(80端口):区分域名转发
    map $host $http_target {
        sample.domain.tld 127.0.0.1:81; # 转发到NPM内部端口,让UI配置的场景2处理HTTP转HTTPS
        *.app.domain.tld 后端A_IP:80; # 直接转发到后端A,支持Let's Encrypt的HTTP-01挑战
    }

    server {
        listen 80;
        proxy_pass $http_target;
    }
}

步骤2:重启NPM服务

如果是Docker部署,执行命令重启NPM容器:

docker restart nginx-proxy-manager
关键说明
  • ssl_preread on是实现不终止SSL转发的核心,它让Nginx仅读取SSL握手包中的SNI信息,不对流量做解密
  • 80端口的配置要区分场景:sample.domain.tld的流量仍交给NPM UI处理(实现HTTP转HTTPS),而泛域名的流量直接转发到后端A,确保后端A能正常完成Let's Encrypt的证书申请
  • 确保后端A的80、443端口允许NPM服务器的IP访问,同时泛域名*.app.domain.tld的DNS解析指向公网IP

内容的提问来源于stack exchange,提问作者C. Hediger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 22:12:33