2017-09-13 42 views
1

我無法找到如何正確設置nginx,所以我的超鏈接由DRF API構建是正確的。錯誤的超鏈接Django Rest框架與複雜堆棧使用SSL,AWS負載平衡器,Nginx和Gunicorn

我給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。所以當我旋轉整個碼頭機械時,我可以很好地訪問localhost:8000/api並且鏈接呈現OK。即使我使用不同的域訪問它(例如,如果我在/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(http代替https )和錯誤的端口(8000而不是80/443)。這是有道理的,因爲nginx不知道什麼原始請求來負載平衡器...

沒有我能想到的想法聽起來正確。將不勝感激任何幫助。當然,我願意改變基礎設施。

任何想法如何解決這個問題?

+1

你添加到你的settings.py中了嗎? 'SECURE_PROXY_SSL_HEADER =( 'HTTP_X_FORWARDED_PROTOCOL', 'https' 時)' 和 'SECURE_SSL_REDIRECT =不DEBUG' –

+0

即解決的是,由於 – kotrfa

回答

0

加入您的settings.py

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

編輯者:kotrfa:相關part of documentation。我不想添加第二行,因此仍然可以直接訪問服務器而不使用HTTPS,例如在localhost上測試時。爲此,我必須在nginx中設置兩個不同的服務器 - 一個在來自負載均衡器(例如7779)的同一端口上的硬編碼爲Host my.domain.org,然後在7778與Host $host:$port一起,因此它可以直接在VPN後或本地主機上訪問,鏈接仍然有效:-)。