EC2에서 django를 사용한 Nginx의 기본 구성:

EC2에서 django를 사용한 Nginx의 기본 구성:

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;
     }

관련 정보