Servidor web · 8 min read · Feb 03, 2026

Instalando Nginx con PHP y MariaDB (como reemplazo de MySQL) - LEMP - en Ubuntu 15.10 (Wiley Werewolf)

Nginx (pronunciado “engine x”) es un servidor HTTP gratuito, de código abierto y de alto rendimiento. Nginx es conocido por su estabilidad, conjunto de características ricas, configuración simple y bajo consumo de recursos. Este tutorial muestra cómo puedes instalar Nginx en un servidor Ubuntu 15.10 con soporte para PHP (a través de PHP-FPM) y MariaDB (como reemplazo de MySQL). El término LEMP significa: Linux + Nginx + MySQL + PHP.

1 Nota Preliminar

En este tutorial, usaré el nombre de host server1.example.com con la dirección IP 192.168.1.100. Estas configuraciones pueden diferir para ti, así que debes reemplazarlas donde sea apropiado.

2 Instalando MariaDB

Instalaré MariaDB en lugar de MySQL, MariaDB es un fork de MySQL mantenido por el fundador original de MySQL, Monty Widenius, que tiene algunas mejoras de velocidad y características en comparación con MySQL. Para instalar MariaDB, ejecuta:

sudo apt-get -y install mariadb-server mariadb-client

Actualmente, MariaDB no tiene una contraseña establecida para el usuario root. Ejecuta el comando mysql_secure_installation para configurar una contraseña y eliminar la base de datos de prueba.

sudo mysql_secure_installation

Se te harán estas preguntas:

Introduce la contraseña actual para root (presiona enter si no hay): <-- presiona enter  
¿Establecer contraseña para root? [Y/n] <-- y  
Nueva contraseña: <-- Introduce la nueva contraseña de root de MariaDB aquí  
Repite la nueva contraseña: <-- Repite la contraseña  
¿Eliminar usuarios anónimos? [Y/n] <-- y  
¿Deshabilitar el inicio de sesión remoto para root? [Y/n] <-- y  
¿Recargar las tablas de privilegios ahora? [Y/n] <-- y

3 Instalando Nginx

Nginx está disponible como un paquete para Ubuntu 15.10. Puede que el servidor web apache esté instalado en tu servidor y esto podría causar un conflicto. Verifica que apache no esté en ejecución:

ps aux | grep apache2

Si este comando no devuelve ningún resultado, procede con la instalación de Nginx.

Elimina apache en caso de que el comando anterior muestre algunos procesos de apache con estos comandos:

sudo systemctl stop apache2.service  
sudo systemctl disable apache2.service  
sudo apt-get remove apache2

Ahora podemos instalar nginx.

sudo apt-get install nginx

Inicia Nginx después:

sudo systemctl start nginx.service  
sudo systemctl enable nginx.service

Escribe la dirección IP o el nombre de host de tu servidor web en un navegador (por ejemplo, http://192.168.1.100), y deberías ver la siguiente página:

Página predeterminada de Ubuntu Nginx.

¿Por qué muestra “Apache2” en lugar de Nginx en esa página? El texto de la página no refleja el servidor web en ejecución actual, la página anterior es solo la página predeterminada en Ubuntu en la raíz del documento /var/www/html/ que es utilizada por Apache y Nginx. Para verificar que Nginx está sirviendo realmente esta página, puedes mirar los encabezados HTTP en la consola de análisis de red de Firefox:

Verificar encabezados http de Nginx.

O puedes verificar en la terminal que nginx está en ejecución con:

ps aux | grep nginx

El resultado debería mostrar los procesos de nginx así:

Verificar procesos de Nginx.

4 Instalando PHP5

Podemos hacer que PHP5 funcione en Nginx a través de PHP-FPM. PHP-FPM (FastCGI Process Manager) es una implementación alternativa de PHP FastCGI con algunas características adicionales útiles para sitios de cualquier tamaño, especialmente sitios más concurridos, que instalamos de la siguiente manera:

sudo apt-get install php5-fpm

PHP-FPM es un proceso daemon (con el script de inicio php5-fpm) que ejecuta un servidor FastCGI en el socket /var/run/php5-fpm.sock.

5 Configurando Nginx

La configuración de Nginx está en el archivo /etc/nginx/nginx.conf que abrimos ahora en el editor nano:

sudo nano /etc/nginx/nginx.conf

La configuración es fácil de entender (puedes aprender más sobre ella aquí: http://wiki.nginx.org/NginxFullExample y aquí: http://wiki.nginx.org/NginxFullExample2)

Primero (esto es opcional) establece el keepalive_timeout a un valor razonable:

[...]
    keepalive_timeout   2;
[...]

Los hosts virtuales se definen en contenedores server {}. El vhost predeterminado se define en el archivo /etc/nginx/sites-available/default - modifiquémoslo de la siguiente manera:

sudo nano /etc/nginx/sites-available/default
##  
# Deberías mirar las siguientes URL's para comprender bien  
# los archivos de configuración de Nginx para liberar todo el  
# potencial de Nginx.  
# http://wiki.nginx.org/Pitfalls  
# http://wiki.nginx.org/QuickStart  
# http://wiki.nginx.org/Configuration  
#  
# Generalmente, querrás mover este archivo a otro lugar, y comenzar con un archivo limpio  
# pero mantén este a mano como referencia. O simplemente desactívalo en sites-enabled.  
#  
# Por favor, consulta /usr/share/doc/nginx-doc/examples/ para ejemplos más detallados.  
##  
  
# Configuración del servidor predeterminado  
#  
server {  
 listen 80 default_server;  
 listen [::]:80 default_server;  
  
 # Configuración SSL  
 #  
 # listen 443 ssl default_server;  
 # listen [::]:443 ssl default_server;  
 #  
 # Nota: Debes deshabilitar gzip para el tráfico SSL.  
 # Ver: https://bugs.debian.org/773332  
 #  
 # Infórmate sobre ssl_ciphers para asegurar una configuración segura.  
 # Ver: https://bugs.debian.org/765782  
 #  
 # Certificados autofirmados generados por el paquete ssl-cert  
 # ¡No los uses en un servidor de producción!  
 #  
 # include snippets/snakeoil.conf;  
  
 root /var/www/html;  
  
 # Agrega index.php a la lista si estás usando PHP  
 index index.php index.html index.htm index.nginx-debian.html;  
  
 server_name _;  
  
 location / {  
 # Primer intento de servir la solicitud como archivo, luego  
 # como directorio, luego retrocede a mostrar un 404.  
 try_files $uri $uri/ =404;  
 }  
  
 # pasar los scripts PHP al servidor FastCGI escuchando en 127.0.0.1:9000  
 #  
 location ~ \.php$ {  
  include snippets/fastcgi-php.conf;  
   
  # Con php5-cgi solo:  
  # fastcgi_pass 127.0.0.1:9000;  
  # Con php5-fpm:  
  fastcgi_pass unix:/var/run/php5-fpm.sock;  
 }  
  
 # denegar acceso a archivos .htaccess, si la raíz del documento de Apache  
 # coincide con la de nginx  
 #  
 #location ~ /\.ht {  
 # deny all;  
 #}  
}  
  
# Configuración del Host Virtual para example.com  
#  
# Puedes mover eso a un archivo diferente bajo sites-available/ y crear un enlace simbólico  
# a sites-enabled/ para habilitarlo.  
#  
#server {  
# listen 80;  
# listen [::]:80;  
#  
# server_name example.com;  
#  
# root /var/www/example.com;  
# index index.html;  
#  
# location / {  
# try_files $uri $uri/ =404;  
# }  
#}

servername ; hace de este un vhost predeterminado que captura todo (por supuesto, también puedes especificar un nombre de host aquí como www.example.com).

He agregado index.php a la línea de índice. root /usr/share/nginx/html; significa que la raíz del documento es el directorio /usr/share/nginx/html.

La parte importante para PHP es la estrofa location ~ .php$ {}. Descoméntala para habilitarla. Ten en cuenta que es importante habilitar la línea “include snippets/fastcgi-php.conf;” dentro de la estrofa de ubicación PHP para prevenir exploits de día cero (ver http://wiki.nginx.org/Pitfalls#Passing_Uncontrolled_Requests_to_PHP y http://forum.nginx.org/read.php?2,88845,page=3).

Ahora guarda el archivo y recarga nginx:

sudo service nginx reload

A continuación, abre /etc/php5/fpm/php.ini…

sudo nano /etc/php5/fpm/php.ini

… y establece cgi.fix_pathinfo=0:

[...]
; cgi.fix_pathinfo proporciona soporte *real* para PATH_INFO/PATH_TRANSLATED para CGI. PHP's
; el comportamiento anterior era establecer PATH_TRANSLATED en SCRIPT_FILENAME, y no entender
; qué es PATH_INFO. Para más información sobre PATH_INFO, consulta las especificaciones de cgi. Establecer
; esto en 1 hará que PHP CGI corrija sus rutas para ajustarse a la especificación. Un ajuste
; de cero hace que PHP se comporte como antes. El valor predeterminado es 1. Deberías corregir tus scripts
; para usar SCRIPT_FILENAME en lugar de PATH_TRANSLATED.
; http://php.net/cgi.fix-pathinfo
cgi.fix_pathinfo=0
[...]

Recarga PHP-FPM:

sudo service php5-fpm reload

Ahora crea el siguiente archivo PHP en la raíz del documento /var/www/html:

sudo nano /var/www/html/info.php

Ahora llamamos a ese archivo en un navegador (por ejemplo, http://192.168.1.100/info.php):

Información de PHP-FPM.

Como ves, PHP5 está funcionando, y está funcionando a través de FPM/FastCGI, como se muestra en la línea de API del servidor. Si desplazas hacia abajo, verás todos los módulos que ya están habilitados en PHP5. MySQL no está listado allí, lo que significa que aún no tenemos soporte para MySQL en PHP5.

6 Obteniendo Soporte de MariaDB / MySQL en PHP

Para obtener soporte de MySQL en PHP, podemos instalar el paquete php5-mysqlnd. Es una buena idea instalar algunos otros módulos de PHP5 también, ya que podrías necesitarlos para tus aplicaciones. Puedes buscar módulos de PHP5 disponibles así:

apt-cache search php5

Elige los que necesites e instálalos así:

sudo apt-get install php5-mysqlnd php5-curl php5-gd php5-intl php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-ming php5-ps php5-pspell php5-recode php5-sqlite php5-tidy php5-xmlrpc php5-xsl

APCu es un caché de opcodes PHP gratuito para almacenar en caché y optimizar el código intermedio de PHP. Es similar a otros cachés de opcodes PHP, como eAccelerator y Xcache. Se recomienda encarecidamente tener uno de estos instalados para acelerar tu página PHP.

APC se puede instalar de la siguiente manera:

sudo apt-get install php5-apcu

Ahora recarga PHP-FPM:

sudo service php5-fpm reload

Ahora recarga http://192.168.1.100/info.php en tu navegador y desplázate hacia abajo a la sección de módulos nuevamente. Ahora deberías encontrar muchos nuevos módulos allí, incluido el módulo de MySQL:

Información de PHP-FPM - parte 2

7 Haciendo que PHP-FPM use una Conexión TCP

Por defecto, PHP-FPM está escuchando en el socket /var/run/php5-fpm.sock. También es posible hacer que PHP-FPM use una conexión TCP. Para hacer esto, abre /etc/php5/fpm/pool.d/www.conf…

sudo nano /etc/php5/fpm/pool.d/www.conf

… y haz que la línea listen se vea así:

[...]
;listen = /var/run/php5-fpm.sock
listen = 127.0.0.1:9000
[...]

Esto hará que PHP-FPM escuche en el puerto 9000 en la IP 127.0.0.1 (localhost). Asegúrate de usar un puerto que no esté en uso en tu sistema.

Luego recarga PHP-FPM:

sudo php5-fpm reload

A continuación, revisa tu configuración de nginx y todos tus vhosts y cambia la línea fastcgi_pass unix:/var/run/php5-fpm.sock; a fastcgi_pass 127.0.0.1:9000;, por ejemplo, así:

sudo nano /etc/nginx/sites-available/default
[...]
   
 location ~ \.php$ {  
   include snippets/fastcgi-php.conf;  
  
   # Con php5-cgi solo:  
   fastcgi_pass 127.0.0.1:9000;  
   # Con php5-fpm:  
   # fastcgi_pass unix:/var/run/php5-fpm.sock;  
 }  

[...]

Finalmente, recarga nginx:

sudo service nginx reload

8 Descarga de la imagen de máquina virtual de este tutorial

Este tutorial está disponible como una imagen de máquina virtual lista para usar en formato ovf/ova, compatible con VMWare y Virtualbox. La imagen de la máquina virtual utiliza los siguientes detalles de inicio de sesión:

Inicio de sesión SSH / Shell

Nombre de usuario: administrator
Contraseña: howtoforge

Este usuario tiene derechos sudo.

Inicio de sesión de MariaDB

Nombre de usuario: root
Contraseña: howtoforge

La IP de la VM es 192.168.1.100, se puede cambiar en el archivo /etc/network/interfaces. Por favor, cambia todas las contraseñas anteriores para asegurar la máquina virtual.

9 Enlaces

Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.