在后台启动flask服务器

24 投票
4 回答
54475 浏览
提问于 2025-04-18 14:39

我有一个Flask应用程序,目前是这样启动的:

#phantom.py
__author__ = 'uruddarraju'
from phantom.api.v1 import app
app.run(host='0.0.0.0', port=8080, debug=True)

当我运行这个脚本时,它成功执行并打印出:

loading config from /home/uruddarraju/virtualenvs/PHANTOMNEW/Phantom/etc/phantom/phantom.ini
* Running on http://0.0.0.0:8080/

但是它从来没有返回,如果我按CTRL-C,服务器就会停止。我想把这个应用部署到生产环境中,希望能在后台运行,这样只要服务器还在,进程就能一直保持运行。

有什么好的方法可以做到这一点呢?

4 个回答

0

试试Supervisord吧。它可以以指定的用户身份启动命令,并在这些命令结束后自动重启。它的配置非常简单,适合你想要做的事情。

2

最好的办法可能是在nginx后面运行,就像@RaphDG回答的那样。不过,如果你想在后台运行它供个人使用,我发现日志系统不允许你仅仅在命令行末尾加上"&"。另外,我发现这个日志记录器是Werkzeug库的内部日志记录器。

为了绕过这个问题,你可以按照以下步骤操作(代码在下面):

  1. 导入werkzeug._internal
  2. 创建一个新的日志类
  3. 将这个新类分配给werkzeug._internal._log(日志类)

这样就可以避免通知和日志记录器的干扰,让你可以在后台运行这个进程(加上"&")

代码:

import werkzeug._internal

def demi_logger(type, message,*args,**kwargs):
    pass

__main__中的第一行:

werkzeug._internal._log = demi_logger
20
$ python phantom.py &

这可能是让它在后台运行的最简单方法。不过,正如@LukasGraf提到的,如果你打算把你的flask应用放到生产环境中,就不应该使用app.run()这个服务器来运行你的应用,文档里也有类似的说明。

17

我最喜欢在生产环境中使用的方法是将flask与uwsgi和nginx结合起来,以保持数据的持久性。这里有一些很好的设置说明,可以帮助你入门:http://www.markjberger.com/flask-with-virtualenv-uwsgi-nginx/

简要说明:

首先,确保你的虚拟私人服务器(vps)已经更新到最新版本:

sudo apt-get update
sudo apt-get upgrade

接下来安装python和virtualenv:

sudo apt-get install build-essential python-dev python-pip
sudo pip install virtualenv

为你的网站创建一个文件夹:

sudo mkdir -p /var/www/mysite
sudo chown -R <your user id> /var/www/mysite
cd /var/www/mysite

设置virtualenv并安装flask:

virtualenv .env --no-site-packages
source .env/bin/activate
pip install flask

把你的flask应用放在这个文件夹里。确保你的主机设置为0.0.0.0,并且你的应用在__name__ == '__main__':下面。如果你的应用在一个函数里,uwsgi就无法调用它。

现在是用flask开发服务器测试你的应用的好时机,看看到目前为止一切是否正常。如果一切顺利,安装nginx和uwsgi:

deactivate
sudo apt-get install nginx uwsgi uwsgi-plugin-python

接下来,我们需要为nginx创建一个socket文件,以便它可以与uwsgi通信:

cd /tmp/
touch mysite.sock
sudo chown www-data mysite.sock

通过将mysite.sock的所有者更改为www-data,nginx就可以写入这个socket。现在我们只需要为nginx和uwsgi添加配置文件。首先,删除nginx的默认配置:

cd /etc/nginx/sites-available
sudo rm default

创建一个新的配置文件mysite,并添加以下内容:

server {
    listen 80;
    server_tokens off;
    server_name www.mysite.com mysite.com;

     location / {
         include uwsgi_params;
         uwsgi_pass unix:/tmp/mysite.sock;
     }

     location /static {
         alias /var/www/mysite/static;
     }

     ## Only requests to our Host are allowed
     if ($host !~ ^(mysite.com|www.mysite.com)$ ) {
        return 444;
     }
}

为了启用这个站点,我们必须将配置文件链接到/etc/nginx/sites-enabled/:

sudo ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/mysite

uwsgi的过程类似。创建文件/etc/uwsgi/apps-available/mysite.ini,并添加以下内容:

[uwsgi]
vhost = true
socket = /tmp/mysite.sock
venv = /var/www/mysite/.env
chdir = /var/www/mysite
module = app
callable = app

模块是你的python脚本的名称,callable是你的flask实例的名称。所以如果你的flask网站在一个名为mysite.py的文件里,内容如下:

from flask import Flask
my_app = Flask(__name__)

@my_app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    my_app.run(host='0.0.0.0')

你的mysite.ini文件将是:

module = mysite
callable = my_app

将配置文件链接到enabled-apps文件夹:

sudo ln -s /etc/uwsgi/apps-available/mysite.ini /etc/uwsgi/apps-enabled/mysite.ini

最后,重启nginx和uwsgi:

sudo service nginx restart
sudo service uwsgi restart

撰写回答