Docker 容器无法从互联网访问(使用 jwilder 的 nginx+letsencrypt 解决方案)

Docker 容器无法从互联网访问(使用 jwilder 的 nginx+letsencrypt 解决方案)

我一直在使用 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 为我解决了这个问题。

相关内容