
Я хочу настроить свое докеризированное приложение django с nginx и запустить его на экземпляре EC2, но не могу заставить его работать. Я новичок в nginx.
Моя ошибка, когда я docker-compose -f production.yml up
это делаю:
клиент отправил недопустимый метод при чтении строки запроса клиента, клиент: 80.153.184.19, сервер: ec2-XXXXX.eu-central-2.compute.amazonaws.com, запрос: "�U�F'��Io�q�+!�P��
И я такой: "Что за фигня? Неужели нет какой-то базовой конфигурации, чтобы всё работало гладко?"
Мой конфиг nginx 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;
}
}
Мой docker-compose:
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
мой dockerfile для nginx:
FROM tutum/nginx
RUN rm /etc/nginx/sites-enabled/default
COPY ./compose/production/nginx/myconf.conf /etc/nginx/sites-enabled/default
Я буду очень благодарен за любую помощь... Я совсем застрял... Заранее спасибо!
решение1
Меня интересует этот раздел:
set $my_host $host;
if ($host ~ "\d+\.\d+\.\d+\.\d+") {
set $my_host "ec2-XXXXX.eu-central-2.compute.amazonaws.com";
}
В журнале моего приложения я вижу такие исключения:
django.core.exceptions.DisallowedHost: Invalid HTTP_HOST header: '54.148.178.171'...
Когда я делаю обратный прокси, я вижу, что IP находится внутри AWS. Но я не могу идентифицировать ресурс. Я вижу, что вы используете каноническое имя сервера и перезаписываете IP на него, но разве это не противоречит цели ALLOWED_HOSTS?
Хорошо, я понял, почему ваше решение меня смутило. Вы берете любой IP-адрес и сопоставляете его. Типичная проблема — захватить IP-адрес ELB, который меняется со временем. Поэтому гораздо безопаснее поместить его в блок местоположения. В примере ниже у меня есть «aws.elb.com» в моем списке ALLOWED_HOSTS, а на вкладке ELP Health Check я указал цель ping как ELB-health-check. Это должен быть более безопасный подход.
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;
}