簡體   English   中英

使用SSL,AWS Load Balancer,Nginx和Gunicorn的具有復雜堆棧的Dja​​ngo Rest Framework錯誤的超鏈接

[英]Wrong hyperlinks of Django Rest Framework with complex stack using SSL, AWS Load Balancer, Nginx and Gunicorn

我找不到如何正確設置nginx因此我在DRF構建的API中的超鏈接是正確的。

我當前對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和地圖入內部運行gunicorn(也在容器中)也在8000 因此,當我啟動整個docker機械時,我可以很好地訪問localhost:8000/api並且鏈接呈現為OK。 即使當我使用其他域訪問它時(例如,如果我在/etc/hosts127.0.0.1 mytest.com ),URL和端口127.0.0.1 mytest.com正確傳遞到DRF,並且鏈接將按預期方式呈現。

但是此服務必須位於具有SSL證書的AWS Load Balancer后面。 該LB上的主機名設置為otherdomain.com ,它將流量重定向到使用端口8000上的HTTP在上面運行nginx的計算機。然后,當嘗試使用https://otherdomain.com/api訪問它時,鏈接呈現為http://otherdomain.com:8000/api/ <-因此使用了錯誤的scheme (用HTTP代替https)和錯誤的端口(用8000代替了80/443)。 這是有道理的,因為nginx對到達負載均衡器的原始請求一無所知...

我無法想到的任何想法聽起來都是正確的。 將不勝感激任何幫助。 我當然願意改變基礎架構。

知道如何解決嗎?

添加到您的settings.py

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

由kotrfa編輯: 文檔的相關部分 我不想添加第二行,因此仍然可以在沒有HTTPS的情況下直接訪問服務器,例如在localhost上進行測試時。 為此,我必須在nginx設置兩台不同的服務器-一台在負載均衡器(例如7779)來自同一端口上的硬編碼Host my.domain.org ,然后一台在7778上使用Host $host:$port可以直接在VPN后面或在localhost上訪問,並且鏈接仍然有效:-)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM