Arrancando el servidor del matraz en segundo plano

Tengo una aplicación de matraz que actualmente estoy iniciando de la siguiente manera:

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

y cuando ejecuto este script, se ejecuta correctamente imprimiendo:

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

Pero nunca vuelve y si hago un CTRL-C el servidor se detiene. Estoy tratando de implementar esto en producción y quiero ejecutar este inicio en segundo plano, donde el proceso permanece activo mientras el servidor esté activo.

¿Cuál es la mejor manera de hacer esto?

Mi forma favorita de hacerlo en producción es combinar el matraz con uwsgi y nginx para mantener la persistencia. Aquí están las instrucciones de configuración para comenzar: http://www.markjberger.com/flask-with-virtualenv-uwsgi-nginx/

Jist

Primero asegúrese de que su vps tenga las últimas actualizaciones:

 sudo apt-get update sudo apt-get upgrade 

Ahora instala python y virtualenv:

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

Haga una carpeta para su sitio web:

 sudo mkdir -p /var/www/mysite sudo chown -R  /var/www/mysite cd /var/www/mysite 

Configurar virtualenv e instalar el matraz:

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

Coloque su aplicación matraz en esta carpeta. Asegúrate de que tu host esté configurado en 0.0.0.0 y que tu aplicación esté bajo si __name__ == '__main__': Si su aplicación está en una función, uwsgi no podrá llamarlo.

Ahora es un buen momento para probar su aplicación con el servidor de desarrollo de matraz para ver si todo está funcionando hasta ahora. Si todo funciona sin problemas, instale nginx y uwsgi:

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

Luego debemos crear un archivo de socket para que nginx se comunique con uwsgi:

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

Al cambiar el propietario de mysite.sock a www-data, nginx podrá escribir en el socket. Ahora todo lo que tenemos que hacer es agregar nuestros archivos de configuración para nginx y uwsgi. Primero elimine la configuración por defecto para nginx:

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

Cree un nuevo archivo de configuración de mi sitio y agregue lo siguiente:

 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; } } 

Para habilitar el sitio, debemos vincular nuestro archivo de configuración a / etc / nginx / sites-enabled /:

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

El proceso es similar para uwsgi. Cree el archivo /etc/uwsgi/apps-available/mysite.ini y agregue lo siguiente:

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

Módulo es el nombre de su script de python y callable es el nombre de su instancia de matraz. Entonces, si su sitio de flask estaba en un archivo llamado mysite.py que se veía así:

 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') 

Su archivo mysite.ini sería:

 module = mysite callable = my_app 

Enlace el archivo de configuración a la carpeta de aplicaciones habilitadas:

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

Finalmente, reinicie nginx y uwsgi:

 sudo service nginx restart sudo service uwsgi restart 
 $ python phantom.py & 

Es probablemente la forma más fácil de hacer que se ejecute en segundo plano. Dicho esto, no debe utilizar el servidor app.run () para servir a su aplicación de flask si lo está moviendo a producción como menciona @LukasGraf (y creo que su documentación)

Pruebe Supervisord . Inicia los comandos como un usuario específico y los reinicia después de que terminen. La configuración es muy simple para lo que quieres hacer.

Probablemente la mejor manera de hacerlo es detrás de nginx como @RaphDG respondió. Pero si desea ejecutarlo en segundo plano para uso personal, descubrí que el sistema de registro no le permitiría usar solo con “&” al final de línea de comandos, además, encontré que el registrador es un registrador interno de la biblioteca Werkzeug.

Para solucionar esto, puede realizar los siguientes pasos ( código a continuación ):

  1. importacion werkzeug._internal
  2. crear clase demi logger
  3. Asigne la nueva clase a werkzeug._internal._log (clase de registro)

Evadirá las notificaciones y los registradores y le permitirá ejecutar este proceso en segundo plano (con “&”)

código:

 import werkzeug._internal def demi_logger(type, message,*args,**kwargs): pass 

la primera línea en el __main__ :

 werkzeug._internal._log = demi_logger