
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 up
ist:
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;
}