
nginx로 dockerized django 앱을 구성하고 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;
}
}
내 도커 작성:
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
nginx에 대한 내 dockerfile:
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 주소를 가져와 매핑하고 있습니다. 일반적인 문제는 시간이 지남에 따라 변경되는 ELB의 IP 주소를 캡처하는 것입니다. 따라서 위치 블록에 넣는 것이 훨씬 안전합니다. 아래 예에서는 ALLOWED_HOSTS 목록에 'aws.elb.com'이 있고 ELP 상태 확인 탭에서 핑 대상을 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;
}