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 # Imrimir 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
Fuente: linuxito