Cómo instalar Nginx con hosts virtuales y certificado SSL


Nginx (abreviatura de Engine-x ) es un servidor proxy e inverso HTTP de código abierto, potente, potente y de alto rendimiento y escalable, un correo y un proxy TCP/UDP estándar servidor. Es fácil de usar y configurar, con un lenguaje de configuración simple. Nginx es ahora el software de servidor web preferido para alimentar sitios muy cargados, debido a su escalabilidad y rendimiento.

En este artículo analizaremos cómo usar Nginx como un servidor HTTP, configurarlo para servir contenido web y configurar hosts virtuales basados ​​en nombres, y crear e instalar SSL para transmisiones de datos seguras, incluido un certificado autofirmado en Ubuntu y CentOS .

Cómo instalar el servidor web Nginx

Primero comience instalando el paquete Nginx desde los repositorios oficiales usando su administrador de paquetes como se muestra.

------------ On Ubuntu ------------ 
$ sudo apt update 
$ sudo apt install nginx 

------------ On CentOS ------------
$ sudo yum update 
$ sudo yum install epel-release 
$ sudo yum install nginx 

Después de instalar el paquete Nginx, debe iniciar el servicio por ahora, habilitarlo para que se inicie automáticamente en el momento del arranque y ver su estado, usando los siguientes comandos. Tenga en cuenta que en Ubuntu , debe iniciarse y habilitarse automáticamente mientras el paquete está preconfigurado.

$ sudo systemctl start nginx
$ sudo systemctl enable nginx
$ sudo systemctl status nginx

En este punto, el servidor web Nginx debe estar en funcionamiento, puede verificar el estado con el comando netstat.

$ sudo netstat -tlpn | grep nginx

Si su sistema tiene un firewall habilitado, debe abrir el puerto 80 y 443 para permitir el tráfico de HTTP y HTTPS respectivamente, a través de ella, corriendo.

------------ On CentOS ------------
$ sudo firewall-cmd --permanent --add-port=80/tcp
$ sudo firewall-cmd --permanent --add-port=443/tcp
$ sudo firewall-cmd --reload

------------ On Ubuntu ------------ 
$ sudo ufw allow 80/tcp
$ sudo ufw allow 443/tcp
$ sudo ufw reload 

El método ideal para probar la instalación de Nginx y verificar si está funcionando y puede servir páginas web es abrir un navegador web y señalar la IP del servidor.

http://Your-IP-Address
OR
http://Your-Domain.com

Una instalación en funcionamiento debe indicarse en la siguiente pantalla.

Cómo configurar el servidor web Nginx

Los archivos de configuración de Nginx se encuentran en el directorio /etc/nginx y el archivo de configuración global se encuentra en /etc/nginx/nginx.conf en CentOS y Ubuntu.

Nginx se compone de módulos que están controlados por varias opciones de configuración, conocidas como directivas . Una directiva puede ser simple (en el nombre del formulario y los valores terminados con un ; ) o bloque (tiene instrucciones adicionales incluidas con {} ). Y una directiva de bloque que contiene otras directivas se denomina contexto .

Todas las directivas se explican detalladamente en la documentación de Nginx en el sitio web del proyecto. Puedes consultarla para más información.

En un nivel fundamental, Nginx se puede usar para servir contenido estático como HTML y archivos multimedia, en modo independiente, donde solo se usa el bloque de servidor predeterminado (de manera análoga a Apache donde no se han configurado hosts virtuales)

Comenzaremos explicando brevemente la estructura de configuración en el archivo de configuración principal.

 
$ sudo vim /etc/nginx/nginx.conf

Si observa este archivo de configuración de Nginx, la estructura de configuración debería aparecer de la siguiente manera y se denomina contexto principal, que contiene muchas otras directivas simples y de bloque. Todo el tráfico web se maneja en el contexto http.

user  nginx;
worker_processes  1;
.....

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
.....

events {
       	.....
}

http {
	server{
		…….
	}
	.....
}

El siguiente es un archivo de ejemplo de configuración principal de Nginx ( /etc/nginx/nginx.conf ), donde el bloque http anterior contiene una directiva de inclusión que le indica a Nginx dónde encontrar los archivos de configuración del sitio web (configuraciones de host virtual) .

Nginx Configuration File

user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
        worker_connections 768;
        # multi_accept on;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

   include /etc/nginx/mime.types;
   default_type application/octet-stream;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;
    #gzip  on;
	
    include /etc/nginx/conf.d/*.conf;
}

Tenga en cuenta que en Ubuntu , también encontrará una directiva de inclusión adicional ( include/etc/nginx/sites-enabled/*; ), donde el directorio /etc/nginx/sites-enabled/ almacena enlaces simbólicos a los archivos de configuración de sitios web creados en /etc/nginx/sites-available/, para habilitar los sitios. Y eliminar un enlace simbólico desactiva ese sitio en particular.

Según el origen de la instalación, encontrará el archivo de configuración del sitio web predeterminado en /etc/nginx/conf.d/default.conf (si instaló desde el repositorio oficial NGINX y EPEL ) o /etc/nginx/sites-enabled/default (si instaló desde los repositorios de Ubuntu).

Este es nuestro bloque de servidor nginx predeterminado de muestra ubicado en /etc/nginx/conf.d/default.conf en el sistema de prueba.

server {
    listen    80 default_server;
    listen    [::]:80 default_server;
    server_name    _;
    root           /var/www/html/;
    index          index.html;
    location / {
                try_files $uri $uri/ =404;
        }
}

Una breve explicación de las directivas en la configuración anterior:

  • listen: specifies the port the server listens on.
  • server_name: defines the server name which can be exact names, wildcard names, or regular expressions.
  • root: specifies the directory out of which Nginx will serve web pages and other documents.
  • index: specifies the type(s) of index file(s) to be served.
  • location: used to process requests for specific files and folders.

Desde un navegador web, cuando apunta al servidor con el nombre de host localhost o su dirección IP, procesa la solicitud y sirve el archivo /var/www/html/index.html, e inmediatamente guarda el evento en su registro de acceso ( /var/log/nginx/access.log ) con una respuesta 200 (OK) . En caso de error (evento fallido), registra el mensaje en el registro de errores ( /var/log/nginx/error.log ).

Para obtener más información sobre cómo iniciar sesión en Nginx , puede consultar Cómo configurar el acceso personalizado o los formatos de registro de errores en Nginx.

En lugar de usar los archivos de registro predeterminados, puede definir archivos de registro personalizados para diferentes sitios web, como veremos más adelante, en la sección "Configuración de hosts virtuales basados ​​en nombres (bloques de servidor)".

Para restringir el acceso a su sitio web/aplicación o algunas partes de él, puede configurar la autenticación HTTP básica. Esto se puede usar esencialmente para restringir el acceso a todo el servidor HTTP, bloques de servidores individuales o bloques de ubicación.

Comience por crear un archivo que almacene sus credenciales de acceso ( nombre de usuario/contraseña ) utilizando la utilidad htpasswd

 
$ yum install httpd-tools		#RHEL/CentOS
$ sudo apt install apache2-utils	#Debian/Ubuntu

Como ejemplo, agreguemos administrador de usuarios a esta lista (puede agregar tantos usuarios como sea posible), donde se usa la opción -c para especificar el archivo de contraseña y el -B para cifrar la contraseña. Una vez que presione [Entrar] , se le pedirá que ingrese la contraseña de usuario:

$ sudo htpasswd -Bc /etc/nginx/conf.d/.htpasswd admin

Luego, asignemos los permisos y la propiedad adecuados al archivo de contraseña (reemplace al usuario y al grupo nginx con www-data en Ubuntu).

$ sudo chmod 640 /etc/nginx/conf.d/.htpasswd
$ sudo chown nginx:nginx /etc/nginx/conf.d/.htpasswd

Como mencionamos anteriormente, puede restringir el acceso a su servidor web, un sitio web único (utilizando su bloqueo de servidor) o un directorio o archivo específico. Se pueden usar dos directivas útiles para lograr esto:

  • auth_basic – turns on validation of user name and password using the “HTTP Basic Authentication” protocol.
  • auth_basic_user_file – specifies the credential’s file.

Como ejemplo, mostraremos cómo proteger con contraseña el directorio /var/www/html/protected .

server {
    listen         80 default_server;
    server_name    localhost;
    root           /var/www/html/;
    index          index.html;
    location / {
                try_files $uri $uri/ =404;
        }
     
    location /protected/ {
        auth_basic              "Restricted Access!";
        auth_basic_user_file    /etc/nginx/conf.d/.htpasswd;
    }
}

Ahora, guarde los cambios y reinicie el servicio Nginx.

$ sudo systemctl restart nginx 

La próxima vez que dirija su navegador al directorio anterior ( http:/localhost/protected ), se le pedirá que ingrese sus credenciales de inicio de sesión (nombre de usuario admin y la contraseña elegida ).

Un inicio de sesión exitoso le permite acceder a los contenidos del directorio, de lo contrario obtendrá un error " 401 Autorización requerida ".

Cómo configurar hosts virtuales basados ​​en nombre (bloques de servidor) en Nginx

El contexto del servidor permite que múltiples dominios/sitios se almacenen y sirvan desde la misma máquina física o servidor privado virtual (VPS). Se pueden declarar múltiples bloques de servidor (que representan hosts virtuales) dentro del contexto http para cada sitio/dominio. Nginx decide qué servidor procesa una solicitud en función del encabezado de solicitud que recibe.

Demostraremos este concepto utilizando los siguientes dominios ficticios, cada uno ubicado en el directorio especificado:

  • wearetecmint.com – /var/www/html/wearetecmint.com/
  • welovelinux.com – /var/www/html/welovelinux.com/

A continuación, asigne los permisos apropiados en el directorio para cada sitio.

$ sudo chmod -R 755 /var/www/html/wearetecmint.com/public_html 
$ sudo chmod -R 755 /var/www/html/welovelinux.com/public_html 

Ahora, cree un archivo index.html de muestra dentro de cada directorio public_html .

<html>
	<head>
		<title>www.wearetecmint.com</title>
	</head>
<body>
	<h1>This is the index page of www.wearetecmint.com</h1>
</body>
</html>

A continuación, cree los archivos de configuración del bloque del servidor para cada sitio dentro del directorio /etc/httpd/conf.d .

$ sudo vi /etc/nginx/conf.d/wearetecmint.com.conf
$ sudo vi /etc/nginx/conf.d/welovelinux.com.conf

Agregue la siguiente declaración de bloqueo del servidor en el archivo wearetecmint.com.conf .

wearetecmint.com.conf

server {
    listen         80;
    server_name  wearetecmint.com;
    root           /var/www/html/wearetecmint.com/public_html ;
    index          index.html;
    location / {
                try_files $uri $uri/ =404;
        }
     
}

A continuación, agregue la siguiente declaración de bloqueo del servidor en el archivo welovelinux.com.conf .

welovelinux.com.conf

server {
    listen         80;
    server_name    welovelinux.com;
    root           /var/www/html/welovelinux.com/public_html;
    index          index.html;
    location / {
                try_files $uri $uri/ =404;
        }
     
}

Para aplicar los cambios recientes, reinicie el servidor web Nginx.

$ sudo systemctl restart nginx

y apuntar su servidor web a las direcciones anteriores debe hacerle ver las páginas principales de los dominios ficticios.

http://wearetecmint.com
http://welovelinux.com

Puede manejar esto deshabilitando SELinux o configurando el contexto de seguridad correcto. Para obtener más información, consulte esta guía: uso de Nginx y Nginx Plus con SELinux en el sitio web de Nginx Plus.

Cómo instalar y configurar SSL con Nginx

Los certificados SSL ayudan a habilitar HTTP seguros ( HTTPS ) en su sitio, lo cual es esencial para establecer una conexión confiable/segura entre los usuarios finales y su servidor al encriptar la información que se transmite a, desde o dentro de su sitio.

Cubriremos cómo crear e instalar un certificado autofirmado y generar una solicitud de firma de certificado ( CSR ) para adquirir un certificado SSL de una autoridad de certificación ( CA ). para usar con Nginx.

Los certificados autofirmados son gratis para crear y son prácticamente buenos para fines de prueba y para servicios internos solo de LAN. Para servidores públicos, se recomienda encarecidamente usar un certificado emitido por una CA (por ejemplo, Let´s Encrypt) para mantener su autenticidad.

Para crear un certificado autofirmado, primero cree un directorio donde se almacenarán sus certificados.

$ sudo mkdir /etc/nginx/ssl-certs/

Luego genere su certificado autofirmado y la clave con la herramienta de línea de comandos openssl .

$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl-certs/nginx.key -out /etc/nginx/ssl-certs/nginx.crt

Describamos brevemente las opciones utilizadas en el comando anterior:

  • req -X509 – shows we are creating a x509 certificate.
  • -nodes (NO DES) – means “don’t encrypt the key”.
  • -days 365 – specifies the number of days the certificate will be valid for.
  • -newkey rsa:2048 – specifies that the key generated using RSA algorithm should be 2048-bit.
  • -keyout /etc/nginx/ssl-certs/nginx.key – specifies the full path of the RSA key.
  • -out /etc/nginx/ssl-certs/nginx.crt – specifies the full path of the certificate.

Luego, abra su archivo de configuración de host virtual y agregue las siguientes líneas a una declaración de bloqueo del servidor que escucha en el puerto 443 . Probaremos con el archivo de host virtual /etc/nginx/conf.d/wearetecmint.com.conf .

$ sudo vi /etc/nginx/conf.d/wearetecmint.com.conf

Luego agregue la directiva ssl al archivo de configuración nginx, debería verse similar a la siguiente.

server {
    listen 80;
    listen [::]:80;
    listen 443 ssl;
    listen [::]:443 ssl;
    
    ssl on;
    ssl_certificate /etc/nginx/ssl-certs/nginx.crt;
    ssl_trusted_certificate /etc/nginx/ssl-certs/nginx.crt;
    ssl_certificate_key /etc/nginx/ssl-certs/nginx.key;
    
    server_name  wearetecmint.com;
    root           /var/www/html/wearetecmint.com/public_html;
    index          index.html;
    location / {
                try_files $uri $uri/ =404;
        }

}

Ahora reinicie el Nginx y apunte su navegador a la siguiente dirección.

https://www.wearetecmint.com

Si desea comprar un certificado SSL de una CA, debe generar una solicitud de firma de certificado (CSR) como se muestra.

$ sudo openssl req -newkey rsa:2048 -nodes -keyout /etc/nginx/ssl-certs/example.com.key -out /etc/nginx/ssl-certs/example.com.csr

También puede crear una CSR a partir de una clave privada existente.

$ sudo openssl req -key /etc/nginx/ssl-certs/example.com.key -new -out /etc/nginx/ssl-certs/example.com.csr

Luego, debe enviar el CSR que se genera a un CA para solicitar la emisión de un certificado SSL firmado por una CA. Una vez que reciba su certificado de la CA, puede configurarlo como se muestra arriba.

En este artículo, hemos explicado cómo instalar y configurar Nginx; explica cómo configurar el alojamiento virtual basado en nombre con SSL para asegurar las transmisiones de datos entre el servidor web y un cliente.

Si experimentó algún contratiempo durante el proceso de instalación/configuración de nginx o si tiene preguntas o comentarios, utilice el formulario de comentarios a continuación para comunicarse con nosotros.