Grundkonfiguration von Nginx mit Django auf EC2:

Grundkonfiguration von Nginx mit Django auf EC2:

Ich möchte meine Docker-Django-App mit Nginx konfigurieren und auf einer EC2-Instanz ausführen, aber ich bekomme sie nicht zum Laufen. Ich bin ein Anfänger mit Nginx.

Mein Fehler dabei docker-compose -f production.yml upist:

Der Client hat beim Lesen der Client-Anforderungszeile eine ungültige Methode gesendet, Client: 80.153.184.19, Server: ec2-XXXXX.eu-central-2.compute.amazonaws.com, Anforderung: "�U�F'��Io�q�+!�P��

Und ich denke mir: „Was? Gibt es dafür keine Grundkonfiguration, damit es reibungslos läuft?“

Meine Nginx-Konfiguration myconf:

server {

    set $my_host $host;
    if ($host ~ "\d+\.\d+\.\d+\.\d+") {
        set $my_host "ec2-XXXXX.eu-central-2.compute.amazonaws.com";
    }

    listen 80;
    server_name ec2-XXXXX.eu-central-2.compute.amazonaws.com;
    charset utf-8;
    error_log /dev/stdout info;
    access_log /dev/stdout;

    location / {
        proxy_pass http://django:5000;
        proxy_set_header Host $my_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

}

Meine Docker-Zusammenstellung:

version: '3'

#volumes:
#  production_caddy: {}

services:
  django:
    build:
      context: .
      dockerfile: ./compose/production/django/Dockerfile
    image: heatbeat_website_production_django
    env_file:
      - ./.envs/.production/.django
      - ./.envs/.production/.postgres
    command: /start

  nginx:
    build:
      context: .
      dockerfile: ./compose/production/nginx/Dockerfile
    ports:
      - "0.0.0.0:8080:80"
    depends_on:
      - django

  redis:
    image: redis:5.0

mein Dockerfile für Nginx:

FROM tutum/nginx
RUN rm /etc/nginx/sites-enabled/default
COPY ./compose/production/nginx/myconf.conf /etc/nginx/sites-enabled/default

Ich bin für jede Hilfe äußerst dankbar. Ich stecke so fest. Vielen Dank im Voraus!

Antwort1

Mich interessiert dieser Abschnitt:

    set $my_host $host;
    if ($host ~ "\d+\.\d+\.\d+\.\d+") {
        set $my_host "ec2-XXXXX.eu-central-2.compute.amazonaws.com";
    }

In meinem Anwendungsprotokoll werden mir Ausnahmen wie diese angezeigt:

django.core.exceptions.DisallowedHost: Invalid HTTP_HOST header: '54.148.178.171'...

Wenn ich einen Reverse-Proxy verwende, sehe ich, dass die IP innerhalb von AWS liegt. Aber ich kann die Ressource nicht identifizieren. Ich sehe, dass Sie einen kanonischen Servernamen verwenden und die IP darauf umschreiben, aber macht das nicht den Zweck von ALLOWED_HOSTS zunichte?


Okay, ich habe herausgefunden, warum mir Ihre Lösung unangenehm war. Sie nehmen eine beliebige IP-Adresse und ordnen sie zu. Das typische Problem besteht darin, die IP-Adresse des ELB zu erfassen, die sich im Laufe der Zeit ändert. Daher ist es viel sicherer, diese in einen Standortblock einzufügen. Im folgenden Beispiel habe ich „aws.elb.com“ in meiner ALLOWED_HOSTS-Liste und auf der Registerkarte „ELP Health Check“ habe ich mein Ping-Ziel als „ELB-health-check“ angegeben. Dies sollte ein sichererer Ansatz sein.

    location /ELB-health-check {
        set $my_host $host;
        if ($host ~ "\d+\.\d+\.\d+\.\d+") {
          set $my_host "aws.elb.com";
        }
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # set $my_host "aws.elb.com";
        proxy_set_header Host $my_host;
        # now send the request to the app
        proxy_pass http://app_server;
     }

verwandte Informationen