django - 在负载均衡器后面配置 nginx/gunicorn django
问题描述
我使用本教程设置了一个 nginx/gunicorn 服务器。这就像一个本地 docker-compose 文件的魅力。然后我将容器推送到AWS fargate,并在 nginx 前面设置了一个负载均衡器。这也有效,但是在尝试登录 django admin 时出现“CSRF 失败”异常。
这是因为主机、端口和协议没有通过负载均衡器和 nginx 代理从用户请求正确转发到 django gunicorn。
我必须如何配置 nginx 和 django?
解决方案
我最终得到了这个 nginx 配置,它在负载均衡器和我的本地 docker-compose 配置后面工作,用户直接向 nginx 请求。rg_
只是我项目的前缀。
# Set proto and port to forwarded value, or to nginx value if
# forwarded value not set
map $http_x_forwarded_proto $rg_forwarded_proto {
default $scheme;
"~^(.*)$" $1;
}
map $http_x_forwarded_port $rg_forwarded_port {
default $remote_port;
"~^(.*)$" $1;
}
# Gunicorn proxy
upstream rg_serve {
server localhost:8100;
}
# Server
server {
listen 8090;
location / {
proxy_pass http://rg_serve;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $rg_forwarded_proto;
proxy_set_header X-Forwarded-Port $rg_forwarded_port;
proxy_set_header X-Forwarded-Host $host:$rg_forwarded_port;
proxy_redirect off;
}
location /static/ {
alias /home/app/rg_serve/web/static_collect/;
}
}
我必须设置
USE_X_FORWARDED_HOST = True
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
在我的 django 设置中,使其工作。
感觉有点奇怪的是,我必须添加端口才能X-Forwarded-Host
使其在 django 中工作。当我只是不添加它,并将 django 设置设置为
USE_X_FORWARDED_HOST = True
USE_X_FORWARDED_PORT = True
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
是行不通的。我得到了 csrf 异常。
推荐阅读
- kotlin - 无法解决参考 Bigdecimal。但我添加了 ExtendedScalars
- typescript - 通过泛型类型查找键入键
- visual-studio-code - 无法通过 SSH 在 Mac 中使用 VS-Code 连接到远程 GCP VM
- json - 在不知道父键的情况下,从 scala spark 中的 JSON 字符串列获取嵌套键值
- python - 从服务器到网络驱动器的 Python 文件路径
- python - 预签名 URL 的下载文件而不是在浏览器中打开
- dynamic-loading - 如何动态加载依赖于主包中的模块的模块?
- c++ - 如何创建 bool BST::CloneSubtree(BST t1, type item) 函数以及如何调用 main ?我对 BST 很陌生。谢谢 ;)
- html - 如何知道站点是否在 Python 中启用了模式索引?
- elasticsearch - 在嵌套对象内查询和排序