首页 > 解决方案 > 在负载均衡器后面配置 nginx/gunicorn django

问题描述

我使用本教程设置了一个 nginx/gunicorn 服务器。这就像一个本地 docker-compose 文件的魅力。然后我将容器推送到AWS fargate,并在 nginx 前面设置了一个负载均衡器。这也有效,但是在尝试登录 django admin 时出现“CSRF 失败”异常。

这是因为主机、端口和协议没有通过负载均衡器和 nginx 代理从用户请求正确转发到 django gunicorn。

我必须如何配置 nginx 和 django?

标签: djangonginxload-balancingcsrfgunicorn

解决方案


我最终得到了这个 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 异常。


推荐阅读