質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Gunicorn

Gunicorn (Green Unicorn)は、Rubyのunicornをベースに開発されたUNIX向けのPython製HTTPサーバです。他のライブラリとの依存関係がないため、容易にインストールして使用できます。

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Elastic Load Balancing

Elastic Load Balancingは、Amazon社が提供する、 EC2インスタンス間で自動的にトラフィックの負荷分散を行うサービスです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

0回答

1145閲覧

ALBからnginxサーバで400BadRequestになってしまう

yara

総合スコア0

Gunicorn

Gunicorn (Green Unicorn)は、Rubyのunicornをベースに開発されたUNIX向けのPython製HTTPサーバです。他のライブラリとの依存関係がないため、容易にインストールして使用できます。

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Elastic Load Balancing

Elastic Load Balancingは、Amazon社が提供する、 EC2インスタンス間で自動的にトラフィックの負荷分散を行うサービスです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

1クリップ

投稿2022/04/29 04:42

AWSでdjangoとgunicorn、nginxを使ってWebサーバーを立ち上げたいと思っています。
【AmazonLinux2でDjangoの本番環境構築】Python3.8,Nginx,Gunicorn,PostgreSQLを参考にさせて頂き、EC2へグローバル直アドレスで閲覧できるところまではできました。

HTTPS化するところからは、AWSのCertificate ManagerとALBを使おうと思って、証明書の発行を行いALBを設定して、ALBのDNSアドレスをRoute53で設定して逆引きできることを核にしています。
EC2はPrivateSubnetとしてALBとのHTTPで通信できるようにセキュリティポリシーを作っています(確認のためmyIPのみでSSHとHTTPを許可を設定)。

しかし、この状態でもEC2は直アドレスで問題なく表示できるのですが、ALBを経由するDNS名ではエラー400となってしまいます。
nginxのログではALBからルートディレクトリへのアクセスでエラーとなり、myIPも表示されています。
最初はHealthCheckも400だったのですが、nginx.confにダミーを設けることでクリアしましたが、やはりルートディレクトリに対しては依然として400でした。
色々なサイトで調べて施してみましたが解決できず、ご教授頂ければと思いました。

これまで別の形でのALBを使ったWebサーバーは立ててきたのですが、こんなにつながらないのは初めてです。

nginx.confは以下の通りです。

# * Official English Documentation: http://nginx.org/en/docs/ # * Official Russian Documentation: http://nginx.org/ru/docs/ user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic. include /usr/share/nginx/modules/*.conf; events { worker_connections 1024; } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 4096; include /etc/nginx/mime.types; default_type application/octet-stream; # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf; server { listen 80; listen [::]:80; server_name <My domain>; root /usr/share/nginx/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location /.well-known/acme-challeng { root /usr/share/nginx/html; } location /healthcheck { empty_gif; access_log off; break; } location /static { #.htmlは省略できる try_files $uri $uri/ $uri.html =404; } location /media { } location / { proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://127.0.0.1:8000; } error_page 404 /404.html; location = /404.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } #443の記述はすべてコメントアウトのまま }

どうすれば表示できるのかご教授ください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yu_1985

2022/05/02 02:41

まず前提として、ヘルスチェックがOKの状態で確認してください。 そのうえで、nginxのアクセスログとアプリケーションのログを確認してみてください。 server_name <My domain>; と設定してあるので、<My domain>でのアクセスでないとここの設定は適用されないのでは?
yara

2022/05/02 02:49

ご提案ありがとうございます。 記載していますが、わかりずらかったらすいません。 ヘルスチェックはダミー設定(nginx.confに記載)することで接続としてはOKで、そこからの処理としてALBからnginxで400が返ってきています。 <My domain>は、実際のドメインを記載しています。 掲載上、この記載をしましたが、通例でなくわかりにくかっらたようであれば申し訳ありません。
yu_1985

2022/05/02 05:59

> <My domain>は、実際のドメインを記載しています。 はい。なのでそれに従って書きました。 server_nameのところにドメインを記載するとホストヘッダーの値がそれに一致しないと該当箇所の設定は適用されないのでそのことを書いています。 またEC2にアクセスするときはどうアクセスしているのでしょうか。 ちゃんと80番にアクセス(つまり、nginxに対してアクセス)してますか? いずれにしてもnginxのアクセスログとアプリケーションのログを確認する必要があるのは変わりありませんのでそこをチェックしてください。
yara

2022/05/02 09:37

再度、ご連絡ありがとうございます。 >server_nameのところにドメインを記載するとホストヘッダーの値がそれに一致しないと該当箇所の設定は適用されない なるほど。ALBからホストヘッダに渡る値が何かわからなくて色々とやりはしました。 ・ALBのDNS名 ・* ・VPNのセグメント(各サブネット) ・ローカルアドレス どれを入れてもダメでした。 nginxには80の設定しかしておらず、ヘルスチェックも80で、セキュリティポリシーも80だけでも試してみました(これはALLにしてもNGだったので意味なかったのですが)。 nginxのアクセスログではALBの3セグメントのローカルアドレスからルートディレクトリに対してHTTP/1.0でGET処理をする際に400で返しています。 その後、faviconを取得しようとして、同様に400で返しています。 エラーログ、アプリログには何も記述されていない状態です。
yu_1985

2022/05/02 09:43

こういうときは実際のログの内容を貼るようにしてください ちなみにdjangoでBad RequestになるケースではALLOWED_HOSTSの設定漏れがあるようですが、そちらはどう設定していますか。
yara

2022/05/02 09:57

すいません。 今、ちょっとログを採取できない状態になっていて、概要で書かせていただいていました。 後日、貼ります。 ALLOWED_HOSTSも前述同様、アクセス可能性のあるルートを登録して、組み合わせで試しましたが通りませんでした。
yara

2022/05/02 11:02

ログファイルを採取しました。 外からサーバーを叩いた時は、このような記述でした。 <alb-IP> - - [28/Apr/2022:18:40:43 +0900] "GET / HTTP/1.1" 400 154 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36 Edg/100.0.1185.44" <myIP> <alb-IP> - - [28/Apr/2022:18:40:43 +0900] "GET /favicon.ico HTTP/1.1" 400 154 "<myDomain>" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36 Edg/100.0.1185.44" <myIP>
yu_1985

2022/05/02 11:11

> ALLOWED_HOSTSも前述同様、アクセス可能性のあるルートを登録して、組み合わせで試しましたが通りませんでした。 これもそうですが実際の設定を貼ってください。少なくとも、アクセス時のドメインと一致するホストが指定されてないとエラーになりそうです。 ALBのDNS名でアクセスするならALBのDNS名を追加してdjangoを起動しなおしてください。 何かしらのドメインを設定してそれでアクセスするならドメインも追加しましょう。 また、調べればいくつか出てきますがヘルスチェックをちゃんと通すにはALLOWED_HOSTSにEC2インスタンスのプライベートIPを記載する必要があります(ALBからのリクエストはプライベートIPを使って行われるため) 直書きするとサーバーが変わったときに困るのでそこを動的に設定しようとしている例がいくつか引っかかります。
yara

2022/05/02 11:38

ご教授ありがとうございます。 ALLOWED_HOSTSにEC2のプライベートIPですか。 それは試していませんでした。djangoにはリクエストアドレスの要求だと思っていたので、ドメインとALBのDNSとALBローカルアドレスとEC2のローカルアドレスを入れ、あとは*で試しただけでした。 後日試してみます。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問