Обновлять

Обновлять

Я использую контейнеры docker для размещения веб-приложения. У меня есть три основных контейнера: MySQL, flask и Nginx. Первые два работают как и ожидалось, а последний, похоже, работает нормально, поскольку при запуске docker-compose не отображается никаких ошибок.

Вывод инициализации контейнера Nginx:

nginx  | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
nginx  | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
nginx  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
nginx  | 10-listen-on-ipv6-by-default.sh: info: /etc/nginx/conf.d/default.conf is not a file or does not exist
nginx  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
nginx  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
nginx  | /docker-entrypoint.sh: Configuration complete; ready for start up
nginx  | 2022/04/07 13:09:13 [notice] 1#1: using the "epoll" event method
nginx  | 2022/04/07 13:09:13 [notice] 1#1: nginx/1.21.6
nginx  | 2022/04/07 13:09:13 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6) 
nginx  | 2022/04/07 13:09:13 [notice] 1#1: OS: Linux 4.19.130-boot2docker
nginx  | 2022/04/07 13:09:13 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
nginx  | 2022/04/07 13:09:13 [notice] 1#1: start worker processes
nginx  | 2022/04/07 13:09:13 [notice] 1#1: start worker process 21

Файл докера Nginx

# Dockerfile-nginx
FROM nginx:latest
# Nginx will listen on this port
# EXPOSE 80
# Remove the default config file that
# /etc/nginx/nginx.conf includes
RUN rm /etc/nginx/conf.d/default.conf
# We copy the requirements file in order to install
# Python dependencies
COPY nginx.conf /etc/nginx/conf.d/

Контейнеры после развертывания и соответствующие им порты:

CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS                 PORTS                               NAMES
bffffcfe2f70   sc_server_nginx   "/docker-entrypoint.…"   14 seconds ago   Up 13 seconds          0.0.0.0:80->80/tcp                  nginx
a73d958c1407   sc_server_flask   "uwsgi app.ini"          9 hours ago      Up 9 hours             8080/tcp                            flask
d273db5f80ef   mysql:5.7         "docker-entrypoint.s…"   21 hours ago     Up 9 hours (healthy)   0.0.0.0:3306->3306/tcp, 33060/tcp   mysql

Я новичок в Nginx-сервере, поэтому предполагаю, что это может быть ошибка новичка. Я пытаюсь перенаправить весь трафик с 80-го порта моей хост-машины на 80-й порт докера, который перенаправляет трафик в контейнер WSGI через сокет.

Я использую следующую конфигурацию Nginx (полагаю, ничего особенного):

server {
  listen 80;
  location / {
    include uwsgi_params;
    uwsgi_pass flask:8080;
  }
}

Как вы видите, сервер прослушивает порт 80 и перенаправляет весь трафик через сокет uwsgi_pass flask:8080;в контейнер WSGI, на котором размещено приложение.

Однако, всякий раз, когда я ввожу 127.0.0.1:80 или 0.0.0.0:80 в своем браузере, соединение отклоняется. У меня не развернут брандмауэр, поэтому я предполагаю, что нет никаких проблем с отключением порта 80.

Это мой файл конфигурации app.ini, в котором указаны параметры инициализации и развертывания:

[uwsgi]
wsgi-file = wsgi.py
; This is the name of the variable
; in our script that will be called
callable = app
; We use the port 8080 which we will
; then expose on our Dockerfile
socket = :8080
; Set uWSGI to start up 4 workers
processes = 4
threads = 2
master = true
chmod-socket = 660
vacuum = true
die-on-term = true

Кроме того, я также включаю docker-compose.yml (думаю, это может быть полезно):

docker-compose.yml

services:
  flask:
    build: ./flask
    container_name: flask
    restart: always
    environment:
      - APP_NAME=MyFlaskApp
      - YOURAPPLICATION_SETTINGS=docker_config.py
    expose:
      - 8080
    depends_on:
      mysql:
          condition: service_healthy
  mysql:
    image: mysql:5.7
    container_name: mysql
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD:
      MYSQL_DATABASE:
      MYSQL_USER:
      MYSQL_PASSWORD:
    volumes:
      - ./db/init.sql:/data/application/init.sql
    healthcheck:
      test: mysql -u -p --database -e "show tables;"
      interval: 3s
      retries: 5
      start_period: 30s
  nginx:
    build: ./nginx
    container_name: nginx
    restart: always
    depends_on:
      - mysql
      - flask
    ports:
      - "80:80"

Кто-нибудь может помочь?

Обновлять

Я использовал Wireshark для сканирования интерфейса обратной связи, чтобы увидеть ответ сервера на 0.0.0.0:80 (подозреваю, что могут быть какие-то проблемы с портом 80), и получил следующую полезную нагрузку:

проводная акула

Связанный контент