通过 Jwilder 的 Nginx 代理访问虚拟主机时出现 502 Bad Gateway

502 Bad Gateway when accessing virtual host via Jwilder's Nginx proxy

我在同一台主机上有一个 Nginx 代理(Jwilder,默认配置)和 Gitlab 实例 运行。 git.myhost.com 指向主机IP。 当使用下面的 docker-compose.yml 启动 Gitlab 时,我在访问 http://git.myhost.com.

时得到 502 Bad Gateway

在 nginx-proxy 容器中生成的 /etc/nginx/conf.d/default.conf 看起来也不错:

upstream git.myhost.com {
                # 2ab9168d-c69e-4725-8c20-31a194ad8d07
                server 172.17.0.13 vhost;
}
server {
        server_name git.myhost.com;
        listen 80 ;
        access_log /var/log/nginx/access.log vhost;
        location / {
                proxy_pass http://git.myhost.com;
        }
}

我做错了什么?

这是 Gitlab 的 docker-compose.yml:

gitlab-server:
  hostname: git.myhost.com
  expose:
  - "8100"
  ports:
  - 8101:22/tcp
#  - 8100:8100/tcp
  labels:
    io.rancher.sidekicks: gitlab-data
  environment:
    GITLAB_OMNIBUS_CONFIG: |
      external_url 'http://git.myhost.com'
      gitlab_rails['gitlab_shell_ssh_port'] = 8101
    VIRTUAL_HOST: git.myhost.com
    VIRTUAL_PORT: 8100
  image: gitlab/gitlab-ce:latest
  volumes_from:
  - gitlab-data

gitlab-data:
  labels:
    io.rancher.container.start_once: 'true'
  entrypoint:
  - /bin/true
  hostname: gitdata
  image: gitlab/gitlab-ce:latest
  volumes:
  - /etc/gitlab:/etc/gitlab
  - /var/log/gitlab:/var/log/gitlab
  - /var/opt/gitlab:/var/opt/gitlab

您应该如下更改 nginx:

upstream gitlab {
                # 2ab9168d-c69e-4725-8c20-31a194ad8d07
                server 172.17.0.13:8100;
}
server {
        server_name git.myhost.com;
        listen 80 ;
        access_log /var/log/nginx/access.log vhost;
        location / {
                proxy_pass http://gitlab;
        }
}

172.17.0.13是gitlabdocker容器的一个ip地址。

可能导致此问题的一个常见问题是 运行在 nginx-proxy 网络之外设置容器,nginx-proxy 最终无法访问该容器。

为了运行它和nginx-proxy处于同一个网络,首先需要弄清楚nginx-proxy是运行ning在哪个网络。只需运行以下命令即可找出:

docker network ls -f driver=bridge --format "{{.ID}}" | xargs docker network inspect | grep Name

它应该给你这样的东西:

    "Name": "bridge",
            "Name": "influxdb",
            "Name": "mariadb",
    "Name": "http_proxy",
            "Name": "web-app",
            "Name": "proxy",
            "Name": "grafana",

现在我可以看到名为 proxy 的容器位于名为 http_proxy 的网络下。 我所要做的就是通过添加标志 --network http_proxy(将 http_proxy 替换为您的网络名称)来 运行 该网络中的新容器:

docker run -d --name test --network http_proxy -h test.local -e VIRTUAL_HOST=test.local -v "$PWD":/usr/share/nginx/html nginx

希望这对您有所帮助。 祝你好运!