Ejecución de script python

Apache2 y módulo wsgi

Instalamos el módulo de apache2 que nos permite ejecutar código python: libapache2-mod-wsgi si vamos a trabajar con python2 o libapache2-mod-wsgi-py3 si trabajamos con python3.

Veamos un ejemplo de configuración para una aplicación django. Suponemos que el fichero wsgi se encuentra en el directorio: /var/www/html/mysite/mysite/wsgi.py y configuramos apache2 de la siguiente manera:

<VirtualHost *>
    ServerName www.example.com
    DocumentRoot /var/www/html/mysite
    WSGIDaemonProcess mysite user=www-data group=www-data processes=1 threads=5 python-path=/var/www/html/mysite
    WSGIScriptAlias / /var/www/html/mysite/mysite/wsgi.py

    <Directory /var/www/html/mysite>
            WSGIProcessGroup mysite
            WSGIApplicationGroup %{GLOBAL}
            Require all granted
    </Directory>
</VirtualHost>

Usando servidores wsgi

Otra forma de ejecutar código python es usar servidores de aplicación wsgi. Tenemos a nuestra disposición varios servidores: A Comparison of Web Servers for Python Based Web Applications. Realmente usamos apache2 como proxy inverso que envía la petición python al servidor WSGI que estemos utilizando.

uwsgi

Para instalarlo en Debian 9 Stretch:

apt install uwsgi
apt install uwsgi-plugin-python3

También lo podemos instalar con pip en un entorno virtual.

Despliegue de una aplicación django con uwsgi

Hemos creado una aplicación django en el directorio: /home/debian/myapp para desplegarla con uwsgi ejecutamos:

uwsgi --http :8080 --plugin python --chdir /home/debian/myapp --wsgi-file myapp/wsgi.py --process 4 --threads 2 --master 

Otra alternativa es crear un fichero .ini de configuración, ejemplo.ini de la siguiente manera:

[uwsgi]
http-socket = :8080
chdir = /home/debian/myapp 
wsgi-file = /home/debian/myapp/myapp/wsgi.py
processes = 4
threads = 2
plugin = python3

Y para ejecutar el servidor, simplemente:

uwsgi ejemplo.ini

De esta forma puedo tener varios ficheros de configuración del servidor uwsgi para las distintas aplicaciones python que sirva el servidor.

Podemos tener los ficheros de configuración en /etc/uwsgi/apps-available y para habilitar podemos crear un enlace simbólico a estos ficheros en /etc/uwsgi/apps-enabled.

En el ejemplo anterior hemos usado la opción http para indicar que se va a devolver una respuesta HTTP, podemos usar varias opciones:

  • http: Se comporta como un servidor http.
  • http-socket: Si vamos a utilizar un proxy inverso usando el servidor uwsgi.
  • socket: La respuesta ofrecida por el servidor no es HTTP, es usando el protocolo uwsgi.

Existen muchas más opciones que puedes usar: http://uwsgi-docs.readthedocs.io/en/latest/Options.html.

Apache con uwsgi

Configuración usando HTTP

Necesitamos instalar el módulo de proxy:

# a2enmod proxy proxy_http

La configuración del virtual host podría quedar:

<VirtualHost *:80> 
    ServerAdmin webmaster@localhost
    ProxyPass / http://localhost:8080/
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Como vemos el contenido estático es servido por Apache y el procesamiento de python se pasa al servidor uwsgi.

Configuración usando uWSGI

En este caso en el fichero de configuración de uwsgi, ejemplo.ini, tendríamos que cambiar el modo de funcionamiento:

...
socket = 127.0.0.1:3032
...

Para la comunicación con uwsgi, apache necesita un módulo llamado proxy_uwsgi:

# apt install libapache2-mod-proxy-uwsgi
# a2enmod proxy_uwsgi

Y creamos el fichero de configuración para el servidor virtual que servirá a aplicación django.

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ProxyPass / uwsgi://127.0.0.1:3032/
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>