
Introducción:
PHP (Hypertext Preprocessor) es un lenguaje de programación de propósito general enfocado en el desarrollo web. Creado en 1995, es uno de los lenguajes más populares para construir aplicaciones web dinámicas debido a su facilidad de uso, amplia documentación y soporte de una gran comunidad.
¿Qué son las Aplicaciones Web PHP?
Las aplicaciones web en PHP son programas diseñados para ejecutarse en un servidor y generar contenido dinámico que se entrega al usuario final a través de un navegador web.
Estas aplicaciones se comunican con el servidor para procesar datos, gestionar bases de datos, manejar formularios, y generar páginas HTML de manera dinámica, entre otras muchas funciones y características:
- Dinámicas: PHP permite la creación de contenido web que puede cambiar en función de las entradas del usuario o de datos externos, como bases de datos.
- Servidor-Centrada: A diferencia de los lenguajes de scripting del lado del cliente (como JavaScript), PHP se ejecuta en el servidor, lo que significa que el código PHP no es visible para el usuario final.
- Integración con Bases de Datos: PHP se puede integrar fácilmente con múltiples bases de datos, como MySQL, PostgreSQL, MariaDB, etc. Esto facilita el almacenamiento y la gestión de grandes volúmenes de datos en aplicaciones web.
- Compatible con HTML: PHP se puede incrustar directamente en el código HTML.
Ejemplos de Aplicaciones Web en PHP:
- Gestores de Contenidos (CMS): WordPress, Joomla y Drupal. Plataformas PHP que permiten a los usuarios crear y gestionar sitios web sin necesidad de conocimientos de programación.
- Comercio Electrónico: Soluciones de comercio electrónico como Magento y WooCommerce utilizan PHP para gestionar catálogos de productos, carritos de compra, sistemas de pago, etc.
- Aplicaciones Personalizadas: Muchas empresas desarrollan sus aplicaciones personalizadas en PHP para servicios en línea, reservas, o incluso de gestión de su intranet y trabajadores.
Objetivo:
En este artículo, veremos una serie de talleres de instalación de distintas aplicaciones web php, y configuración de los servidores web, para poder brindar correctamente las aplicaciones, e incluso de formas distintas, así elegimos la que más nos interese, dependiendo de nuestras necesidades.
Parto de la base de la máquina lamp, recien configurada como vimos en Instalación de un Servidor LAMP .
Taller 1: Instalación de la Aplicación Biblioteca:
Esta aplicación web, es a medida para poder gestionar el control de prestamos de una biblioteca.
Para poder obtener esta aplicación, la descargamos directamente desde su repositorio .
En la máquina LAMP, creo una base de datos llamada biblioteca:
sudo mysql -u root -p
create database biblioteca;
use biblioteca;

Creo un usuario, y le otorgo privilegios totales sobre la base de datos biblioteca:
use biblioteca;
create user 'andres'@'%' identified by 'andres';
grant all privileges on biblioteca.* to 'andres'@'%';
flush privileges;


A continuación, creo el directorio /var/www/biblioteca
y le otorgo privilegios al servidor web:
cd /var/www/
sudo mkdir biblioteca
sudo chown -R www-data:www-data biblioteca/
ls -l

Para que no tengamos problemas de privilegios, lo que hago es crear un grupo llamado webdev, y añado a mi usuario, y al usuario www-data (del servidor web).
Haciendo esto nos evitaremos problemas y errores de acceso o lectura al directorio biblioteca, y subdirectorios, con la opción de que vayan heredando los privilegios lo siguientes ficheros que vayamos añadiendo:
sudo groupadd webdev
sudo usermod -a -G webdev debian
sudo usermod -a -G webdev www-data
sudo chown -R debian:webdev /var/www/biblioteca/
sudo chmod -R 775 /var/www/biblioteca/
sudo chmod g+s /var/www/biblioteca/

Ahora dentro del directorio biblioteca, descargo la aplicación de su enlace oficial:
sudo apt install git
git clone https://github.com/VidaInformatico/Sistema-de-biblioteca-basico-php-8-y-mysql

Copio todo el contenido del nuevo directorio que ha creado git al descargar el repositorio, al directorio padre /var/www/biblioteca
, y elimino el directorio:
cp -r Sistema-de-biblioteca-basico-php-8-y-mysql/. .
rm -rf Sistema-de-biblioteca-basico-php-8-y-mysql/
sudo chown -R debian:webdev /var/www/biblioteca/
- Al terminar, le asigno los privilegios de nuevo ya que cp de esa forma no hereda los privilegios.

La aplicación trae un script de creación de las tablas y datos necesarios para que funcione, por lo que hay que importarlo a nuestra base de datos:
sudo mysql -u root -p
use biblioteca;
source /var/www/biblioteca/biblioteca.sql
Automáticamente, empezará el proceso de creación de tablas e insercciones de datos

Cuando termine podemos comprobar como ha creado todas las tablas:
show tables;

Ahora necesitamos crear un virtualhost para servir la aplicación, por lo que voy a /etc/apache/sites-available
, copio el fichero por defecto y lo utilizo para la bibliteca:
cd /etc/apache2/sites-available
sudo cp 000-default.conf biblioteca.conf
Con el siguiente contenido:
<VirtualHost *:80>
ServerName biblioteca.andres.org
ServerAdmin webmaster@localhost
DocumentRoot /var/www/biblioteca
ErrorLog ${APACHE_LOG_DIR}/biblio_error.log
CustomLog ${APACHE_LOG_DIR}/biblio_access.log combined
</VirtualHost>
Y lo activamos, y de paso activamos el módulo rewrite para poder acceder acceder a una URL e internamente estar accediendo a otra:
sudo a2ensite biblioteca.conf
sudo systemctl reload apache2
sudo a2enmod rewrite
sudo systemctl restart apache2

Para la resolución estática, añadimos la ip de la máquina donde estamos haciendo todo este proceso, a la máquina desde donde vamos a conectarnos por el navegador:
sudo nano /etc/hosts
192.168.122.141 biblioteca.andres.org
La aplicación hay que configurarla para adaptarla a nuestros datos, por lo que hay que modificar el archivo /var/www/biblioteca/Config/config.php
:
sudo nano /var/www/biblioteca/Config/config.php
Añadiendo nuestro virtualhost, el nombre de la base de datos, el usuario y la contraseña, quedando así:
<?php
const base_url = "http://biblioteca.andres.org/";
const host = "localhost";
const user = "andres";
const pass = "andres";
const db = "biblioteca";
const charset = "charset=utf8";
?>

Por último, hay que brindarle acceso al servidor web apache, para que pueda leer el fichero .htaccess:
sudo nano /etc/apache2/apache2.conf
En la sección <Directory /var/www>
, modificando la parte de AllowOverride de none a All:
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>

Y reinicio apache2:
sudo systemctl restart apache2
Como hice en Instalación de un Servidor LAMP
, para saber más información de la aplicación, le añadimos en el DocumentRoot de la aplicación /var/www/biblioteca
un archivo llamado info.php:
sudo nano /var/www/biblioteca/info.php
Con el siguiente contenido:
<?php phpinfo(); ?>
Para comprobar que funciona, desde la otra máquina donde añadimos la ip en /etc/hosts
(como vimos más arriba), al buscar en el navegador nuestro virtualhost:

Ingresamos con el usuario admin y como contraseña admin:

Y listo!, ya estamos dentro del panel de configuración, y nuestra aplicación esta totalmente lista para usar.
Por último, puede que en determinados casos, tengamos que modificar la memoria RAM que puede utilizar, por lo que hay que modificar la memoria máxima de uso de un script PHP que es memory_limit
y por defecto esta configurado a 128MB.
Si por ejemplo, quisiera modificarlo a 256MB, se modifica en el archivo /etc/php/8.2/apache/php.ini
:

Una vez modificado el valor necesario, para que se aplique hay que reiniciar el servidor web:
sudo systemctl restart apache2
Para comprobar que se ha hecho el cambio, se puede comprobar en mi caso, revisando desde el navegador con la opción de info.php, como más arriba:
biblioteca.andres.org/info.php
Taller 2: Configuración de Apache2 + fpm-php:
En esta parte veremos como integrar Apache2 con fpm-php en un entorno LAMP.
Un servidor fpm-php permite optimizar el manejo de aplicaciones PHP al separarlas del servidor web. También se abordará cómo configurar Apache2 como un proxy inverso, redirigiendo las peticiones PHP hacia el servidor de aplicaciones fpm-php para una gestión más eficiente de los procesos.
Siguiendo con la misma máquina, para poder probar esta forma hay que desinstalar el módulo que permite la ejecución de php que es libapache2-mod-php:
sudo apt remove --purge libapache2-mod-php

El módulo que necesitamos instalar es php-fpm:
sudo apt install php-fpm
Por otro lado, apache necesita activar los siguientes módulos para que funcione:
sudo a2enmod proxy_fcgi setenvif
-
proxy_fcgi : Permite a Apache comunicarse con procesos externos como php-fpm utilizando el protocolo FastCGI.
-
setenvif: Permite establecer variables de entorno en función de las condiciones de la solicitud, como cabeceras HTTP o la IP del cliente.

Y reinicio apache2:
sudo systemctl restart apache2
Para comprobar como esta escuchando el módulo php-fpm (si tcp o unix), se comprueba en el archivo /etc/php/8.2/fpm/pool.d/www.conf, en la parte de listen
:
Si es unix → listen = /run/php/php8.2-fpm.sock
Si es tcp → listen = 127.0.0.1:9000
En mi caso es unix:
sudo nano /etc/php/8.2/fpm/pool.d/www.conf

Ahora que ya se que es unix, hay que modificar el archivo de virtualhost de la aplicacion biblioteca (del taller anterior) y luego reiniciar apache:
Añado:
<FilesMatch "\.php$">
SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://127.0.0.1/"
</FilesMatch>
Quedando así:
<VirtualHost *:80>
ServerName biblioteca.andres.org
ServerAdmin webmaster@localhost
DocumentRoot /var/www/biblioteca
<FilesMatch "\.php$">
SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://127.0.0.1/"
</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/biblio_error.log
CustomLog ${APACHE_LOG_DIR}/biblio_access.log combined
</VirtualHost>
Activo el módulo php8.2-fpm (si no lo tengo activado) y reinicio apache:
sudo a2enconf php8.2-fpm
sudo systemctl restart apache2

Para comprobar que se ha aplicado correctamente, hay que comprobarlo en biblioteca.andres.org/info.php
, en la parte de Server API:

La aplicación sigue funcionando correctamente:

En algunos casos, necesitaremos que nuestras aplicaciones se sirvan en puertos distintos , por lo que voy a servir la aplicación biblioteca, en el puerto tcp/9000:
Para realizar esto hay que volver al archivo donde comprobé en que modo escucha /etc/php/8.2/fpm/pool.d/www.conf
y comentar la línea de antes, y en su lugar añadir:
listen = 127.0.0.1:9000

Con este cambio, hay que especificarlo en el virtualhost de la aplicación biblioteca:
sudo nano /etc/apache/sites-available/biblioteca.conf
Quedando así:
<VirtualHost *:80>
ServerName biblioteca.andres.org
ServerAdmin webmaster@localhost
DocumentRoot /var/www/biblioteca
<FilesMatch "\.php$">
SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/biblio_error.log
CustomLog ${APACHE_LOG_DIR}/biblio_access.log combined
</VirtualHost>
Y reinicio apache y php-fpm:
sudo systemctl restart php8.2-fpm
sudo systemctl restart apache2
Y como se ve la aplicación sigue funcionando correctamente:

Si quisiera, modificarle la memoria máxima de uso de un script PHP, es exactamente igual que en el taller anterior.
Taller 3: Instalación de WordPress en un servidor LEMP.
Un servidor LEMP, es lo mismo que un servidor LAMP, con la diferencia de que el servidor web es Nginx en lugar de Apache.
Una alternativa hubiera sido, desinstalar apache e instalar nginx directamente, pero he preferido utilizar otra máquina distinta.
En este caso, he utilizado otra máquina Debian diferente llamada lemp, en la cual he instalado mariadb y he creado un usuario llamado andres de la misma forma que en el Taller 1.
debian@lemp:~$ mysql -u root -p
Creo una base de datos llamada wordpress, y un usuario:
MariaDB [(none)]> create database wordpress;
Query OK, 1 row affected (0,000 sec)
MariaDB [(none)]> use wordpress;
Database changed
MariaDB [wordpress]> create user 'andres'@'%' identified by 'andres';
Query OK, 0 rows affected (0,050 sec)
MariaDB [wordpress]> grant all privileges on wordpress.* to 'andres'@'%';
Query OK, 0 rows affected (0,021 sec)
MariaDB [wordpress]> flush privileges;
Query OK, 0 rows affected (0,001 sec)
Con la base de datos preparada, instalo el servidor web nginx, y los módulos necesarios php:
sudo apt install nginx
sudo apt install php-fpm php-mysql
sudo systemctl start php8.2-fpm
sudo systemctl enable php8.2-fpm
El siguiente paso es ir al directorio /var/www/
y descargar wordpress:
cd /var/www
sudo wget https://wordpress.org/latest.zip
sudo unzip latest.zip
En el directorio /var/www/wordpress
, se encuentran directamente los archivos de este (y no otro subdirectorio llamado wordpress). He eliminado el zip que ya es innecesario, y le he otorgado los privilegios al servidor web sobre el directorio wordpress:
sudo chown -R www-data:www-data wordpress

Creo el virtualhost wordpress.andres.org para servir la aplicación:
cd /etc/nginx/sites-available
sudo nano wordpress
Y añado el siguiente contenido:
server {
listen 80;
root /var/www/wordpress;
index index.php index.html index.htm index.nginx-debian.html;
server_name wordpress.andres.org;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
}
}
Activo el virtualhost, compruebo que no tenga errores, y reinicio nginx:
sudo ln -s /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/
sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
sudo systemctl restart nginx
Hecho esto, en la máquina cliente desde la que me voy a conectar a wordpress.andres.org, hay que realizar la resolución estática como siempre:
sudo nano /etc/hosts
Añadiendo la ip de la máquina donde está alojado wordpress:
192.168.122.142 wordpress.andres.org
Al entrar en esa URL, aparece el asistente de instalación, demostrando que funciona correctamente:


Durante la instalación, hay que indicarle a wordpress, el nombre de la base de datos y el usuario, que he creado al principio, que son wordpress y andres:

Seguirá preguntando datos varios, como el nombre del sitio, un correo, etc:

Una vez finalizada la instalación, podemos acceder con el usuario que acabamos de crear en wordpress, y la contraseña generada durante la instalación, o la que hayamos configurado:

Y con esto ya tenemos completamente operativo nuestro wordpress:
