¿Cómo instalar y configurar un servidor LEMP en CentOS 6?

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 el sistema para la implementación

Antes de comenzar con la instalación de esta infraestructura de aplicación web, ejecute el siguiente comando 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:

yum update

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 EPEL del proyecto Fedora, los cuales proporcionan una versión más 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 Fedora. Todas las opciones son compatibles, pero en la mayoría de los casos recomendamos usar los paquetes de los repositorios de EPEL 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 desde los paquetes de EPEL

Si usted quiere instalar nginx desde el repositorio EPEL, ejecute los siguientes comandos para inicializar el repositorio EPEL e instalar nginx:

rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
yum update     
yum install nginx sudo

Esto instalara la última versión disponible de nginx. Ejecute los siguientes comandos para iniciar nginx por primera vez y asegurarse de que nginx se iniciará incluso después de un ciclo de reinicio:

/etc/init.d/nginx start
chkconfig --add nginx
chkconfig nginx on

Compilar nginx desde la fuente

Si quiere compilar e instalar nginx desde la fuente, ejecute el siguiente comando para instalar los requisitos previos:

yum install zlib-devel wget openssl-devel pcre pcre-devel sudo gcc make autoconf automake

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 esta guía 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/
mkdir /var/lib/nginx

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 que la instalación sea completado.

nginx path prefix: "/opt/nginx"
nginx binary file: "/opt/nginx/sbin/nginx"
nginx modules path: "/opt/nginx/modules"
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"
nginx http uwsgi temporary files: "uwsgi_temp"
nginx http scgi temporary files: "scgi_temp"

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

make
make install

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

useradd -M -r --shell /bin/sh --home-dir /opt/nginx nginx

Ahora cree el script init para hacer que el arranque y detención del servicio web sea más sencillo. Cree el archivo /etc/rc.d/init.d/nginx con el siguiente contenido:

Extracto del archivo: /etc/rc.d/init.d/nginx

#!/bin/sh
#
# nginx – este script arranca y detiene el demonio nginx
#
# chkconfig: - 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /opt/nginx/conf/nginx.conf
# pidfile: /opt/nginx/logs/nginx.pid

# Librería de funcionamiento fuente.
. /etc/rc.d/init.d/functions

# Configuración de red fuente.
. /etc/sysconfig/network

# Comprueba que la red esté activa.
[ "$NETWORKING" = "no" ] && exit 0

nginx="/opt/nginx/sbin/nginx"
prog=$(basename $nginx)

NGINX_CONF_FILE="/opt/nginx/conf/nginx.conf"

lockfile=/var/lock/subsys/nginx

start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}

stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}

restart() {
    configtest || return $?
    stop
    start
}

reload() {
    configtest || return $?
    echo -n $”Reloading $prog: ”
    killproc $nginx -HUP
    RETVAL=$?
    echo
}

force_reload() {
    restart
}

configtest() {
    $nginx -t -c $NGINX_CONF_FILE
}

rh_status() {
    status $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}

case "" in
    start)
        rh_status_q && exit 0
        
        ;;
    stop)
        rh_status_q || exit 0
        
        ;;
    restart|configtest)
        
        ;;
    reload)
        rh_status_q || exit 7
        
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
        ;;
    *)
        echo $"Usage: 
{start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}" exit 2 esac

El próximo paso es ejecutar los siguientes comandos para dar permisos de ejecución al script, configurar nginx para que se inicie al encender el servidor, y arrancar el servidor por primera vez:

chmod +x /etc/rc.d/init.d/nginx
chkconfig --add nginx
chkconfig nginx on
service nginx start

Configurar hosting virtual en Nginx

Sin importar el método que 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: configuración del servidor nginx

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 emitiendo los siguientes comandos:

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

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 los sistemas operativos Debian/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. Cree las configuraciones del sitio en el directorio sites-available y luego cree los enlaces simbólicos a estos archivos en el directorio sites-enabled. En otras 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;

# [...]      
}

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 formato 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 existan en el sistema de archivos antes de reiniciar.

Desplegar PHP con FastCGI

Si su aplicación incluye código 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:

rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm 
yum update     
yum install php-cli php spawn-fcgi wget

El próximo paso es crear los scripts que iniciarán y contralarán los procesos de php-cgi. Primero cree el archivo /usr/bin/php-fastcgi con el siguiente contenido:

Extracto del archivo: /usr/bin/php-fastcgi

#!/bin/sh

if [ `grep -c "nginx" /etc/passwd` = "1" ]; then 
   FASTCGI_USER=nginx
elif [ `grep -c "www-data" /etc/passwd` = "1" ]; then 
   FASTCGI_USER=www-data
elif [ `grep -c "http" /etc/passwd` = "1" ]; then 
   FASTCGI_USER=http
else 
# Set the FASTCGI_USER variable below to the user that 
# you want to run the php-fastcgi processes as

FASTCGI_USER=
fi

/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 6 -u $FASTCGI_USER -f /usr/bin/php-cgi

Luego cree el script para iniciar el proceso php-cgi automáticamente. Para hacerlo cree un archivo en /etc/init.d/php-fastcgi con el siguiente contenido:

Extracto del archivo: /etc/init.d/php-fastcgi

#!/bin/sh

# php-fastcgi - Use php-fastcgi to run php applications
#
# chkconfig: - 85 15
# description: Use php-fastcgi to run php applications
# processname: php-fastcgi

if [ `grep -c "nginx" /etc/passwd` = "1" ]; then 
   OWNER=nginx
elif [ `grep -c "www-data" /etc/passwd` = "1" ]; then 
   OWNER=www-data
elif [ `grep -c "http" /etc/passwd` = "1" ]; then 
   OWNER=http
else 
# Establezca la variable OWNER a continuación según el 
# usuario que quiere que ejecute los procesos php-fastcgi

OWNER=
fi

PATH=/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/bin/php-fastcgi

NAME=php-fastcgi
DESC=php-fastcgi

test -x $DAEMON || exit 0

# Include php-fastcgi defaults if available
if [ -f /etc/default/php-fastcgi ] ; then
    . /etc/default/php-fastcgi
fi

set -e

case "" in
  start)
    echo -n "Starting $DESC: "
    sudo -u $OWNER $DAEMON
    echo "$NAME."
    ;;
  stop)
    echo -n "Stopping $DESC: "
    killall -9 php-cgi
    echo "$NAME."
    ;;
  restart)
    echo -n "Restarting $DESC: "
    killall -9 php-cgi
    sleep 1
    sudo -u $OWNER $DAEMON
    echo "$NAME."
    ;;
      *)
        N=/etc/init.d/$NAME
        echo "Usage: $N {start|stop|restart}" >&2
        exit 1
        ;;
    esac
    exit 0

Ejecute la siguiente secuencia de comandos para hacer que los scripts sean ejecutables, se inicie el proceso por primera vez y asegurarse de que el proceso se iniciará después de un ciclo de reinicio:

chmod +x /usr/bin/php-fastcgi
chmod +x /etc/init.d/php-fastcgi
service php-fastcgi start
chkconfig --add php-fastcgi
chkconfig php-fastcgi on

Edite el archivo /etc/sudoers para comentar para comentar la línea Defaults requiretty, esto para asegurarse de que el script init se iniciará al arranque del servidor. Cree un comentario anteponiendo un signo de almohadilla o numeral (#) al principio de la línea, tal como sigue:

Extracto del archivo: /etc/sudoers

# Defaults requiretty

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:

Extracto del archivo: configuración del 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 los workers 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;
}

Adicionalmente, 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

¡Felicidades, ahora puede desarrollar scripts 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. Ejecute el siguiente comando para instalar los paquetes del servidor MySQL:

yum install mysql-server php-mysql

Ejecute los siguientes comandos para iniciar el servicio MySQL y asegurarse de que el servicio se inicie tras la siguiente secuencia de encendido:

/etc/rc.d/init.d/mysqld start
chkconfig mysqld on

Ejecute los siguientes comandos para asegurar su instancia de MySQL. Responda todas las preguntas que se le solicite durante el proceso:

mysql_secure_installation

Ejecute el siguiente comando para ingresar al servidor 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:

/etc/init.d/php-fastcgi 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

Cuando 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 presentada esta guía puede consultar los siguientes recursos. Aunque este material es provisto esperando que sea útil, tenga en cuenta que no podemos certificar su actualidad o precisión.

¿QUÉ DESEAS SABER?

Intentaremos leer tu mente...