Докеризованный обратный прокси-сервер Nginx и приложение Flask, как настроить?

#docker #docker-compose #nginx-reverse-proxy #nginx-config

Вопрос:

У меня возникли проблемы с развертыванием простого приложения Flask за обратным прокси-сервером Nginx. Это приложение находится по адресу https://docs.docker.com/compose/gettingstarted/

Я пытаюсь заставить приложение отображаться в subdomain.example.com/flask , но с текущей конфигурацией это не работает. Чего мне не хватает?

Теперь моя docker-compose.yml внешность выглядит так:

 version: '3'
services:
  nginx:
    container_name: nginx
    build:
      context: ./nginx
    volumes:
      - ./config/:/etc/nginx/
      - ./ssl-cert/:/etc/ssl/private/
    depends_on:
      - web
    ports:
      - 80:80

  web:
    build:
      context: ./composetest
    expose:
      - 5000

  redis:
    image: "redis:alpine"

 

И вот мой Nginx default.conf :

 server {
    listen              80;
    server_name         subdomain.example.com;

    location /flask{
        proxy_pass http://web:5000;
    }

}
 

Когда я это делаю docker-compose up --build , я не получаю никаких ошибок ни от контейнера Nginx, ни от других (очевидно, игнорируя ошибки, связанные с подготовкой к производству).

Вот что я вижу, когда выполняю вышеупомянутую команду:

 redis_1       | 1:C 16 May 2021 14:08:42.327 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1       | 1:C 16 May 2021 14:08:42.335 # Redis version=6.2.3, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1       | 1:C 16 May 2021 14:08:42.335 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis_1       | 1:M 16 May 2021 14:08:42.336 * monotonic clock: POSIX clock_gettime
redis_1       | 1:M 16 May 2021 14:08:42.337 * Running mode=standalone, port=6379.
redis_1       | 1:M 16 May 2021 14:08:42.337 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
redis_1       | 1:M 16 May 2021 14:08:42.337 # Server initialized
redis_1       | 1:M 16 May 2021 14:08:42.337 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
redis_1       | 1:M 16 May 2021 14:08:42.338 * Ready to accept connections
web_1         |  * Serving Flask app 'app.py' (lazy loading)
web_1         |  * Environment: production
web_1         |    WARNING: This is a development server. Do not use it in a production deployment.
web_1         |    Use a production WSGI server instead.
web_1         |  * Debug mode: off
web_1         |  * Running on all addresses.
web_1         |    WARNING: This is a development server. Do not use it in a production deployment.
web_1         |  * Running on http://192.168.112.4:5000/ (Press CTRL C to quit)

 

Ответ №1:

Я думаю, что все в порядке, вы открываете порт 5000 из своего веб-контейнера и указываете порт 80 для nginx контейнера

возможно, вам следует указать порт 80 на вашем локальном компьютере.

просто добавив в разделе depends_on: перестроить тест, и он должен работать нормально

 ports:
      - "80:80"
 

Добавьте поддомен: subdomain.example.com также на вашем локальном компьютере в разделе /etc/hosts ,
если вы используете ubuntu debian компьютер. добавив хост с помощью любого текстового редактора vim nano

127.0.0.1 subdomain.example.com

Сохраняйте и обслуживайте из своего браузера.

Комментарии:

1. Извините, у меня были порты, docker-compose.yml но я не скопировал их в сообщении. Ваш ответ все равно помог мне, потому что я забыл переслать порт 80. Теперь я чувствую себя идиотом.

Ответ №2:

Вам нужна ports директива для службы nginx. Даже если порты по умолчанию отображаются изображением, они автоматически не привязываются к хосту, как в ports .

 services:
  nginx:
    container_name: nginx
    build:
      context: ./nginx
    volumes:
      - ./config/:/etc/nginx/
      - ./ssl-cert/:/etc/ssl/private/
    depends_on:
      - web
    ports:
      - "80:80"

 

После этого вы сможете получить доступ к nginx по адресу http://localhost