Nginx,Docker,Gunicorn和Flask的代理重定向错误

时间:2019-05-07 03:17:59

标签: docker nginx flask https gunicorn

我正在使用Flask,MariaDB,Nginx,Gunicorn和Docker托管我的网页。我正在使用4个单独的Docker容器(Flask +让我们进行加密,Nginx,Gunicorn和MariaDB),并且网站完全正常运行,通过https连接所有请求,但是通过以下方式重定向时:

return redirect(url_for('main.home'))

地址不解析为

https://mywebsite.com/home

,而是解析为我的docker-compose.yml文件中指定的gunicorn服务的名称:

gunicornservice / home

请注意,我的Flask应用程序是一个名为“ main”的Blueprint()。 url_for()调用中指定的位置是为“ main”指定的路由功能的名称:

@main.route("/home")
def home():
    return render_template('home.html')

我尝试编辑nginx的配置文件,因为我相信这是解决方案所在,因为这可能是转发问题。我在SO上找到了一些类似的帖子,其中之一使用_external = True作为url_for()中的第二个参数引用,但这仅将地址解析为 mywebsite.com/home,它给出了相同的错误

“无法访问此网站

找不到gunicornservice的服务器IP地址。

DNS_PROBE_FINISHED_NXDOMAIN”

我的Nginx配置文件:

events { }

http {

    upstream upstream-web {
        server jonathanolson.us;
    }

    server {
        listen 80;
        server_name gunicornservice;

        location / {
            root /NHL-Project/flasksite/static;
            proxy_pass http://gunicornservice:8000;
            proxy_redirect off;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;
        }
        listen 443 ssl; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/jonathanolson.us/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/jonathanolson.us/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    }

    server {
        if ($host = jonathanolson.us) {
            return 301 https://$host$request_uri;
        } # managed by Certbot


        listen 80;
        server_name jonathanolson.us;
        return 404; # managed by Certbot
    }
}

我希望通过致电

获得结果
return redirect(url_for('main.home'))

返回URL:

https://mywebsite.com/home

但是,它返回URL:

“ gunicornservice / home”

如何调用重定向(url_for())返回我网站的正确页面,例如https://mywebsite.com/home

3 个答案:

答案 0 :(得分:0)

也许设置SERVER_NAME会有所帮助。

答案 1 :(得分:0)

我在SO的另一篇文章中找到了解决方案。在我的代码中插入了更多内容之后,出现了400错误,指出“普通的HTTP请求已发送到HTTPS端口”,这导致我进入了这样的帖子:Dealing with nginx 400 "The plain HTTP request was sent to HTTPS port" error

在这篇文章中,this answer说明了如何插入配置规范,该规范将把HTTP请求正确转发到https。

答案 2 :(得分:0)

我有一个与这篇文章中描述的问题类似的问题,但是我不得不依靠不同的解决方案。

在我的docker-compose文件中,如下设置nginx端口。

 nginx:
   ports:
   - 1337:80

调用重定向命令时,

redirect(url_for('main.home'))

它转发到http:// localhost / requested_uri

不要像我怀疑的那样访问http:// localhost:1337 / requested_uri。

解决方案是更改nginx.config文件中的主机定义。

location / {
        proxy_set_header   Host $host;

已更改为:

location / {
        proxy_set_header   Host $http_host;

区别在于$ host返回$ http_host小写且没有端口号。

使用$ http_host为我解决了重定向问题。