与gunricorn + nginx的Flask重定向(url_for)错误

时间:2014-03-10 21:46:01

标签: python nginx flask reverse-proxy gunicorn

我的烧瓶应用程序中的重定向(url_for)功能出现问题。

任何重定向(url_for(“index”))行都会将应用程序从 domain.com/app 重定向到 ip-addr / app < / em> ,其中 ip-addr 是我自己的客户端机器ip,而不是服务器的。

这让我很困惑,我不知道问题究竟发生在哪里,因为它只发生在服务器而不是任何本地测试。

详细信息:

我正在使用http://flask.pocoo.org/snippets/35/中的反向代理设置。 我的nginx配置设置如此

location /app {
                proxy_set_header X-Script-Name /app;
                proxy_set_header Host $http_host;
                proxy_set_header X-Forwarded-Host $proxy_add_x_forwarded_for;
                proxy_redirect off;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Scheme $scheme;
                proxy_connect_timeout 60;
                proxy_read_timeout 60;
                proxy_pass http://localhost:8000/;
        }

我有一个gunicorn运行我的烧瓶应用程序作为一个暴发户的任务。 任何提示?

编辑:

所以我挖了一下,发现这个git报告有类似的问题,https://github.com/omab/django-social-auth/issues/157

Nginx - Gunicorn通过localhost(127.0.0.1:1234)为Nginx服务。不幸的是,当我使用社交平台进行身份验证时,重定向URL social-auth将它们发送到127.0.0.1:1234/twitter/complete,这显然无法通过客户端的浏览器解析。

似乎我的Flask应用程序没有获取更新其重定向路由的备忘录。

5 个答案:

答案 0 :(得分:10)

我找到了解决方案。我必须使用redirect(url_for(location, _external=True))进行所有重定向。

似乎url_for(x, _external=True)会将我的nginx proxy_set_header中的所有变量构建为url,而url_for(x)不会这样做。

这适用于服务器和本地开发。

答案 1 :(得分:3)

添加include proxy_params为我修复了该问题。

location / {
    proxy_pass http://...;
    include proxy_params;
}

答案 2 :(得分:1)

有同样的问题。您的解决方案使应用程序必须通过在每个环境的config var上设置它来了解它正在运行的域。我发现HERE解决方案实际上是在nginx proxy_pass上重写头文件,如下所示:

location /api {
       # Define the location of the proxy server to send the request to
       proxy_pass http://web:8000;

       # Redefine the header fields that NGINX sends to the upstream server
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

       # Define the maximum file size on file uploads
       client_max_body_size 5M;
   }

答案 3 :(得分:0)

我已经失去了2个晚上,我终于使用这个解决方案解决了它:http://blog.macuyiko.com/post/2016/fixing-flask-url_for-when-behind-mod_proxy.html,我的代理设置:

ProxyPass /crm http://localhost:5013/
ProxyPassReverse /crm http://localhost:5013/

ReverseProxy类工作得很好,诀窍是&#34; script_name&#34;它最初没有包含在这里的代码段中:http://flask.pocoo.org/snippets/35/我想从烧瓶页面剪切的内容与ngnix一起使用,这适用于apache2代理。希望如果有人带着同样的问题再次来到这里(包括未来我),这会有所帮助

答案 4 :(得分:-1)

我有类似的问题。当我使用gunicorn运行服务器时,我的服务器在@return redirect(url_for('login'))崩溃。 有关解决方案,请转到Flask app running with gunicorn and nginx is crashing at redirecting point