我有一个烧瓶应用程序,我目前正以下列方式启动:
#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,服务器就会停止。我正在尝试将其部署到生产环境,并希望在后台运行此启动,只要服务器启动,该进程就会保持运行。
这样做的最佳方式是什么?
答案 0 :(得分:16)
$ python phantom.py &
可能是让它在后台运行的最简单方法。这就是说你不应该使用app.run()服务器为你的烧瓶应用程序提供服务,如果你正在将其转移到生产中,因为@LukasGraf提到(以及我相信他们的文档)
答案 1 :(得分:10)
我最喜欢的生产方式是将烧瓶与uwsgi和nginx结合起来以保持持久性。以下是一些很好的设置说明,可帮助您入门:http://www.markjberger.com/flask-with-virtualenv-uwsgi-nginx/
<强> JIST:强>
首先确保您的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
将您的烧瓶应用程序放在此文件夹中。确保您的主机设置为0.0.0.0,并确保您的应用位于__name__ == '__main__':
以下。如果你的应用程序在一个函数中,uwsgi将无法调用它。
现在是用烧瓶开发服务器测试您的应用程序的好时机,看看到目前为止一切是否正常。如果一切顺利,请安装nginx和uwsgi:
deactivate
sudo apt-get install nginx uwsgi uwsgi-plugin-python
接下来,我们必须为nginx创建一个套接字文件,以便与uwsgi进行通信:
cd /tmp/
touch mysite.sock
sudo chown www-data mysite.sock
通过将mysite.sock的所有者更改为www-data,nginx将能够写入套接字。现在我们要做的就是为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
Module是python脚本的名称,callable是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
答案 2 :(得分:0)
试试Supervisord。它以指定用户身份启动命令,并在终止后重新启动它们。配置对于您想要做的事情非常简单。
答案 3 :(得分:0)
可能最好的方法是在像@RaphDG这样的nginx后面, 但是,如果您想在后台运行以供个人使用,我发现 日志记录系统不允许您在命令行末尾仅使用“&”,此外,我发现记录器是Werkzeug库的内部记录器。
要解决此问题,您可以执行以下步骤(下面的代码):
它将逃避通知和记录器,并让您在后台运行此过程(带有“&”)
代码:
import werkzeug._internal
def demi_logger(type, message,*args,**kwargs):
pass
__ main __ 中的第一行:
werkzeug._internal._log = demi_logger