[英]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.