Nginx Proxy Manager配置指定域名流量无代理转发至内部IPv4地址
Nginx Proxy Manager配置指定域名流量无代理转发至内部IPv4地址
嘿,我完全get到你的需求了——就是想让Nginx Proxy Manager(NPM)把newhost.example.com的HTTP和HTTPS流量原封不动甩给内部的IPv4地址,而且这个域名得自己管证书,不用NPM插手SSL那事儿对吧?其实NPM底层就是原生Nginx,咱们直接用Nginx的原生能力就能搞定,毕竟它支持基于SNI的TCP转发,咱们把这个功能套到NPM里就行。
一、先搞定HTTP(80端口)的转发
HTTP是明文传输,咱们直接用NPM的常规Proxy Host就能实现无修改转发:
- 登录NPM后台,点「Add Proxy Host」
- 填基础信息:
- Domain Names:
newhost.example.com - Forward Hostname/IP:换成你的内部IPv4(比如
192.168.1.100) - Forward Port:填后端服务的HTTP端口,一般是80
- Domain Names:
- 切到「Advanced」标签,加下面这段配置,保证请求头原样传给后端(避免NPM瞎改请求内容):
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://192.168.1.100:80; # 记得替换成你的实际地址和端口
- 保存配置就行,这样HTTP流量就直接转发到后端,完全不经过NPM的SSL处理。
二、再处理HTTPS(443端口)的SSL直通转发
HTTPS得保留完整的SSL连接,让后端自己处理证书,这时候得用到Nginx的ssl_preread功能来识别SNI域名,再做TCP层面的转发。不过这里要注意端口冲突的问题,我一步一步说:
1. 先调整NPM自身的监听端口(避免冲突)
因为NPM默认会用HTTP块监听443端口,直接加Stream的443监听会报错,所以先改NPM的监听端口:
- 登录NPM后台,点左侧「Settings」→「Custom Nginx Configuration」
- 在全局配置里添加这段,把NPM原来的443监听改成4430(或者其他没被占用的端口):
http { server { listen 4430 ssl; listen [::]:4430 ssl; # 这里不用改其他内容,NPM会自动填充原来的SSL和代理配置 } }
2. 添加Stream配置实现SNI转发
接着在同一个自定义配置页面,继续添加下面的内容:
# 定义SNI域名和后端地址的映射 map $ssl_preread_server_name $backend_target { newhost.example.com 192.168.1.100:443; # 替换成你的后端IPv4和HTTPS端口 default 127.0.0.1:4430; # 其他域名的流量转发回NPM的新端口处理 } # 配置TCP Stream监听443端口 stream { server { listen 443; listen [::]:443; ssl_preread on; # 开启SNI识别,这样才能拿到请求的域名 proxy_pass $backend_target; proxy_timeout 30s; # 超时时间可以根据需求调整 proxy_connect_timeout 5s; } }
- 保存配置后,NPM会自动重载Nginx。这时候所有发往
newhost.example.com的HTTPS流量都会被直接转发到后端服务器,由后端自己处理证书和SSL握手,NPM只是做个“流量搬运工”,完全不碰SSL连接。
最后再提个小注意
- 确保后端服务器的80和443端口能正常接收来自NPM服务器的流量,防火墙别拦着
- 如果后端用的是非标准端口,记得把配置里的端口号改成对应的数值
备注:内容来源于stack exchange,提问作者Neurofibromin




