Dockerized приложение с Nginx (через docker-compose) - ошибка 502 Bad Gateway - PullRequest
0 голосов
/ 20 марта 2019

У меня есть приложение Phoenix, MyApp, которое я пытаюсь Dockerize и развернуть в Ubuntu 18.04.Я пытался следовать некоторым инструкциям для правильной настройки Nginx, но я либо получаю ошибку 502 Bad Gateway, либо вызываю слишком много перенаправлений в зависимости от того, как я пытался настроить обратный прокси-сервер Nginx.

ИдеальноСитуация такова, что я могу использовать docker-compose up, и он будет инициализировать веб-приложение и Nginx.Это мой текущий файл docker-compose.yml:

docker-compose.yml

version: '3.5'

services:
  nginx:
    image: nginx:latest
    restart: unless-stopped
    volumes:
      - ./data/nginx/app.conf:/etc/nginx/nginx.conf
      - ./data/nginx/error.log:/etc/nginx/error_log.log
      - ./data/nginx/cache/:/etc/nginx/cache
      - /etc/letsencrypt/:/etc/letsencrypt/
    environment:
      - ENV=production
      - APPLICATION_URL=http://myapp.domain
    ports:
      - 80:80
      - 443:443

  ...

  web:
    depends_on:
      - nginx
    image: "myapp:0.1.0"
    restart: unless-stopped
    expose:
      - "80"
    env_file:
      - config/docker.env

Без включения Nginx такая же версия-версия myapp работает с ports: - 80:4000, поскольку Phoenix настроен на ожидание трафика через порт 4000. Ниже приведена конфигурация моего приложения nginx, которая, я полагаю, определяется томами в docker-compose.yml.

data / nginx / app.conf

events {

}

http {
  client_max_body_size 20m;

  proxy_cache_path /etc/nginx/cache keys_zone=one:500m max_size=1000m;

  server {
      proxy_cache one;
      listen 80;
      listen 443 ssl;
      server_name myapp.domain;

      location / {
          proxy_pass http://localhost:4000;
          rewrite ^/myapp.domain(.*)$ $1 break;
      }

      ssl_certificate /etc/letsencrypt/live/myapp.domain/fullchain.pem;
      ssl_certificate_key /etc/letsencrypt/live/myapp.domain/privkey.pem;
      include /etc/letsencrypt/options-ssl-nginx.conf;
  }
}

Я не знаю точно, как настроить порты так, чтобы веб-трафик правильно отправлялся через Nginx и обратно передавался через myapp.Я полагал, что localhost будет работать, потому что когда я запускаю docker-compose up, я вижу Running MyAppWeb.Endpoint with cowboy 2.6.1 at http://localhost:4000.

Когда я пытаюсь получить доступ к сайту, я вижу это в журналах моего сервера [error] 6#6: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 162.158.119.89, server: myapp.domain, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:4000/", host: "myapp.domain"

AnyСовет ценится.

1 Ответ

0 голосов
/ 20 марта 2019

Вам нужно связать веб-сервис на контейнере nginx, docker-compose будет выглядеть так:

services:
  nginx:
    image: nginx:latest
    restart: unless-stopped
    volumes:
      - ./data/nginx/app.conf:/etc/nginx/nginx.conf
      - ./data/nginx/error.log:/etc/nginx/error_log.log
      - ./data/nginx/cache/:/etc/nginx/cache
      - /etc/letsencrypt/:/etc/letsencrypt/
    environment:
      - ENV=production
      - APPLICATION_URL=http://myapp.domain
    ports:
      - 80:80
      - 443:443
    links:
      - web

  web:
      depends_on:
        - nginx
      image: "myapp:0.1.0"
      restart: unless-stopped
      expose:
        - "4000"
      env_file:
        - config/docker.env

Затем обновите data/nginx/app.conf

events {

}

http {
  client_max_body_size 20m;

  proxy_cache_path /etc/nginx/cache keys_zone=one:500m max_size=1000m;

  server {
      proxy_cache one;
      listen 80;
      listen 443 ssl;
      server_name myapp.domain;

      location / {
          proxy_pass http://web:4000;
          rewrite ^/myapp.domain(.*)$ $1 break;
      }

      ssl_certificate /etc/letsencrypt/live/myapp.domain/fullchain.pem;
      ssl_certificate_key /etc/letsencrypt/live/myapp.domain/privkey.pem;
      include /etc/letsencrypt/options-ssl-nginx.conf;
  }
}
...