Este artículo explica cómo montar un servidor LAMP utilizando la combinación Linux+Apache+Python+MySQL sobre distribuciones Debian y derivadas.



En esta oportunidad voy a utilizar un servidor Devuan Jessie (Debian Jessie libre de systemd) para llevar a cabo la tarea.

Antes de comenzar es recomendable actualizar el sistema:

# apt-get update
# apt-get upgrade

Luego instalar el servidor de bases de datos MySQL y el servidor Web Apache ejecutando:

# apt-get install mysql-server
# apt-get install apache2

Desde un navegador es posible verificar el funcionamiento de Apache:

Verificar que el sistema cuente con Python instalado:

root@devuan:~# python --version
Python 2.7.9

Si no se encuentra instalado, ejecutar:

# apt-get install python

Configuración de Apache

Por defecto, Apache utiliza el módulo de procesamiento MPM (Multi-Processing Module) event, el cual implementa un servidor híbrido conformado por subprocesos multihilados. Aunque muchas instalaciones utilizan el módulo MPM prefork, que utiliza un pool de procesos hijos (pre-forked), en vez de hilos, para procesar las solicitudes.

Para poder ejecutar scripts Python, es necesario habilitar el módulo cgi (Common Gateway Interface). Sin embargo, cuando se utiliza un servidor multihilado se debe reemplazar por cgid. Así que, dependiendo del tipo de instalación, se deberán ejecutar los siguientes comandos para que Apache tenga la capacidad de ejecuar scripts Python.

Si se utiliza prefork:

# a2enmod mpm_prefork cgi

Si en cambio se utiliza event:

# a2enmod mpm_event cgid

O si se utiliza worker:

# a2enmod mpm_worker cgid

Luego será necesario reiniciar Apache.

A continuación, crear un directorio de trabajo donde alojar la aplicación Web que contiene scripts Python:

root@devuan:~# mkdir /var/www/mypywebapp

Editar el archivo de configuración del sitio Web por defecto (/etc/apache2/sites-available/000-default.conf) para que este directorio sea la raíz del servidor, y sea posible ejecutar scripts Python:

        DocumentRoot /var/www/mypywebapp

        <Directory /var/www/mypywebapp>
                Options +ExecCGI
                DirectoryIndex index.py
        </Directory>
        AddHandler cgi-script .py
        AddDefaultCharset utf-8

Notar que se ha indicado en la configuración del directorio /var/www/mypywebapp que el archivo por defecto es index.py.

Ahora sí, reiniciar Apache para que tome todos los cambios:

root@devuan:~# service apache2 restart
[....] Restarting web server: apache2AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
. ok 

Creación de un script Python para verificar el acceso mediante HTTP

Cambiar al directorio de la aplicación para crear el archivo índice:

root@devuan:~# cd /var/www/mypywebapp/

Crear el archivo por defecto index.py:

root@devuan:/var/www/mypywebapp# nano index.py

Agregar el siguiente contenido a modo de prueba simple de ejecución de código Python:

#!/usr/bin/python
# coding=utf-8

# Imprimir los headers HTTP
print("Content-Type: text/html")
print("")

# Imprimir el contenido de la página
print("<h2>Hola mundo</h2>")
print("<p>Prueba de ejecución de script Python en modo CGI.</p>")

Luego ajustar los permisos adecuadamente:

root@devuan:/var/www/mypywebapp# chown root:www-data index.py 
root@devuan:/var/www/mypywebapp# chmod +x index.py 
root@devuan:/var/www/mypywebapp# ll
total 4
-rwxr-xr-x 1 root www-data 223 Mar  9 07:45 index.py

Se cambia el grupo para que Apache tenga acceso de lectura y se otorga ejecución para todo el mundo. El dueño puede cambiarse según sea necesario (en este ejemplo se deja "root" para que Apache no pueda alterar el contenido del script).

Es posible verificar el script desde línea de comandos:

root@devuan:/var/www/mypywebapp# ./index.py 
Content-Type: text/html

<h2>Hola mundo</h2>
<p>Prueba de ejecución de script Python en modo CGI.</p>

Habiendo comprobado que no posee errores, acceder nuevamente al sitio desde un navegador:

Acceso a una base de datos MySQL desde Python

Por último, resta verificar el acceso a una base de datos MySQL desde Pyhton. Para ello se requiere instalar el paquete pymysql provisto por Python (no por la distribución). Estos paquetes se gestionan con la herramienta pip:

# apt-get install python-pip

Luego de instalar pip, es posible instalar el paquete pymysql que provee acceso a bases de datos MySQL desde scripts Python:

root@devuan:/var/www/mypywebapp# pip install pymysql
Downloading/unpacking pymysql
  Downloading PyMySQL-0.7.2-py2.py3-none-any.whl (76kB): 76kB downloaded
Installing collected packages: pymysql
Successfully installed pymysql
Cleaning up...

Si el servidor se encuentra dentro de una red corporativa que provee el acceso a Internet a través de un Proxy HTTP, es necesario utilizar el parámetro --proxy, por ejemplo:

# pip --proxy http://proxy.linuxito.com:8080 install pymysql

A continuación, es recomendable crear un usuario MySQL para la aplicación Web (jamás utilizar el usuario "root" de MySQL). Conectarse al servidor y ejecutar la consulta create user 'mypywebapp'@'localhost' identified by '123456'; para crear al usuario "mypywebapp" con contraseña "123456" que tiene restringido el acceso sólo desde localhost:

root@devuan:/var/www/mypywebapp# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 49
Server version: 5.5.47-0+deb8u1 (Debian)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create user 'mypywebapp'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.00 sec)

mysql> quit
Bye
root@devuan:/var/www/mypywebapp#

Si se desea se puede crear una base de datos con algunas tablas y datos de prueba, pero sino simplemente se puede consultar la versión de MySQL ejecutando la consulta select @@version.

Editar nuevamente el archivo index.py:

root@devuan:/var/www# nano index.py

Y agregar las siguientes líneas al final del mismo:

# Mostrar la versión de MySQL
import pymysql
con = pymysql.connect(db='', user='mypywebapp', passwd='123456', host='localhost')
c = con.cursor()
c.execute("select @@version")
v = c.fetchall()[0]
print("<p>La versión de MySQL es: <b>%s</b></p>" % v)

Guardar los cambios y verificar el correcto funcionamiento del circuito Apache-Python-MySQL:

Tal como se observa, la instalación y configuración básica es extremadamente sencilla. Para más información revisar las siguientes páginas de manual:

man apache2
man python
man pip
man mysql
man mysqld

Referencias

HOWTO Use Python in the web


Tal vez pueda interesarte


Compartí este artículo