Подтвердить что ты не робот

Запуск сервера фляжки в фоновом режиме

У меня есть приложение для колб, которое я сейчас запускаю следующим образом:

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

и когда я запускаю этот script, он успешно выполняет печать:

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

Но он никогда не возвращается, и если я делаю CTRL-C, сервер останавливается. Я пытаюсь развернуть это на производство и хочу запустить этот запуск в фоновом режиме, где процесс остается до тех пор, пока сервер не работает.

Каков наилучший способ сделать это?

4b9b3361

Ответ 1

Мой любимый способ сделать это на производстве - комбинировать флягу с 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 и установите колбу:

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 - имя вашего экземпляра фляги. Так что, если ваш сайт фляги был в файле с именем 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

$ python phantom.py &

Возможно, это самый простой способ заставить его работать в фоновом режиме. Тем не менее, вы не должны использовать сервер app.run(), чтобы служить вашему флеш-приложению, если вы перемещаете его в производство, как @LukasGraf упоминает (а также я считаю, что их документация)

Ответ 3

Попробуйте Supervisord. Он запускает команды как заданный пользователь и перезапускает их после их завершения. Конфигурация очень проста для того, что вы хотите сделать.

Ответ 4

Вероятно, лучший способ сделать это за nginx, как ответил @RaphDG, но если вы хотите запустить его в фоновом режиме для личного использования, я обнаружил, что система ведения журнала не позволит вам использовать только с "&" в конце Кроме того, я обнаружил, что регистратор является внутренним регистратором библиотеки 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