Aktualisieren

Aktualisieren

Ich verwende Docker-Container, um eine Web-App zu hosten. Ich habe drei Hauptcontainer: MySQL, Flask und Nginx. Die ersten beiden funktionieren wie erwartet und letzterer scheint einwandfrei zu funktionieren, da beim Start von Docker-Compose kein Fehler angezeigt wird.

Ausgabe der Initialisierung des Nginx-Containers:

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-Dockerdatei

# 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 nach der Bereitstellung und ihre jeweiligen Ports:

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

Ich bin neu beim Nginx-Server, daher vermute ich, dass es sich um einen Anfängerfehler handeln könnte. Ich versuche, den gesamten Datenverkehr vom Port 80 meines Hostcomputers auf Port 80 von Docker umzuleiten, der den Datenverkehr über einen Socket an den WSGI-Container weiterleitet.

Ich verwende die folgende Nginx-Konfiguration (nichts besonders Ausgefallenes, denke ich):

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

Wie Sie sehen, lauscht der Server auf Port 80 und leitet den gesamten Datenverkehr über den Socket uwsgi_pass flask:8080;an den WSGI-Container um, der die App hostet.

Wenn ich jedoch 127.0.0.1:80 oder 0.0.0.0:80 in meinen Browser eingebe, wird die Verbindung abgelehnt. Ich habe keine Firewall installiert, daher gehe ich davon aus, dass es kein Problem ist, wenn Port 80 nicht erreichbar ist.

Dies ist meine app.ini-Konfigurationsdatei, in der die Initialisierungs- und Bereitstellungsparameter angegeben sind:

[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

Zusätzlich füge ich auch die Datei docker-compose.yml ein (ich denke, das könnte hilfreich sein):

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"

Kann jemand helfen?

Aktualisieren

Ich habe Wireshark verwendet, um die Loopback-Schnittstelle zu scannen und die Antwort des Servers auf 0.0.0.0:80 anzuzeigen (ich vermute, dass möglicherweise ein Problem mit Port 80 vorliegt) und erhalte die folgende Nutzlast:

Wireshark

verwandte Informationen