Докер восходящего сервера прокси-сервера Nginx составляет - отказано в 502 неверных подключениях к шлюзу

Я пытаюсь контейнировать все вещи, связанные с моим веб-приложением, используя Docker Compose, включая сертификаты Nginx и SSL. Для этого я использую образ прокси-сервера Nginx из JWilder и компаньона LetsEncrypt, но у меня возникают проблемы с работой прокси-сервера nginx, в результате получается:

Nginx 502 Bad Gateway

[ошибка] 31160#0: *35 Ошибка подключения () (111: соединение отклонено) при подключении к восходящему потоку, клиент: xx.xx.xx.xx, сервер: domain.com, запрос: "GET /dev/ HTTP/1.1", upstream: "webapp://127.0.0.1:8080", хост: "domain.com"

Это происходило только при попытке настроить прокси-сервер Nginx и SSL-сертификаты, поэтому я знаю, что это проблема конфигурации одного или обоих этих контейнеров. Если кто-то может определить, где я иду не так, я был бы очень благодарен!

Вот эти контейнеры:

version: '3.1'

networks:
  mywebapp:

services:
  nginx-proxy:
    container_name: nginx-proxy
    build: ./env/nginx-proxy
    networks:
      - mywebapp
    ports:
      - 80:80
      - 443:443
    env_file:
      - ./env/nginx-proxy/.env
    depends_on:
      - webapp
    tty: true
    volumes:
      - ./src:/home/www/mywebapp/src
      - ./storage:/home/www/storage/mywebapp
      - ./data/nginx-proxy/logs:/var/log/nginx
      - ./env/nginx-proxy/webserver/nginx.conf:/etc/nginx/nginx.conf
      - ./env/nginx-proxy/webserver/conf.d:/etc/nginx/conf.d
      - ./env/nginx-proxy/webserver/vhost.d:/etc/nginx/vhost.d
      - ./env/nginx-proxy/webserver/defaults:/etc/nginx/defaults
      - ./env/nginx-proxy/webserver/global:/etc/nginx/global
      - ./env/nginx-proxy/ssl/certs:/etc/nginx/certs
      - ./env/nginx-proxy/share:/usr/share/nginx/html
      - /var/run/docker.sock:/tmp/docker.sock:ro
    labels:
      com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy: "true"

  letsencrypt:
    restart: always
    container_name: letsencrypt
    image: jrcs/letsencrypt-nginx-proxy-companion
    env_file:
      - ./env/letsencrypt/.env
    volumes:
      - ./data/letsencrypt/logs:/var/log
      - ./env/nginx-proxy/webserver/nginx.conf:/etc/nginx/nginx.conf
      - ./env/nginx-proxy/webserver/conf.d:/etc/nginx/conf.d
      - ./env/nginx-proxy/webserver/vhost.d:/etc/nginx/vhost.d
      - ./env/nginx-proxy/webserver/defaults:/etc/nginx/defaults
      - ./env/nginx-proxy/webserver/global:/etc/nginx/global
      - ./env/nginx-proxy/ssl/certs:/etc/nginx/certs
      - ./env/nginx-proxy/share:/usr/share/nginx/html
      - /var/run/docker.sock:/var/run/docker.sock:ro
    depends_on:
      - nginx-proxy

  webapp:
    container_name: webapp
    build: ./env/webapp
    hostname: webapp
    networks:
      - mywebapp
    ports:
      - 9000:9000
      - 8080:8080
    volumes:
      - ./env/composer:/home/www/.composer
      - ./env/global/bashrc:/home/www/.bashrc
      - ./data/bash/.bash_history:/home/www/.bash_history
      - ~/.ssh:/home/www/.ssh:ro
      - ~/.gitconfig:/home/www/.gitconfig:ro
      - ./storage:/home/www/storage/mywebapp
      - ./src:/home/www/mywebapp/src

Ключевые моменты:

  • Webapp - это источник моего веб-приложения, которое работает на веб-сервере PHP, MySQL и Nginx. Веб-сервер веб-приложения предоставляет и прослушивает порт 8080 для обслуживания файлов PHP.
  • Прокси-сервер Nginx предоставляет стандартные порты 443 и 80, а прокси проходит через webapp через порт 8080.
  • LetsEncrypt Companion генерирует сертификаты и обновляет.

Конфигурация прокси-сервера Nginx:

upstream webapp {
    server 127.0.0.1:8080;
}

server {

    listen 80;
    listen [::]:80;

    server_name webapp.localhost;

    location / {
        proxy_pass http://webapp;
    }
}

server {

    # SSL configuration
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl_certificate certs/default.crt;
    ssl_certificate_key certs/default.key;

    include /etc/nginx/global/ssl-params.conf;

    server_name webapp.localhost;

    location / {
        proxy_pass http://webapp;
    }
}

Конфигурация веб-сервера Webapp:

server {
    listen 8080;
    listen [::]:8080;

    server_name webapp.localhost;

    root /home/www/webapp/src;
    index index.php;

    include /etc/nginx/defaults/php.conf;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }
}

При посещении http://webapp.localhost:8080/ я вижу, что веб-сервер webapp обслуживает страницу без проблем, поэтому я подозреваю, что что-то не так с моей конфигурацией прокси-сервера Nginx.

Спасибо за прочтение.

1 ответ

Решение

Поскольку nginx и webapp находятся в двух отдельных контейнерах, nginx не может получить доступ к webapp на localhost(127.0.0.1), так как вы настроили для апстрима:

upstream webapp {
    server 127.0.0.1:8080;
}

Измените это на webapp:8080,

Другие вопросы по тегам