nginx
を正しく設定する方法が見つからないため、DRFによるAPIビルドのハイパーリンクが正しいとは限りません。SSL、AWS Load Balancer、Nginx、Gunicornを使用したDjango Rest Frameworkの複雑なスタックのハイパーリンク
nginx
のための私の現在の設定は次のとおりです。
upstream web {
ip_hash;
server web:8000;
}
# portal
server {
listen 8000;
server_name localhost;
location/{
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://web/;
}
}
nginx
はポート8000
を露出させ、コンテナ内で実行されていると、内部8000
にも(また、コンテナ内)gunicornを実行しているにそれをマッピングしています。ですから、ドッカーの機械全体を回転させると、localhost:8000/api
にうまくアクセスでき、リンクが正常に表示されます。別のドメイン(たとえば/etc/hosts
:127.0.0.1 mytest.com
に設定した場合)を使用してアクセスした場合でも、URLとポートはDRFに正しく渡され、リンクは期待通りにレンダリングされます。
しかし、このサービスはSSLを使用した証明書付きのAWS Load Balancerの後ろに位置している必要があります。このLBのホスト名はotherdomain.com
に設定され、ポート8000のHTTPを使用して上記nginx
が実行されているマシンにトラフィックがリダイレクトされます。https://otherdomain.com/api
を使用してアクセスしようとすると、リンクはhttp://otherdomain.com:8000/api/
<としてレンダリングされます。したがって、scheme
)と間違ったポート(80/443の代わりに8000)。 は、ロードバランサに来る元のリクエストについて何も知らないので、意味があります。
私が思うには正しい音はありません。どんな助けにも大いに感謝します。私はもちろんインフラストラクチャを変更したいと思います。
これはどのように解決できますか?
あなたの 'settings.py'に追加しましたか? 'SECURE_PROXY_SSL_HEADER =( 'HTTP_X_FORWARDED_PROTOCOL'、 'https')' と 'SECURE_SSL_REDIRECT = not DEBUG' –
それを解決しました。ありがとう – kotrfa