我一直在使用 jwilder 的 nginx + letsencrypt 解决方案在线访问我的容器。
上周我的服务器崩溃了,重启后,我无法从互联网访问我的任何容器。从 LAN 访问它们没问题,但当我使用网址时,我收到“拒绝连接”错误(我使用我拥有的域的 DDNS)。
检查日志时,我立即在 letsencrypt 日志中看到错误,例如::验证错误:: 获取 http:///.well-known/acme-challenge/oSGmRMyB-df4XEN3ZW-8ksBvtxxO8m2Di50mhpWWuu8:连接被拒绝
我已经仔细检查了路由器上的端口转发,一切似乎都正常。我甚至可以使用端口 22 通过 SSH 进入我的机器,只是为了验证端口转发是否正常工作。
我还检查了 UFW 状态,认为我的服务器上的防火墙存在问题,并且 UFW 也处于非活动状态。
关于如何进一步调试这个问题,有什么建议吗?
编辑:我在服务器的本地 IP 上执行了 nmap。我可以看到所有容器端口都已打开,但 nginx 端口 80 和 443 已关闭。我现在不知道如何确保 nginx docker 容器可以打开此端口。这是我的 docker-compose:
services:
nginx:
image: jwilder/nginx-proxy:latest
container_name: nginx
restart: always
labels:
com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy: 'true'
ports:
- 80:80
- 443:443
volumes:
- ./data//htpasswd:/etc/nginx/htpasswd
- ./data/certs:/etc/nginx/certs:ro
- ./data/conf.d:/etc/nginx/conf.d
- ./data/vhost.d:/etc/nginx/vhost.d
- ./data/html:/usr/share/nginx/html
- /var/run/docker.sock:/tmp/docker.sock:ro
networks:
- proxy
letsencrypt:
image: jrcs/letsencrypt-nginx-proxy-companion:latest
container_name: letsencrypt_multi
restart: always
volumes:
- ./data/vhost.d:/etc/nginx/vhost.d
- ./data/certs:/etc/nginx/certs:rw
- ./data/html:/usr/share/nginx/html
- /var/run/docker.sock:/var/run/docker.sock:ro
depends_on:
- nginx
networks:
- proxy
networks:
proxy:
driver: bridge
答案1
如果其他人也遇到这个问题,我找到了解决方案。
在我通过 nginx 反向代理公开的某个容器中,我注释掉了“VIRTUAL_HOST”环境变量,以停止对容器的互联网访问。但是,我忘记注释掉“VIRTUAL_PORT”,这导致 nginx 的 default.conf 出现错误。当我重新启动 nginx 时,我收到了 default.conf 的解析错误
invalid number of arguments in "upstream" directive
有问题的条目指向具有上述错误配置的容器,修复该问题并重新启动容器,随后 nginx 为我解决了这个问题。