【问题标题】:nginx reverse proxy for nginx+gunicorn+django servernginx+gunicorn+django服务器的nginx反向代理
【发布时间】:2017-07-17 04:01:25
【问题描述】:

一个 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 正在为其他几个站点提供服务并且可以正常工作,我还使用静态 html 站点测试了与 django_server.com 的连接,这也可以。所以问题似乎出在 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;
}

有什么想法吗?

编辑我: 我已经用 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')),
...

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

【问题讨论】:

    标签: django nginx reverse-proxy


    【解决方案1】:

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

    尝试将以下位置添加到您的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/;
    }
    

    【讨论】:

    • 现在可以通过 django_app.com/django_app 访问该应用,但reverse_proxy.com/django_app 仍然给出 404 错误
    • 那么你很可能有一个额外的位置优先于你在 reverse_proxy 服务器中的/django_app 位置,尝试将它移动到任何/ 位置之前(或临时注释掉除要调试的位置之外的所有内容. 无论如何,error.log 你现在告诉你问题是什么......
    • 当注释掉 /location 并且 /django_app 是第一个位置时,它在 reverse_proxy nginx 中给出 2 个错误:..."/etc/nginx/html/index.html" is not found (2:没有这样的文件或目录),......请求:“GET / HTTP/1.1”和......“/etc/nginx/html/user/login/index.html”未找到(2:没有这样的文件或目录), ... 请求:“GET /user/login/HTTP/1.1”
    • 嗯,那是现在唯一的位置吗?如果是这样,在我看来它像是一个错字或尝试将您在其他“django_server”服务器中的确切位置。
    • 好的,我首先做了一些基本的调试,我用一个简单的 HttpResponse("Hello world") 替换了从 /user/login 的重定向,并且可以从 https://proxy_server.com/django_app 工作(没有重写),所以它不能是 reverse_proxy 的错字吗?所以第一个错误是在 HttpResponseRedirect
    猜你喜欢
    • 1970-01-01
    • 2020-08-19
    • 2013-06-04
    • 2017-08-16
    • 2020-09-22
    • 2014-07-22
    • 1970-01-01
    • 2020-06-29
    • 2019-06-15
    相关资源
    最近更新 更多