En esta entrada veremos cómo instalar Nginx en CentOS 7 paso a paso, para tener el servidor web que rivaliza en Internet con el viejo Apache, una alternativa a tener muy en cuenta para tu servidor o VPS CentOS por su simplicidad y velocidad.
Contenido
Antes de instalar Nginx en CentOS 7
Para poder seguir esta guía de instalación y configuración de Nginx en CentOS 7 necesitarás cumplir estos pequeños requisitos:
- Un sistema CentOS 7 actualizado.
- Acceder por consola con un usuario con permisos de sudo o, en su defecto pero menos recomendable, como root.
- Conexión a Internet.
Si estás leyendo este pequeño tutorial es casi seguro que ya los cumples, así que abre una terminal y empezamos.
Cómo instalar Nginx en CentOS 7
Para instalar Nginx en CentOS 7, como sucede siempre que buscamos algún paquete «alternativo», debemos buscarlo fuera del repositorio oficial.
En este caso, Nginx se encuentra en el repositorio EPEL, por lo que si no lo tienes instalado aún, hazlo ahora:
~$ sudo yum -y install epel-release
Hecho esto, incluso si ya teníamos EPEL configurado en nuestro sistema, actualizaremos la información de los repositorios y los paquetes instalados:
~$ sudo yum update -y
Ahora ya tenemos disponible el paquete nginx para su descarga e instalación, cosa que hacemos a continuación:
~$ sudo yum install -y nginx
Enseguida se descargarán e instalarán Nginx y sus dependencias. Pero el servidor web no se iniciará automáticamente, ni quedará habilitado para hacerlo con el arranque del sistema, ya que estas son tareas que tendremos que hacer nosotros.
Para iniciar por primera vez Nginx en CentOS 7 usaremos systemctl start:
~$ sudo systemctl start nginx
Y si queremos que Nginx arranque automáticamente junto con CentOS 7, es decir, en cada inicio del sistema, usaremos systemctl enable:
~$ sudo systemctl enable nginx
Ahora podremos comprobar que Nginx se encuentra en ejecución con el comando systemctl status nginx
:
Ya puedes probar tu nuevo servidor web desde el propio sistema CentOS 7, a través de direcciones locales, como http://localhost ó http://127.0.0.1.
Cómo configurar el firewall de CentOS 7 para Nginx
Pero si estás accediendo remotamente a través del dominio, nombre de máquina o dirección IP, no conseguirás conectar. ¿La razón? El firewall de CentOS 7.
Para añadir excepciones que permitan conectar desde otras máquinas al servidor Nginx utilizaremos firewall-cmd:
~$ sudo firewall-cmd --permanent --add-service={http,https}
Hemos añadido en un mismo comando tanto el servicio HTTP como el HTTPS. Puedes añadir ambos servicios o sólo el que necesites.
A continuación hay que recargar las reglas del firewall para que las nuevas excepciones tengan efecto:
~$ sudo firewall-cmd --reload
Ahora ya sí podemos probar Nginx desde un navegador en otra máquina:
Cómo configurar Nginx en CentOS 7
A la hora de configurar Nginx en CentOS 7 hay que tener en cuenta que todos los archivos de configuración se encuentran bajo la ruta /etc/nginx/, siendo el archivo principal de configuración /etc/nginx/nginx.conf.
Testear la configuración de Nginx en CentOS 7
Cada vez que hagamos cambios en los archivos de configuración de Nginx, antes de intentar cargarla es aconsejable que Nginx la valide. Para ello usaremos el comando nginx -t:
~$ sudo nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
Aunque da la impresión de que los mensajes que obtenemos en consola sólo hacen referencia al archivo principal de configuración, nginx.conf, el resto de archivos incluidos desde este también se validarán (módulos, servidores virtuales, etc.).
Cargar la nueva configuración de Nginx
Siempre que hagamos cambios en la configuración de Nginx será necesario reiniciar el servicio para que hagan efecto:
~$ sudo systemctl restart nginx
Archivos de registro o log
Los archivos de registro o logs se encuentran en /var/log/nginx/. Es importante consultarlos, sobre todo en caso de errores o cuando las cosas no funcionan como se esperaba.
Carpeta de archivos web
Los archivos de la página web por defecto de Nginx en CentOS 7 se encuentran en /usr/share/nginx/html/.
Cómo configurar SSL (HTTPS) en Nginx para CentOS 7
A la hora de configurar SSL en Nginx sobre CentOS 7 para usar el protocolo HTTPS, que cifrará las conexiones, será necesario disponer de archivos de claves privadas y certificados. Para un servidor Nginx en Internet es importante que se trate de certificados firmados por autoridades certificadoras, como los que ofrecen servicios profesionales como Namecheap:
En el caso de estar trabajando con un servidor de pruebas o en red local podemos utilizar certificados autofirmados.
En cualquier caso, para configurar un certificado SSL en Nginx para el servidor por defecto, suponiendo que ya tenemos el certificado instalado en el sistema, editamos el archivo de configuración principal, nginx.conf:
~$ sudo nano /etc/nginx/nginx.conf
Y buscamos el segundo bloque server, reconocible porque está desactivado mediante caracteres # a principio de cada línea:
... # Settings for a TLS enabled server. # # server { # listen 443 ssl http2 default_server; # listen [::]:443 ssl http2 default_server; # server_name _; # root /usr/share/nginx/html; ...
Eliminaremos las almohadillas (#) de principio de línea de todo el bloque, excepto en las líneas de comentarios.
En las directivas ssl_certificate y ssl_certificate_key cambiaremos las rutas especificando las de nuestro certificado y su clave privada:
... # Settings for a TLS enabled server. server { listen 443 ssl http2 default_server; listen [::]:443 ssl http2 default_server; server_name _; root /usr/share/nginx/html; ssl_certificate "/etc/pki/tls/certs/centos7.local.lan.crt"; ssl_certificate_key "/etc/pki/tls/private/centos7.local.lan.key"; ssl_session_cache shared:SSL:1m; ssl_session_timeout 10m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } ...
En este ejemplo he usado un certificado autofirmado generado mediante el comando openssl:
~$ sudo openssl req -newkey rsa:2048 -x509 -nodes -days 3650 -out /etc/pki/tls/certs/centos7.local.lan.crt -keyout /etc/pki/tls/private/centos7.local.lan.key
Si vas a crear un certificado autofirmado con el comando anterior, cambia los nombres de los archivos al dominio o nombre de tu máquina CentOS 7, y en el cuestionario que se plantea durante la ejecución del comando, contesta al valor «Common Name» con el mismo valor. En este ejemplo:
... Common Name (eg, your name or your server's hostname) []:centos7.local.lan ...
Tras guardar los cambios, validarlos y reiniciar el servicio nginx ya podemos acceder a la web por defecto tanto con protocolo HTTP como con HTTPS:
En el caso de usar certificados autofirmados el navegador mostrará mensajes de excepción y alerta, pero confirmando y aceptando los riesgos accedemos a la página.
Server blocks (servidores virtuales o «virtual hosts» de Nginx)
Nginx ofrece la característica fundamental de servidores virtuales o virtual hosts. Para utilizar los servidores virtuales montaremos una estructura de archivos de configuración similar a la que incorpora Debian, ya que es un sistema muy cómodo y útil.
Crearemos una carpeta /etc/nginx/sites-available/ donde guardaremos los archivos de configuración de cada servidor virtual (un archivo por cada virtual host).
~$ sudo mkdir /etc/nginx/sites-available
Crearemos una segunda carpeta /etc/nginx/sites-enabled/ donde enlazaremos los archivos de la primera carpeta correspondientes a los servidores virtuales que queramos tener activos.
~$ sudo mkdir /etc/nginx/sites-enabled
De esta forma activar un servidor virtual equivaldrá a crear un enlace simbólico, mientras que desactivarlo consistirá en borrar el enlace (pero no el archivo de configuración del virtual host).
Para que Nginx tenga en cuenta los archivos de configuración de nuestros servidores virtuales activos, editaremos el archivo de configuración principal:
~$ sudo nano /etc/nginx/nginx.conf
Al trabajar con servidores virtuales tendremos que definir el servidor por defecto, que es el que responderá a las peticiones locales, por dirección IP o por cualquier dominio que apunte al servidor CentOS 7 y no tenga un servidor virtual configurado para responder. Esto lo haremos buscando las directivas listen del bloque server de nginx.conf:
... server { listen 80; listen [::]:80; ...
Añadiremos el parámetro default_server a cada una de ellas:
... server { listen 80 default_server; listen [::]:80 default_server; ...
Si lo hemos configurado, haremos otro tanto con las respectivas directivas del bloque server para la versión HTTPS del sitio:
... server { listen 443 ssl http2 default_server; listen [::]:443 ssl http2 default_server; ...
Hecho esto activaremos la carga de las configuraciones de servidores virtuales, buscando dentro del bloque http, en el cual existe la siguiente sección donde ya se incluyen archivos de configuración externos:
... # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf; ...
Justo a continuación de la directiva include ya existente es el mejor sitio para añadir otra directiva include para los archivos de configuración de los servidores virtuales:
... # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*.conf; ...
Ya podemos guardar y cerrar nginx.conf.
Cómo crear un servidor virtual de Nginx en CentOS
Vamos a crear un servidor virtual para un dominio o subdominio que apunte al sistema CentOS 7 en el que tenemos instalado Nginx.
Si estás trabajando en un servidor en Internet necesitarás registrar y configurar dominios a través de servicios profesionales como Namecheap:
Si se trata de una red local, será necesario tener configurado convenientemente el servicio DNS.
En este ejemplo estoy usando el dominio local centos7.local.lan para el servidor por defecto, y para el servidor virtual usaré el subdominio blog.centos7.local.lan.
Empezaremos creando la carpeta para los archivos web. Como vimos anteriormente, la carpeta web del servidor por defecto se encuentra en /usr/share/nginx/html/. Por tanto, deberíamos crear las carpetas para otros servidores virtuales en un nivel superior, en /usr/share/nginx/.
Una buena costumbre es nombrar la carpeta con el mismo nombre del dominio al que responderá al virtual host.
~$ sudo mkdir /usr/share/nginx/blog.centos7.local.lan
Puedes cambiar el propietario y el grupo de esta carpeta, utilizando el usuario que vaya a encargarse de la web de este servidor virtual, así no sería necesario trabajar con sudo.
Es conveniente añadir contenido a esta nueva carpeta de documentos web, para evitar errores de acceso no autorizado. Crearé un sencillo archivo HTML:
~$ sudo nano /usr/share/nginx/blog.centos7.local.lan/index.html
El contenido puede ser cualquiera, yo pondré este:
<head> <meta charset="utf8"> </head> <h1>blog.centos7.local.lan</h1> <h2>Página de prueba</h2>
Ahora editamos el archivo de configuración del servidor virtual en /etc/nginx/sites-available/. Igualmente es buena idea usar como nombre para el archivo el mismo nombre que el dominio, pero añadiendo la extensión .conf:
~$ sudo nano /etc/nginx/sites-available/blog.centos7.local.lan.conf
El contenido básico del archivo puede ser este:
server { listen 80; listen [::]:80; server_name blog.centos7.local.lan; root /usr/share/nginx/blog.centos7.local.lan/; index index.html; location / { try_files $uri $uri/ =404; } error_log /var/log/nginx/blog.centos7.local.lan-error.log; access_log /var/log/nginx/blog.centos7.local.lan-access.log main; }
Como ves, la configuración de un servidor virtual es muy simple. Consta de un bloque principal server en el que se incluyen una serie de directivas:
listen
Indican el puerto en el que Nginx escuchará peticiones. El puerto 80 es el estándar para el protocolo HTTP. Esta directiva está duplicada, para funcionar con IPv4 e IPv6.
server_name
Esta directiva es la que especifica el dominio al que atenderá el servidor virtual.
root
La directiva root se encarga de indicar la carpeta de archivos web para el virtual host.
index
Especifica el archivo índice, que es el que se entrega cuando la URL solicitada no incluye un archivo, sino un directorio. Normalmente es index.html, pero puede ser default.html, index.htm, etc. Puedes cambiarlo según tus necesidades.
location
Este bloque configura opciones para un directorio del servidor virtual. En el ejemplo se configura que el recurso solicitado se trate en primer lugar como archivo, en su defecto como directorio y en caso de fallo se produzca el error 404.
error_log
El archivo de registro de errores del servidor virtual. En este ejemplo utilizo el directorio de logs de Nginx en CentOS 7, pero especificando como parte del nombre el dominio del servidor virtual.
access_log
El archivo de accesos al servidor virtual. Se aplica lo mismo que en el archivo de errores.
Activando el servidor virtual
Guardados los cambios, es el momento de activar el nuevo servidor virtual. Teniendo en cuenta la estructura de configuración que hemos montado, hay que crear el enlace en la carpeta de servidores activos:
~$ sudo ln -s /etc/nginx/sites-available/blog.centos7.local.lan.conf /etc/nginx/sites-enabled/
Ya podemos validar la configuración y reiniciar Nginx.
Probando el servidor virtual
Es el momento de probar el servidor virtual, y la forma de hacerlo es acceder a través de un navegador especificando como dirección el dominio que hemos configurado:
Servidores virtuales con SSL (HTTPS)
Para configurar un certificado SSL en un servidor virtual, procederemos de manera similar al caso del servidor por defecto. Con el certificado ya instalado en el sistema, editamos el archivo de configuración del servidor virtual y añadimos algunas directivas:
server { listen 80; listen [::]:80; listen 443 ssl; listen [::]:443 ssl; server_name blog.centos7.local.lan; ssl_certificate /etc/pki/tls/certs/blog.centos7.local.lan.crt; ssl_certificate_key /etc/pki/tls/private/blog.centos7.local.lan.key; root /usr/share/nginx/blog.centos7.local.lan/; index index.html; location / { try_files $uri $uri/ =404; } error_log /var/log/nginx/blog.centos7.local.lan-error.log; access_log /var/log/nginx/blog.centos7.local.lan-access.log main; }
Veamos qué hemos hecho.
listen
Hemos añadido dos directivas más del tipo listen (una para IPv4 y otra para IPv6) en las que especificamos el puerto estándar HTTPS, el 443 y la opción ssl, que especifica que en estos puertos las peticiones que se escucharán serán cifradas.
ssl_certificate
Indica la parte pública del certificado.
ssl_certificate_key
Indica la parte privada del certificado.
En este ejemplo, al tratarse de una red local, hemos usado de nuevo certificados autofirmados creados para este servidor virtual, pero para un dominio en Internet habrá que usar certificados firmados por alguna autoridad certificadora.
Tras recargar la configuración del servidor, accedemos mediante una URL con el protocolo https://. Tras confirmar las excepciones de seguridad (por tratarse de un certificado autofirmado) accederemos a la página web:
Conclusión
Ahora que ya sabes cómo instalar Nginx en CentOS 7 puedes usar este servidor web en tu sistema para servir distintos sitios web a través de servidores virtuales y usando seguridad SSL.
Si conocías Apache, habrás visto las particularidades de la configuración de Nginx, que realmente no es tan distinto.
Ahora pruébalo a fondo y saca tus propias conclusiones sobre su potencia y velocidad.
Para dudas, sugerencias, errores, consultas, etc. déjame un comentario.
¡Apoya comoinstalar.me!
¿Creías que instalar y configurar Nginx en CentOS 7 iba a ser una pesadilla? ¡Ya has visto que no! Quizás estés tan contento de haberlo conseguido que te gustaría agradecérmelo, así que si ese es el caso puedes hacerlo dejando una propina de tan sólo 1 $ en PayPal para una CocaCola:
Aunque, si te sientes especialmente generoso, puedes invitarme a un cappuccino:
¡Gracias!
¡¡Muchas gracias por tu contenido!! Me ha servido bastante.
¡De nada, Cris!
Muchas gracias.
Realmente me ayudaste a comprender a detalle el funcionamiento del Nginx. Encontré muchas otras explicaciones pero ninguna me ayudó a realmente entenderlo.
Saludos.
¡Me alegra que te sirviera, Raymundo!
¿Por qué sale la página de CentOS y no de Nginx? plop
Hola, Jhon. El responsable del paquete decidió que era más útil tener a mano toda esa información sobre CentOS. En cualquier caso lo que importa es que puedes sustituir esa página con tu propio contenido web.
Excelente, te agradezco mucho la información.
Me ha servido para aprender, sólo tuve un error para iniciar el servicio, por el usuario nginx, sin embargo probé camiando el usuario por uno de mayor privilegio y con eso arrancó. Investigaré a mayor profundidad para resolver arrancar el servicio con su propio usuario.
Saludos.
Hola. Es raro lo que comentas, el servicio debería arrancar sin problemas siguiendo las instrucciones de la guía. De hecho acabo de revisarla y funciona perfectamente. Habría que revisar los registros de eventos en busca de la causa del problema, asegurarse de que no exista /var/run/nginx.pid antes de iniciar el servicio, etc.