在后台启动flask服务器
我有一个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 个回答
试试Supervisord吧。它可以以指定的用户身份启动命令,并在这些命令结束后自动重启。它的配置非常简单,适合你想要做的事情。
最好的办法可能是在nginx后面运行,就像@RaphDG回答的那样。不过,如果你想在后台运行它供个人使用,我发现日志系统不允许你仅仅在命令行末尾加上"&"。另外,我发现这个日志记录器是Werkzeug库的内部日志记录器。
为了绕过这个问题,你可以按照以下步骤操作(代码在下面):
- 导入werkzeug._internal
- 创建一个新的日志类
- 将这个新类分配给werkzeug._internal._log(日志类)
这样就可以避免通知和日志记录器的干扰,让你可以在后台运行这个进程(加上"&")
代码:
import werkzeug._internal
def demi_logger(type, message,*args,**kwargs):
pass
在__main__中的第一行:
werkzeug._internal._log = demi_logger
$ python phantom.py &
这可能是让它在后台运行的最简单方法。不过,正如@LukasGraf提到的,如果你打算把你的flask应用放到生产环境中,就不应该使用app.run()这个服务器来运行你的应用,文档里也有类似的说明。
我最喜欢在生产环境中使用的方法是将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