EC2 上の django を使用した Nginx の基本設定:

EC2 上の django を使用した Nginx の基本設定:

Docker 化された 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

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 ヘルス チェック タブで 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;
     }

関連情報