¿Cómo instalar y configurar un servidor LEMP en Ubuntu 12.04 (Precise Pangolin)?

Actualizado el 15 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). Este último puede aumentar la capacidad del servidor de adaptarse en respuesta a la demanda.

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.

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).

Preparar su sistema para la implementación

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

apt-get update
apt-get upgrade

Instalar el servidor web Nginx

Hay muchas opciones viables y populares para instalar el software Nginx. La primera opción es obtener los paquetes desde el repositorio de software del proyecto Ubuntu, los cuales proporcionan una versión estable y probada del servidor web.

La segunda opción requiere descargar los paquetes de nginx desde el proveedor de upstream y compilar el software de forma manual. La compilación manual hace posible ejecutar la versión más reciente del software a expensas de las pruebas y las actualizaciones automáticas del proyecto Ubuntu. Todas las opciones son compatibles, pero en la mayoría de los casos recomendamos usar los paquetes de los repositorios de Ubuntu a menos que necesite una versión más nueva que la disponible allí. Las posibles razones para compilar nginx por su cuenta incluyen: el acceso a módulos opcionales en tiempo de compilación y características añadidas en versiones más recientes.

Implementar los paquetes desde el proyecto Ubuntu

Si decide instalar Nginx desde el repositorio de Ubuntu, ejecute el siguiente comando:

apt-get install nginx

Esto instalará la última versión del servidor nginx en los repositorios de Ubuntu.

Compilar nginx desde el código fuente

Si quiere compilar e instalar Nginx desde el código fuente, ejecute los siguientes comandos para instalar los requisitos previos:

apt-get install libpcre3-dev build-essential libssl-dev sudo

Verifique en la página de descargas de Nginx cuál es la última versión especificada en el campo stable. Para el momento del desarrollo de este ejemplo la última versión estable es la 1.10.1. Remplace la versión especificada en el siguiente comando con la última versión estable. Ejecute la siguiente secuencia de comandos para descargar e instalar el servidor web Nginx:

cd /opt/
wget http://nginx.org/download/nginx-1.10.1.tar.gz
tar -zxvf nginx-1.10.1.tar.gz
cd /opt/nginx-1.10.1/

El siguiente comando ./configure prepara a Nginx para la compilación:

./configure --prefix=/opt/nginx --user=nginx --group=nginx --with-http_ssl_module

Cuando el comando ./configure se complete mostrará la siguiente información con respecto a la ubicación de archivos importantes relacionados con nginx después de completar la instalación.

nginx path prefix: "/opt/nginx"
nginx binary file: "/opt/nginx/sbin/nginx"
nginx configuration prefix: "/opt/nginx/conf"
nginx configuration file: "/opt/nginx/conf/nginx.conf"
nginx pid file: "/opt/nginx/logs/nginx.pid"
nginx error log file: "/opt/nginx/logs/error.log"
nginx http access log file: "/opt/nginx/logs/access.log"
nginx http client request body temporary files: "client_body_temp"
nginx http proxy temporary files: "proxy_temp"
nginx http fastcgi temporary files: "fastcgi_temp"

Ejecute los siguientes comandos para compilar e instalar el software como se especifica arriba:

make
make install

Cree un usuario dedicado del sistema para ejecutar los procesos nginx usando el siguiente comando:

adduser --system --no-create-home --disabled-login --disabled-password --group nginx 

Ahora instale y configure el script init para que sea posible que inicie y detenga el servidor web de forma más sencilla. Ejecute la siguiente secuencia de comandos:

wget -O init-deb.sh http://www.linode.com/docs/assets/1131-init-deb.sh
mv init-deb.sh /etc/init.d/nginx
chmod +x /etc/init.d/nginx
/usr/sbin/update-rc.d -f nginx defaults 

Ahora ejecute el siguiente comando para iniciar el servidor web:

/etc/init.d/nginx start

Configurar hosting virtual en Nginx

Sin importar qué método utilice para instalar Nginx, deberá configurar las declaraciones server que especifican los hosts virtuales basados en nombre. Hay un número de enfoques para organizar los archivos de configuración con nginx. Independientemente de la estrategia organizacional, todas las configuraciones de hosts virtuales están contenidas dentro de los bloques de configuración tipo server que a su vez están contenidos dentro de los bloques http del archivo nginx.conf. Considere la siguiente configuración de host virtual para nginx:

Extracto del archivo: /etc/nginx/nginx.conf

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;
    }
}

Cree los directorios a los cuales se hace referencia en esta configuración ejecutando los siguientes comandos:

mkdir -p /srv/www/ejemplo.com/public_html
mkdir -p /srv/www/ejemplo.com/logs

Hay varios métodos que puede usar para asegurarse de que estas opciones estén incluidas en su configuración de Nginx. Si usted está usando los paquetes de los repositorios de Ubuntu, cree la configuración de hosts virtuales anterior en el archivo /etc/nginx/sites-available/ejemplo.com y luego ingrese los siguientes comandos para habilitar el sitio y reiniciar el servidor web:

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

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

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

El archivo fuente está guardado y el sitio puede ser rehabilitado en cualquier momento.

Si usted instaló el servidor web después de compilarlo del código fuente tiene varias opciones. Puede insertar las directivas server directamente en la sección http del archivo /opt/nginx/conf/nginx.conf o el archivo /etc/nginx/nginx.conf, aunque esto puede ser difícil de manejar. También puede replicar la administración del sistema creada para los paquetes de Ubuntu creando los directorios sites-available/ y sites-enabled/ e insertando la siguiente línea en su archivo nginx.conf:

Extracto del archivo: nginx.conf

http {
# [...]

include /opt/etc/nginx/sites-enabled/*;

# [...]       
}

Modifique la declaración include para que apunte a la ruta de su directorio sites-enabled. En algunas circunstancias, puede tener más sentido crear e incluir un archivo llamado /opt/nginx-sites.conf que esté incluido en el archivo nginx.conf tal como sigue:

Extracto del archivo: nginx.conf

http {
# [...]

include /opt/nginx-sites.conf;

# [...]       
}

Luego, dependiendo del tamaño y naturaleza de su desarrollo, coloque sus configuraciones de host virtual ya sea directamente en el archivo /opt/nginx-sites.conf o en las declaraciones include de archivos de configuración para servidores específicos en el archivo nginx-sites.file.

Una vez que haya configurado y cargado la configuración de nginx, reinicie el servidor web e implemente la nueva configuración usando el siguiente comando:

/etc/init.d/nginx restart

Asegúrese de que los directorios a los cuales se hace referencia en su configuración existen en el sistema de archivos antes de reiniciar.

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:

apt-get install php5-cli php5-cgi php5-fpm

Considere la siguiente configuración para el host virtual nginx. Modifique su configuración para que se asemeje a la que se muestra a continuación y asegúrese de que la ubicación location ~ \.php$ { } se parezca a la de este ejemplo:

Archivo: configuración de host virtual Nginx

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;
    }

    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 unix:/var/run/php5-fpm.sock;
    }
    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:

service php5-fpm restart
/etc/init.d/nginx restart

¡Felicidades, ha implementado una infraestructura LEMP que permite la ejecución de scripts PHP!

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. Ejecute el siguiente comando para instalar los paquetes del servidor MySQL y el soporte requerido para PHP:

apt-get install mysql-server php5-mysql

Durante el proceso de instalación se le pedirá que establezca 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

Ejecute el siguiente comando para asegurar su instancia de MySQL:

mysql_secure_installation

Responda todas las preguntas durante el proceso. Si en algún punto necesita reiniciar la contraseña root del servidor MySQL ejecute el siguiente comando:

dpkg-reconfigure mysql-server-5.0

Ejecute el siguiente comando para ingresar a la línea de comandos MySQL como usuario root:

mysql -u root -p

Ingrese la contraseña root que creó en los pasos anteriores y luego ejecute la siguiente secuencia de comandos para crear la base de datos ejemplo y el usuario miusuario. Luego otorgue el acceso a miusuario a la base de datos y salga de MySQL:

CREATE DATABASE ejemplo;
CREATE USER 'miusuario' IDENTIFIED BY 'SuContraseña';
GRANT ALL PRIVILEGES ON ejemplo.* TO 'miusuario';
exit

Ahora puede proporcionar las credenciales de la base de datos ejemplo y del usuario miusuario a su aplicación, la cual ahora podrá usar dicha base de datos. Para asegurarse de que PHP podrá acceder al conector MySQL que acaba de instalar, reinicie el servicio PHP ejecutando el siguiente comando:

service php5-fpm restart

¡Felicidades! Ya tiene una infraestructura LEMP totalmente funcional y con todas las características necesarias para el desarrollo de sus aplicaciones.

Supervisar en busca de actualizaciones de software y avisos de seguridad

Si ejecuta un software compilado o instalado directamente desde fuentes provistas por desarrolladores upstream, usted será responsable de supervisar las actualizaciones, correcciones de bugs y problemas de seguridad. Después de tener conocimiento de las nuevas versiones y los problemas potenciales, actualice su software para resolver fallas y prevenir posibles compromisos en el sistema. Supervisar las publicaciones y mantener actualizadas sus versiones de todo el software es crucial para la seguridad e integridad de un sistema.

Por favor siga los anuncios, listas y canales RSS en las páginas que se muestran a continuación para asegurarse de estar al tanto de todas las actualizaciones del software y poder actualizar o aplicar parches y recompilar como sea necesario:

Cuando se publiquen nuevas actualizaciones, repita las instrucciones de instalación para nginx y spawn-fcgi. Luego vuelva a compilar su software cuando sea necesario. Estas prácticas son cruciales para una seguridad y funcionamiento continuos en su sistema.

Recursos adicionales

Para complementar la información aquí presentada 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...