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