¿Cómo instalar y configurar un servidor LEMP en Ubuntu 16.04 (Xenial Xerus)?
Actualizado el 16 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
- Asegúrese de que su servidor cumpla con los requisitos mínimos de seguridad y estabilidad.
- Debe tener un conocimiento base sobre Linux antes de implementar las instrucciones sugeridas aquí, por lo que recomendamos tener claros los conceptos básicos y prácticos en Linux.
- Actualice su sistema:
sudo apt-get update && sudo apt-get upgrade
Esta guía está escrita para un usuario no root. Los comandos que lo requieren están precedidos por sudo
. Si usted inició sesión como usuario root entonces puede obviar el uso de este prefijo.
Nginx
Instalar el servidor web Nginx
Para asegurar la compatibilidad de la instalación y las futuras actualizaciones, instale nginx desde el repositorio de paquetes de Ubuntu usando apt
:
sudo apt-get install nginx
Configurar el hosting virtual en Nginx
Las antiguas versiones de nginx especifican los directorios de los sitios y otras informaciones en el archivo principal nginx.conf
, pero las versiones más recientes -como la incluida en Ubuntu 16.04- son más compartimentadas. Mientras lee esta sección, tenga en cuenta los contenidos y ubicaciones de cada archivo para poder familiarizarse con la estructura y saber a dónde ir si necesita personalizar algún aspecto particular de su servidor web.
Nginx utiliza las directivas server
para especificar los hosts virtuales basados en nombre. Nginx los llamadas bloques server. Todos los bloques están contenidos dentro de las directivas server
en los archivos del sitio, ubicados en /etc/nginx/sites-available
. Cuando están activados, estos están incluidos en el archivo de configuración principal de nginx por defecto.
-
Nginx incluye una configuración de muestra que puede usar como plantilla. Para crear un nuevo archivo con un bloque
server
base para su configuración, ingrese el siguiente comando remplazandoejemplo.com
con los datos reales de su dominio:tail /etc/nginx/sites-available/default -n 13 | cut -c 2- | sudo tee /etc/nginx/sites-available/ejemplo.com 1> /dev/null
El comando arriba lee el bloque
server
del ejemplo contenido en las últimas 13 líneas del archivo predeterminado del sitio, corta los símbolos#
e imprime el resultado en un nuevo archivo del sitio.
De forma alternativa, puede copiar manualmente la última sección de/etc/nginx/sites-available/default
en un nuevo archivo llamado/etc/nginx/sites-available/ejemplo.com
. Tendrá que eliminar manualmente los numerales (#
) de las líneas relevantes. -
Ahora tendrá el siguiente bloque
server
en la configuración del host virtual de nginx:
Archivo: /etc/nginx/sites-available/ejemplo.comserver { listen 80; listen [::]:80; server_name ejemplo.com; root /var/www/ejemplo.com; index index.html; location / { try_files $uri $uri/ =404; } }
Remplace
ejemplo.com
con el nombre de su dominio. Si su página principal utiliza PHP, agregueindex.php
a la líneaindex
:
Extracto del archivo: /etc/nginx/sites-available/ejemplo.comindex index.html index.php;
-
La configuración de ejemplo de nginx utiliza
/var/www/
como documento raíz, pero Ubuntu utiliza/var/www/html
como un estándar. Adicionalmente, se recomienda la práctica estándar de usar el subdirectorio llamadopublic_html
para excluir los archivos web que no deberían ser accesibles públicamente. Actualice la directicaroot
para que coincida con las siguientes convenciones:
Extracto del archivo: /etc/nginx/sites-available/ejemplo.comroot /var/www/html/ejemplo.com/public_html;
-
Cree el directorio root al cual se hace referencia en esta configuración, remplazando
ejemplo.com
con su nombre de dominio:sudo mkdir -p /var/www/html/ejemplo.com/public_html
-
Habilite el sitio, desactive el host predeterminado y reinicie el servidor web:
sudo ln -s /etc/nginx/sites-available/ejemplo.com /etc/nginx/sites-enabled sudo rm /etc/nginx/sites-enabled/default sudo systemctl restart nginx
Para desactivar un sitio, simplemente elimine el enlace simbólico:
sudo rm /etc/nginx/sites-enabled/ejemplo.com sudo systemctl restart nginx
El archivo fuente está guardado y el sitio puede ser reactivado en cualquier momento al recrear el enlace simbólico.
Si usted está usando nginx para alojar más de un sitio, cree varios archivos de host virtual usando el método anterior.
Puede que también desee editar el bloque http
en /etc/nginx/nginx.conf
, el cual aplica para todos los sitios y permite las siguientes opciones (entre otras):
- Esconder la información de la cabecera HTTP usando
server_tokens
; - Configurar los ajustes de SSL/TLS;
- Personalizar las rutas de los registros o logs.
Implementar PHP con FastCGI
Con el fin de desarrollar aplicaciones PHP, implemente la siguiente solución PHP-FastCGI para permitir que nginx pueda manejar y servir páginas que contengan PHP de forma apropiada.
-
Instale las dependencias requeridas:
sudo apt-get install php7.0-cli php7.0-cgi php7.0-fpm
-
Modifique la configuración de su host virtual para incluir la directiva
location
tal como se muestra a continuación:
Extracto del archivo: /etc/nginx/sites-available/ejemplo.comserver { listen 80; listen [::]:80; server_name ejemplo.com; root /var/www/html/ejemplo.com/public_html; index index.html; location / { try_files $uri $uri/ =404; } location ~ \.php$ { include snippets/fastcgi-php.conf; include fastcgi_params; fastcgi_pass unix:/run/php/php7.0-fpm.sock; fastcgi_param SCRIPT_FILENAME /var/www/html/ejemplo.com/public_html$fastcgi_script_name; } }
-
Reinicie los servicios
php7.0-fpm
ynginx
:sudo systemctl restart php7.0-fpm nginx
¡Felicidades! Ahora puede desarrollar scripts PHP en su servidor web.
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.
-
Instale los paquetes del servidor MySQL y el soporte PHP requerido para MySQL:
sudo apt-get install mysql-server php7.0-mysql
Durante el proceso de instalación se le pedirá que configure una contraseña para el usuario root de MySQL a través del menú
ncurses
. Escoja una contraseña sólida y manténgala en un lugar seguro para futuras consultas. -
Inicie sesión en la línea de comandos de MySQL como usuario root. Cuando se le solicite, ingrese la contraseña que especificó en el primer paso:
mysql -u root -p
-
Cree una base de datos y un usuario con los permisos para acceder a esta. Remplace
web
yusuarioweb
con nombres apropiados, ySuContraseña
con una contraseña sólida:CREATE DATABASE web; CREATE USER 'usuarioweb' IDENTIFIED BY 'SuContraseña'; GRANT ALL PRIVILEGES ON web.* TO 'usuarioweb'; quit
Ahora puede proporcionar las credenciales de la base de datos
web
y del usuariousuarioweb
a su aplicación, la cual ahora podrá usar dicha base de datos para sus propósitos. Para asegurarse de que PHP podrá acceder al conector MySQL que acaba de instalar, reinicie el servicio PHP ejecutando el siguiente comando:sudo systemctl restart php7.0-fpm
Nota:
Si en algún punto necesita cambiar su contraseña root, inicie sesión como se muestra en el paso 2 e ingrese el siguiente comando, remplazando NuevaContraseña
con su nueva contraseña para el usuario root:
ALTER USER 'root'@'localhost' IDENTIFIED WITH 'mysql_native_password' BY 'password';
Opcional: probar y solucionar problemas de su infraestructura LEMP
En esta sección, creará una página de prueba que muestre si nginx puede interpretar código PHP y conectarse a la base de datos MySQL. Esto puede ser útil para ubicar la fuente de un error si alguno de los elementos de infraestructura LEMP no se está comunicando correctamente con otro.
-
Pegue el siguiente código en un nuevo archivo,
phptest.php
en el directoriopublic_html
. Modifiqueusuarioweb
ySuContraseña
para que coincida con la información ingresada en el servidor de base de datos instalado en la sección anterior:
Archivo: /var/www/html/ejemplo.com/public_html/phptest.php<html> <head> <title>Prueba de PHP</title> </head> <body> <?php echo '<p>¡Hola mundo!</p>'; // En las variabels siguientes, remplace usuario y contraseña con sus propias credenciales MySQL tal como se crearon en el servidor $servername = "localhost"; $username = "webuser"; $password = "password"; // Cree la conexión con MySQL $conn = mysqli_connect($servername, $username, $password); // Comprueba la conexión - si falla, la salida incluirá un mensaje de error if (!$conn) { exit('<p>La conexión falló: <p>' . mysqli_connect_error()); } echo '<p>Conectado con éxito</p>'; ?> </body> </html>
-
Navegue a
ejemplo.com/phptest.php
desde su máquina local. Si los componentes de su infraestructura LEMP están funcionando correctamente, el navegador mostrará un mensaje: "Conectado con éxito". Si no, la salida será un mensaje de error. - Una vez que verifique que la infraestructura está operando, elimine el archivo de prueba:
sudo rm -rf /var/www/html/ejemplo.com/public_html/phptest.php
Solución de problemas
-
Si el sitio no carga en lo absoluto, compruebe el estatus de nginx y reinícielo si es necesario:
systemctl status nginx sudo systemctl restart nginx
-
Si el sitio carga, pero la página que se muestra es la página predeterminada de nginx, regrese a la sección "Configurar hosting virtual de Nginx" y verifique que la directiva
root
coincida con su carpetaejemplo.com/public_html
. - Si la página retorna una carpeta con una estructura de árbol y un mensaje que indica
Index of /
, cree un archivo de pruebaindex.html
o un archivo de prueba tal como se observa arriba.
¡Felicidades! Ya cuenta con las herramientas básicas para el despliegue de una aplicación en su nuevo servidor LEMP que es completamente funcional y con todas las características.
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.