如何在云服务器上部署Flask + Gunicorn + Nginx + supervisor?

时间:2016-10-06 03:21:52

标签: python nginx web flask server

自昨天以来,我已经阅读了很多有关此问题的说明,但所有这些说明都有类似的步骤。然而,我一步一步地遵循,但仍然无法让一切都好。

实际上我可以让Flask + Gunicorn +主管工作,但Nginx效果不佳。

我使用SSH连接我的远程云服务器,而我没有在我的计算机上部署该网站。

Nginx已正确安装,因为当我通过域名(又名。example.com)访问该网站时,它会显示Nginx欢迎页面。

我使用supervisor启动Gunicorn,配置为

[program:myapp]
command=/home/fh/test/venv/bin/gunicorn -w4 -b 0.0.0.0:8000 myapp:app
directory=/home/fh/test
startsecs=0
stopwaitsecs=0
autostart=false
autorestart=false
stdout_logfile=/home/fh/test/log/gunicorn.log
stderr_logfile=/home/fh/test/log/gunicorn.err

这里我将服务器绑定到端口 8000 我实际上并不知道0.0.0.0代表什么,但我认为这并不意味着本地主机因为我可以访问网站通过 http://example.com:8000 ,效果很好。

然后我尝试使用Nginx作为代理服务器。

我删除了/etc/nginx/sites-available/default' and '/etc/nginx/sites-enabled/default/并创建了/etc/nginx/sites-available/test.com/etc/nginx/sites-enabled/test.com并对其进行了符号链接。

test.com

server {
        server_name www.penguin-penpen.com;
        rewrite ^ http://example/ permanent;
}

# Handle requests to example.com on port 80
server {
        listen 80;
        server_name example.com;

        # Handle all locations
        location / {
                # Pass the request to Gunicorn
                proxy_pass http://127.0.0.1:8000;

                # Set some HTTP headers so that our app knows where the request really came from
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}

根据我的理解,当我访问http://example.com时,Nginx会做的是将请求传递给http://example.com:8000

我不太确定我应该在这里使用proxy_pass http://127.0.0.1:8000,因为我不知道Nginx是否应该将请求传递给localhost 但我已经尝试将其更改为0.0.0.0:8000但它仍然不起作用。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

0.0.0.0表示服务器将接受来自所有IP地址的连接。有关详细信息,请参阅https://en.wikipedia.org/wiki/0.0.0.0

如果gunicorn服务器侦听127.0.0.1,则只有您(或同一台带有gunicorn服务器的其他人)可以通过本地循环https://en.wikipedia.org/wiki/Local_loop访问它。

但是,由于您使用Nginx接受来自互联网的连接,您只需proxy_pass http://127.0.0.1:8000;并将命令更改为command=/home/fh/test/venv/bin/gunicorn -w4 -b 127.0.0.1:8000 myapp:app。在这种情况下,gunicorn本身只需要接受来自Nginx的连接,该连接在与gunicorn相同的机器上运行。

整个过程看起来像这样

Connections from the Internet -> Nginx (reverse proxy, listen on 0.0.0.0:80) -> Gunicorn (which runs your Python code, listen on 127.0.0.1:8000)