用于nginx + gunicorn + django服务器的nginx反向代理

时间:2017-02-26 15:38:44

标签: django nginx reverse-proxy

django应用程序正在django_server.com上运行,我无法让nginx反向代理服务于该应用程序。 当直接连接到django服务器时,让我们说django_server.com每个工作正常,用户被重定向到django_server.com/user/login。该应用程序在gunicorn + nginx(上游和unix套接字)上运行

现在,我们组织中的所有流量都必须通过一台服务器,比方说https://www.reverse_proxy.com,所以我添加了一个位置https://www.reverse_proxy.com/django_app,我无法使此连接正常工作。与reverse_proxy.com的连接是https,从reverse_proxy.com到django_server.com的连接是http。 reverse_proxy服务于其他几个站点和工作,我还测试了与django_server.com的连接,带有静态html站点,也可以。所以问题似乎是django方面,但我无法弄清楚错误。两个nginx的错误日志中都没有错误消息,它只是一个404错误。

这是django_server.com上的nginx配置:

#upstream gunicorn_socket { commented out for debugging
#    server unix:/home/django/w_plan/django/fakw/fakw.sock fail_timeout=0;
#}
server {
    server_name django_server.com;
    listen 80 default_server;

location ~ ^/django_app(.*)$ { 
    try_files $uri $1 /$1;
}


location / {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;

    proxy_set_header Host $http_host;
    proxy_redirect off;

    #proxy_pass http://gunicorn_socket/; debugging
    proxy_pass http://localhost:8000; # debugging

    }

}

这里是reverse_proxy:

...
location /django_app {
    proxy_pass http://django_server.com:80;
    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_set_header Host $host;
    proxy_read_timeout 60;
}

有什么想法吗?

编辑I: 我用django服务器取代了gunicorn进行调试,并添加了@danielgpm的建议

在django应用程序中,为了调试我修改了我的views.py文件:

def index(request):
    #return HttpResponse("HelloWorld") # that works
    print(request.META)
    if not request.user.is_authenticated():
        return HttpResponseRedirect('/user/login/') #does not work

urls.py

urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^admin/', admin.site.urls),
url(r'^user/', include('userauth.urls', namespace='userauth')),
...

现在请求.META信息应该告诉我,出了什么问题?

1 个答案:

答案 0 :(得分:1)

您的django应用程序似乎没有/django_app路径的路由器。您必须在" django_server.com"中将/ django_app在reverse_proxy中重写为/。服务器或在您的应用中配置路由。

尝试将以下位置添加到django_server.com服务器:

... 

location ~ ^/django_app(.*)$ {
  try_files $uri $1 /$1;
}

location / {
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Proto $scheme;

  proxy_set_header Host $http_host;
  proxy_redirect off;

  proxy_pass http://gunicorn_socket/;
}