Docker部署NGINX Proxy Manager无法使用子域名求助
我在Docker中部署了NGINX Reverse Proxy Manager,拥有一个DynDNS地址,通过该地址可正常访问NGINX Proxy Manager默认页面,使用主DynDNS域名通过代理管理器连接端口也能正常工作(含SSL配置)。但尝试使用subdomain1.laptopsimon.net这类子域名时,既无法创建SSL证书,也无法通过HTTP访问对应服务。
日志中出现Let's Encrypt错误:
[12/25/2022] [1:50:45 PM] [SSL ] › ℹ info Requesting Let'sEncrypt certificates for Cert #9: subdomain1.laptopsimon.ddns.net
[12/25/2022] [1:50:45 PM] [SSL ] › ℹ info Command: certbot certonly --config "/etc/letsencrypt.ini" --cert-name "npm-9" --agree-tos --authenticator webroot --email "simon.hauber@outlook.de" --preferred-challenges "dns,http" --domains "subdomain1.laptopsimon.ddns.net"
[12/25/2022] [1:50:49 PM] [Nginx ] › ℹ info Reloading Nginx
[12/25/2022] [1:50:49 PM] [Express ] › ⚠ warning Command failed: certbot certonly --config "/etc/letsencrypt.ini" --cert-name "npm-9" --agree-tos --authenticator webroot --email "simon.hauber@outlook.de" --preferred-challenges "dns,http" --domains "subdomain1.laptopsimon.ddns.net"
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Some challenges have failed.
Ask for help or search for solutions at https://community.letsencrypt.org. See the logfile /var/log/letsencrypt/letsencrypt.log or re-run Certbot with -v for more details.
1. 子域名DNS解析验证
- 确认
subdomain1.laptopsimon.net的DNS记录已正确指向你的公网IP(需和主DynDNS域名的IP一致)。 - 使用
nslookup subdomain1.laptopsimon.net或dig subdomain1.laptopsimon.net工具检查解析结果,确保全球范围内能正确解析,避免DNS缓存导致的延迟问题。
2. 端口与防火墙配置检查
- 路由器端口转发:确保80(HTTP)和443(HTTPS)端口已正确转发到NGINX Proxy Manager容器所在的服务器IP,且规则对所有子域名生效。
- 本地防火墙与安全组:确认服务器的防火墙(如ufw、iptables)以及云服务商安全组(若有)已开放80、443端口,未限制子域名的流量。
3. Let's Encrypt验证方式调整
- Webroot验证排查:确保NGINX Proxy Manager的webroot路径配置正确,子域名的
/.well-known/acme-challenge/路径能被外部正常访问。 - 切换DNS验证:如果webroot验证持续失败,可在DynDNS服务商处配置API密钥,让NGINX Proxy Manager自动添加DNS验证记录,这种方式不受端口转发限制,更适配动态IP场景。
4. NGINX Proxy Manager配置检查
- 子域名代理主机配置:确认目标服务的IP、端口填写正确,无错误的路径重写或访问规则。
- 先测试HTTP访问:暂时关闭SSL强制,验证子域名的基础代理是否正常,再逐步排查SSL证书问题。
5. 详细日志排查
- 登录Docker容器查看完整的Let's Encrypt日志:执行
docker exec -it <你的NPM容器ID> cat /var/log/letsencrypt/letsencrypt.log,获取具体的失败原因(如解析超时、验证文件无法访问等),针对性解决问题。
内容的提问来源于stack exchange,提问作者Ichhaudich007

