1

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/hosts127.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)。 は、ロードバランサに来る元のリクエストについて何も知らないので、意味があります。

私が思うには正しい音はありません。どんな助けにも大いに感謝します。私はもちろんインフラストラクチャを変更したいと思います。

これはどのように解決できますか?

+1

あなたの 'settings.py'に追加しましたか? 'SECURE_PROXY_SSL_HEADER =( 'HTTP_X_FORWARDED_PROTOCOL'、 'https')' と 'SECURE_SSL_REDIRECT = not DEBUG' –

+0

それを解決しました。ありがとう – kotrfa

答えて

0

settings.pyに追加してください。

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https') 
SECURE_SSL_REDIRECT = not DEBUG 

kotrfa:関連part of documentationで編集してください。 2行目を追加したくないので、HTTPSを使わずに直接サーバーにアクセスすることはできました。 localhostでテストするとき。そのためには、nginxに2つの異なるサーバーを設定する必要がありました。ロードバランサ(たとえば7779)から来る同じポート上にHost my.domain.orgというハードコーディングされたものと、次に7778でHost $host:$portという2番目のサーバーを設定する必要がありました。リンクはまだ動作します:-)。

関連する問題