部署的Docker-Compose返回“ 502 Bad Gateway”

时间:2019-05-29 21:39:33

标签: docker nginx docker-compose bad-gateway

请协助。

我发现了一篇博客文章https://blog.ssdnodes.com/blog/host-multiple-ssl-websites-docker-nginx/),内容涉及部署多个具有相同nginx-proxy但名称不同的VIRTUAL_HOST的docker-compose应用程序

但是由于某些原因,两个应用程序都返回错误502错误网关

以下错误是我运行docker-compose logs nginx

时看到的错误

2019/05/29 20:52:26 [error] 8#8: *15 connect() failed (111: Connection refused) while connecting to upstream, client: 52.209.30.187, server: gregsithole.com, request: "GET / HTTP/1.1", upstream: "http://172.20.0.5:80/", host: "gregsithole.com"

我相信upstream使用的是内部docker网络IP,因为这不是我的服务器的IP。我的上游取决于以下文件:https://raw.githubusercontent.com/jwilder/nginx-proxy/master/nginx.tmpl

但是我对它的工作方式不太熟悉。

以下是我的docker-compose文件的示例:

nginx-proxy / docker-compose.yaml

version: "3.6"
services:
  nginx:
    image: nginx
    container_name: nginx-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - conf:/etc/nginx/conf.d
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - certs:/etc/nginx/certs
    labels:
      - "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy=true"

  dockergen:
    image: jwilder/docker-gen
    container_name: nginx-proxy-gen
    restart: always
    depends_on:
      - nginx
    command: -notify-sighup nginx-proxy -watch -wait 5s:30s /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf
    volumes:
      - conf:/etc/nginx/conf.d
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - certs:/etc/nginx/certs
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./nginx.tmpl:/etc/docker-gen/templates/nginx.tmpl:ro

  letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: nginx-proxy-le
    restart: always
    depends_on:
      - nginx
      - dockergen
    environment:
      NGINX_PROXY_CONTAINER: nginx-proxy
      NGINX_DOCKER_GEN_CONTAINER: nginx-proxy-gen
    volumes:
      - conf:/etc/nginx/conf.d
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - certs:/etc/nginx/certs
      - /var/run/docker.sock:/var/run/docker.sock:ro

volumes:
  conf:
  vhost:
  html:
  certs:

networks:
  default:
    external:
      name: nginx-proxy

dockerized-ghost / docker-compose.yaml

version: "3.6"
services:

  ghost:
    image: ghost
    restart: always
    expose:
      - 80
    volumes:
      - ../../ghost:/var/lib/ghost/content
    environment:
      NODE_ENV: production
      url: https://blog.gregsithole.com
      VIRTUAL_HOST: blog.gregsithole.com
      LETSENCRYPT_HOST: blog.gregsithole.com
      LETSENCRYPT_EMAIL: hidden-email

networks:
  default:
    external:
      name: nginx-proxy

请协助

3 个答案:

答案 0 :(得分:0)

您应将网络nginx-proxy分配给服务鬼:

  ghost:
    networks:
      - nginx-proxy
    ...

还要将新作品分配给nginx

  nginx:
    networks:
      - nginx-proxy
    ...

也将网络配置如下:

networks:
  nginx-proxy:
    external: true
  default:

这就是您所需要的。请记住,在docker compose文件中,您必须将网络声明为外部,但这还不够。您还已将其分别分配给要成为网络一部分的每个服务。

我建议您升级到Træfik或特使。 Nginx在可伸缩性方面受到限制,除非您为此付费。

答案 1 :(得分:0)

花了数天时间在这个问题上尝试各种解决方案。多次更新我的仓库。我设法解决了。

我使用的博客文章早在2017年就已过时,在同一博客上,我找到了最新的文章(https://blog.ssdnodes.com/blog/host-multiple-websites-docker-nginx/),该文章在检查差异时发现了我的nginx-proxy使用了nginx,'jwilder / docker-gen'和jrcs/letsencrypt-nginx-proxy-companion

最新文章仅使用jwilder/nginx-proxy,但我对其进行了修改,使其也包含jrcs/letsencrypt-nginx-proxy-companion,请参见下面的解决方案:

version: "3.6"
services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - conf:/etc/nginx/conf.d
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - dhparam:/etc/nginx/dhparam
      - certs:/etc/nginx/certs:ro
      - /var/run/docker.sock:/tmp/docker.sock:ro

  letsencrypt-nginx-proxy-companion:
    image: jrcs/letsencrypt-nginx-proxy-companion
    environment:
      NGINX_PROXY_CONTAINER: nginx-proxy
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - certs:/etc/nginx/certs

volumes:
  conf:
  vhost:
  html:
  dhparam:
  certs:

networks:
  default:
    external:
      name: nginx-proxy

另外,我的另一个问题是,幽灵默认使用的端口为2368,因此我必须将其绑定为使用端口80。因此,我的解决方案不是在幽灵上暴露端口80 ,我创建了一个nginx服务,该服务公开了端口80。

以下是我的幽灵设置:

version: "3.6"
services:

  ghost:
    image: ghost
    restart: always
    volumes:
      - ../../ghost:/var/lib/ghost/content
    environment:
      - VIRTUAL_HOST=blog.domain.com
      - LETSENCRYPT_HOST=blog.domain.com
      - LETSENCRYPT_EMAIL=name@domain.com
      - NODE_ENV=production
      - url=https://blog.domain.com

  nginx:
    image: nginx
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
    expose:
      - 80
    depends_on:
      - ghost
    links:
      - ghost

networks:
  default:
    external:
      name: nginx-proxy

因此,我能够使我的网站(https://gregsithole.com)和博客(https://blog.gregsithole.com)在同一个代理下工作

答案 2 :(得分:0)

我能够使用 Greg 的答案来解决这个问题,只需进行一个调整:我没有向 ghost docker-compose.yml 文件添加 nginx 服务,而是添加了 VIRTUAL_PORT=2368 并且终于开始了我的工作.