¿Cómo instalar y configurar un servidor LEMP en Debian 7 (Wheezy)?

Actualizado el 13 de septiembre, 2016. Por BlueHosting.

Este documento describe una alternativa compatible con una infraestructura LAMP (Linux, Apache, MySQL y PHP). La infraestructura LEMP remplaza el componente del servidor web Apache (que se corresponde con la "A" en LAMP) con Nginx (o "Engine x", lo que se corresponde con la E en LEMP). LEMP está compuesto de una variedad de programas con software de código abierto, utilizados para construir y ejecutar servidores web.

Antes de comenzar con esta guía, por favor considere una configuración inicial en su servidor que provea al menos los requisitos mínimos de seguridad y estabilidad.

Los pasos descritos a continuación están escritos para un usuario no root. Si usted inició sesión como root obvie el uso del prefijo sudo.

Configurar el Hostname

Antes de comenzar con la instalación y configuración de los componentes descritos en esta guía, asegúrese de tener un hostname establecido. Ingrese los siguientes comandos para asegurarse de que está configurado adecuadamente:

hostname
hostname -f

El primer comando debería mostrar el hostname corto, y el segundo debería mostrar el nombre de dominio completamente calificado (o FQDN, por sus siglas en inglés).

Requisitos previos de instalación

Antes de comenzar con la instalación de esta infraestructura de aplicación web, ingrese los siguientes comandos para asegurarse de que la base de datos de los paquetes de su sistema esté actualizada y que todo el software instalado se esté ejecutando en su última versión:

sudo apt-get update
sudo apt-get upgrade

Instalar el servidor web Nginx

Hay muchas opciones viables y populares para instalar el software Nginx. El método aquí presentado obtiene los paquetes desde el repositorio del proyecto Debian y proporciona una versión estable y probada de este servidor web. Otra opción es descargar los paquetes compilados por el proyecto Debian Backports. Los paquetes de Backports siempre están más actualizados que los paquetes estables provistos por el proyecto Debian. Sin embargo, Backports no necesariamente recibe las mismas actualizaciones, soporte y mantenimiento que reciben los paquetes oficiales.

Para instalar Nginx desde el repositorio de Debian, ingrese el siguiente comando:

sudo apt-get install nginx

Esto instalará la versión 1.2.1-22 del servidor Nginx.

Configurar hosting virtual en Nginx

Deberá configurar las declaraciones en el servidor que especifican los hosts virtuales basados en nombre. Debido a que está utilizando paquetes del proyecto Debian, cree entonces la configuración de hosting virtual en un archivo similar a /etc/nginx/sites-available/ejemplo.com. Puede considerar la siguiente configuración de Nginx para un host virtual:

Extracto del archivo: /etc/nginx/sites-available/ejemplo.com

server {
    listen   80;
    server_name www.ejemplo.com ejemplo.com;
    access_log /srv/www/ejemplo.com/logs/access.log;
    error_log /srv/www/ejemplo.com/logs/error.log;

    location / {
        root   /srv/www/ejemplo.com/public_html;
        index  index.html index.htm;
    }
}

Ahora cree los directorios public_html y log a los cuales se hace referencia en la configuración anterior. Para hacerlo ejecute los siguientes comandos (asegúrese de cambiar ejemplo.com con el nombre de su dominio):

sudo mkdir -p /srv/www/ejemplo.com/{public_html,logs}

Luego ejecute los siguientes comandos para habilitar el sitio y reiniciar el servidor web.

sudo ln -s /etc/nginx/sites-available/ejemplo.com /etc/nginx/sites-enabled
sudo /etc/init.d/nginx restart

Para desactivar un sitio, simplemente elimine el enlace simbólico ingresando los siguientes comandos:

sudo rm /etc/nginx/sites-enabled/ejemplo.com
sudo /etc/init.d/nginx restart

Así el archivo fuente estará guardado y el sitio podrá ser reactivado en cualquier momento.

Desplegar PHP con FastCGI

Con el fin de implementar aplicaciones PHP, necesitará implementar la siguiente solución "PHP-FastCGI" para permitir que Nginx pueda manejar y servir adecuadamente las páginas que contengan código en PHP. Comience el proceso de despliegue ingresando los siguientes comandos para instalar las dependencias requeridas:

sudo apt-get install php5-cli php5-cgi spawn-fcgi php-pear

Luego deberá ejecutar la siguiente secuencia de comandos para descargar los scripts necesarios para PHP-FastCGI, configurar e inicializar un script para controlar el proceso, iniciar el proceso por primera vez y asegurarse de que el proceso se iniciará incluso después de un ciclo de reinicio:

cd /opt/ 
sudo wget -O php-fastcgi-deb.sh http://www.linode.com/docs/assets/1548-php-fastcgi-deb.sh
sudo mv /opt/php-fastcgi-deb.sh /usr/bin/php-fastcgi
sudo chmod +x /usr/bin/php-fastcgi
sudo wget -O init-php-fastcgi-deb.sh http://www.linode.com/docs/assets/1549-init-php-fastcgi-deb.sh
sudo mv /opt/init-php-fastcgi-deb.sh /etc/init.d/php-fastcgi
sudo chmod +x /etc/init.d/php-fastcgi
sudo /etc/init.d/php-fastcgi start
sudo update-rc.d php-fastcgi defaults

A continuación un archivo configuración de muestra para un host virtual en Nginx. Modifique su configuración para que sea similar a la que se muestra a continuación. Recuerde remplazar ejemplo.com con su dominio real.

Archivo: /etc/nginx/sites-available/ejemplo.com

server {
    server_name www.ejemplo.com ejemplo.com;
    access_log /srv/www/ejemplo.com/logs/access.log;
    error_log /srv/www/ejemplo.com/logs/error.log;
    root /srv/www/ejemplo.com/public_html;

    location / {
        index index.html index.htm index.php;
    }   

Adicionalmente, con el archivo de host virtual de Nginx, asegúrese de que el bloque location ~ \.php$ { } se asemeje al de este ejemplo:

Archivo: /etc/nginx/sites-available/ejemplo.com

location ~ \.php$ {
    include /etc/nginx/fastcgi_params;
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /srv/www/ejemplo.com/public_html$fastcgi_script_name;
}

Nota importante de seguridad: si usted está planificando ejecutar aplicaciones que soporten cargas de archivos —imágenes, por ejemplo—, la configuración arriba puede exponerlo a riesgos de seguridad permitiendo la ejecución arbitraria de código. La explicación corta para este comportamiento es que un URI diseñado adecuadamente, el cual termina en .php, en combinación con un archivo malicioso de imagen que en realidad contiene un PHP válido, puede resultar en que la imagen sea procesada como si fuera PHP.

Para mitigar este problema, puede modificar su configuración para que incluya una directiva try_files si lo desea. Por favor tenga en cuenta que esta corrección requiere que Nginx y php-fcgi residan en el mismo servidor.

location ~ \.php$ {
    try_files $uri =404;
    include /etc/nginx/fastcgi_params;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /srv/www/ejemplo.com/public_html$fastcgi_script_name;
}

También es una buena idea asegurar los directorios cargados que su aplicación pueda usar. El siguiente extracto de configuración demuestra cómo asegurar el directorio "/imagenes"

location ~ \.php$ {
    include /etc/nginx/fastcgi_params;
    if ($uri !~ "^/imagenes/") {
        fastcgi_pass 127.0.0.1:9000;
    }
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /srv/www/ejemplo.com/public_html$fastcgi_script_name;
}

Cuando haya completado estas modificaciones en la configuración, asegúrese de que el host virtual esté habilitado y ejecute el siguiente comando para reiniciar el servidor web:

/etc/init.d/nginx restart

Ahora podrá desarrollar y desplegar scripts en PHP con su infraestructura LEMP.

Instalar el servidor de base de datos MySQL

MySQL es probablemente el motor de base de datos relacional de código abierto líder, y es una solución de base de datos popular para aplicaciones basadas en web. La instalación se explica en los siguientes pasos:

  1. Ingrese el siguiente comando para instalar los paquetes del servidor MySQL y el soporte PHP (requerido para MySQL):

    sudo apt-get install mysql-server php5-mysql
    
  2. Defina una contraseña para el usuario root de MySQL. Seleccione una contraseña sólida y guárdela en un lugar seguro para futuras consultas:
    Anexo 1 Contraseña MySQL

  3. Ejecute el siguiente comando para asegurar la instancia de MySQL:

    sudo mysql_secure_installation
    
  4. Responda todas las preguntas que se soliciten durante este proceso:
    Si en algún momento necesita reiniciar la contraseña root para el servidor MySQL, ejecute el siguiente comando:

    dpkg-reconfigure mysql-server-5.0
    
  5. Ejecute el siguiente comando para iniciar sesión como root en el servidor MySQL:

    mysql -u root -p
    
  6. Ingrese la contraseña root que creó en el segundo paso.

  7. Ejecute la siguiente secuencia de comandos para crear la base de datos nueva_instalación y el usuario nueva_persona. Otorgue el acceso del usuario nueva_persona a la base de datos nueva_instalación y salga de la base de datos:

    CREATE DATABASE nueva_instalación;
    CREATE USER 'nueva_persona' IDENTIFIED BY '<contraseña>';
    GRANT ALL PRIVILEGES ON nueva_instalación.* TO 'nueva_persona';
    exit
    

    Ahora puede proveer las credenciales para la base de datos nueva_instalación y un usuario2 para su aplicación, el cual ahora podrá usar la base de datos para sus propósitos. Para asegurar que PHP pueda acceder al conector MySQL que acaba de instalar, reinicie el servicio PHP.

  8. Ejecute el comando sudo /etc/init.d/php-fastcgi restart para reiniciar el servicio PHP.

¡Felicidades! Ya tiene una infraestructura LEMP completamente funcional y con todas las funciones necesarias para la implementación de sus aplicaciones.

Recursos adicionales

Para complementar la información presentada en esta guía puede consultar los siguientes recursos. Aunque este material es provisto esperando que sea útil, tome en cuenta que no podemos certificar su actualidad o precisión.

¿QUÉ DESEAS SABER?

Intentaremos leer tu mente...