502 Bad Gateway Обратный прокси-сервер Nginx

Я новичок в docker и docker-compose.

Я пытаюсь разместить несколько веб-сайтов с HTTPS на одном сервере.

Сертификаты SSL не могут быть сгенерированы, потому что locahost не является допустимым хостом, нормально.

И я получаю ошибку 502 неверного шлюза.

Кажется, что nginx-proxy не может правильно передавать поток в контейнер.

Это мой docker-compose

version: '3'

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

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

  nginx-letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: nginx-letsencrypt
    restart: unless-stopped
    volumes:
      - ./conf.d:/etc/nginx/conf.d
      - ./vhost.d:/etc/nginx/vhost.d
      - ./html:/usr/share/nginx/html
      - ./certs:/etc/nginx/certs:rw
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      NGINX_DOCKER_GEN_CONTAINER: "nginx-gen"
      NGINX_PROXY_CONTAINER: "nginx-proxy"


networks:
  webproxy:
    external: true

На уровне веб-сайта у меня есть следующий docker-compose, где я запускаю два контейнера, php-fpm (включая мои файлы wordpress) и контейнер nginx. Я использую этот контейнер nginx для добавления собственных файлов конфигурации nginx.

version: '3.1'

services:

  php:
    build: ./docker/php/
    restart: unless-stopped
    volumes:
       - wordpress:/var/www/html

  nginx:
    image: nginx:1-alpine
    restart: unless-stopped
    expose:
      - 80
      - 443
    volumes:
      - wordpress:/var/www/html
      - ./docker/nginx/site.conf:/etc/nginx/conf.d/default.conf
      - ./docker/nginx/wordpress.conf:/etc/nginx/wordpress.conf
    environment:
     - LETSENCRYPT_HOST=
     - VIRTUAL_HOST=localhost
     - VIRTUAL_PORT=80

volumes:
  wordpress: {}


networks:
  default:
    external:
      name: webproxy

Это сгенерированный /etc/nginx/conf.d/default.conf в контейнере nginx-proxy

# localhost
upstream localhost {
                # Cannot connect to network of this container
                server 127.0.0.1 down;
}
server {
    server_name localhost;
    listen 80 ;
    access_log /var/log/nginx/access.log vhost;
    return 301 https://$host$request_uri;
}
server {
    server_name localhost;
    listen 443 ssl http2 ;
    access_log /var/log/nginx/access.log vhost;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:!DSS';
    ssl_prefer_server_ciphers on;
    ssl_session_timeout 5m;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;
    ssl_certificate /etc/nginx/certs/localhost.crt;
    ssl_certificate_key /etc/nginx/certs/localhost.key;
    ssl_dhparam /etc/nginx/certs/localhost.dhparam.pem;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/nginx/certs/localhost.chain.pem;
    add_header Strict-Transport-Security "max-age=31536000" always;
    include /etc/nginx/vhost.d/default;
    location / {
        proxy_pass http://localhost;
    }

И логи nginx-proxy

nginx-proxy          | localhost 172.22.0.1 - - [10/May/2018:17:52:40 +0000] "GET / HTTP/2.0" 502 173 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0"
nginx-proxy          | 2018/05/10 17:54:47 [error] 7#7: *4 no live upstreams while connecting to upstream, client: 172.22.0.1, server: localhost, request: "GET / HTTP/2.0", upstream: "http://localhost/", host: "localhost"

Поскольку я впервые опубликовал, я добавил VIRTUAL_PORT = 80, но это не помогло.

Я также пытался напрямую проксировать контейнер php, но безуспешно.

docker inspect на контейнере nginx с проксированием показывает

"Config": {
            "Hostname": "4859d3794982",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "443/tcp": {},
                "80/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "VIRTUAL_PORT=80",
                "LETSENCRYPT_HOST=localhost",
                "VIRTUAL_HOST=localhost",
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "NGINX_VERSION=1.13.1"
            ],

"Networks": {
                "webproxy": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": [
                        "nginx",
                        "4859d3794982"
                    ],
                    "NetworkID": "6ac6af1b951c780c1334c55862025bd7916643dd13dc02976f2ed176a7ed7619",
                    "EndpointID": "3e379cd7a020e65f5ea6db8dbafe144d5b6ad5575b183dee64487f7046f0e3a2",
                    "Gateway": "172.23.0.1",
                    "IPAddress": "172.23.0.5",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:17:00:05",
                    "DriverOpts": null

person Bigbenny    schedule 10.05.2018    source источник
comment
В контейнере nginx вы получите доступ к процессу php по адресу php, а не localhost. Я ОЧЕНЬ не понимаю, чего вы пытаетесь достичь :)   -  person Paul Becotte    schedule 11.05.2018
comment
Пол, спасибо за ответ.   -  person Bigbenny    schedule 11.05.2018
comment
Я пытаюсь достичь ссылка. На уровне веб-сайта я монтирую свой исходный код wordpress в php-контейнере / var / www / html, используя именованный том wordpress. Затем я монтирую том имени в контейнере nginx. VIRTUAL_HOST используется контейнером nginx-proxy.   -  person Bigbenny    schedule 11.05.2018


Ответы (1)


Я думаю, что ваша команда сети неверна в первом файле создания

networks:
  webproxy:
    external: true

Это определяет сеть с именем webproxy, которая должна существовать. (Предположительно вы это создали?). Однако вы не подключаете к этой сети никакие контейнеры.

Другой файл набора имеет

networks:
  default:
    external:
      name: webproxy

Что делает то же самое, за исключением того, что все контейнеры автоматически подключаются к default сети. Таким образом, сопоставление первого файла может прояснить вашу проблему (хотя я не изучал, что делает этот волшебный генератор конфигурации nginx;))

person Paul Becotte    schedule 11.05.2018
comment
Пол, ты спас меня. Я неправильно понял линии сети. Спасибо. Теперь у меня в обоих файлах docker-compose networks: default: external: name: webproxy - person Bigbenny; 11.05.2018