0

请协助。

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

但由于某种原因,两个应用程序都返回错误 502 Bad Gateway

以下错误是我运行时看到的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

请协助

4

3 回答 3

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

另外,我的另一个问题是 ghost 默认使用的端口,2368所以我必须将其绑定到使用端口 80。所以我的解决方案不是在 ghost 上暴露端口 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 ) 在同一个代理下工作

于 2019-06-05T14:46:15.447 回答
0

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

于 2021-07-01T01:04:46.400 回答
0

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

  ghost:
    networks:
      - nginx-proxy
    ...

还将新网络分配给 nginx

  nginx:
    networks:
      - nginx-proxy
    ...

还要像这样放置网络配置:

networks:
  nginx-proxy:
    external: true
  default:

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

我建议你升级到 Træfik 或 envoy。Nginx 在可扩展性方面是有限的,除非你付费。

于 2019-05-29T21:56:08.413 回答