在后台启动烧瓶服务器

时间:2014-07-24 18:55:15

标签: python python-2.7 flask celery

我有一个烧瓶应用程序,我目前正以下列方式启动:

#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 :(得分: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库的内部记录器。

要解决此问题,您可以执行以下步骤(下面的代码):

  1. 导入werkzeug._internal
  2. 创建demi logger类
  3. 将新类分配给werkzeug._internal._log(日志类)

它将逃避通知和记录器,并让您在后台运行此过程(带有“&”)

代码:

import werkzeug._internal

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

__ main __ 中的第一行:

werkzeug._internal._log = demi_logger