[英]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/hosts
: 127.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.