Búsqueda de sitios web

Cómo instalar Nginx con hosts virtuales y certificado SSL


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

En este artículo, se analizará cómo usar Nginx como servidor HTTP, configurarlo para servir contenido web, 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 

Una vez instalado 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 mediante 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 debería 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 los puertos 80 y 443 para permitir el tráfico HTTP y HTTPS. respectivamente, a través de él, 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 comprobar si se está ejecutando y es capaz de servir páginas web es abrir un navegador web y apuntar a la IP del servidor.

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

Una instalación en funcionamiento debería 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 tanto en CentOS como en 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 formato nombre y valores terminados con ;) o bloque (tiene instrucciones adicionales adjuntas usando {}). Y una directiva de bloque que contiene otras directivas se llama context.

Todas las directivas se explican exhaustivamente en la documentación de Nginx en el sitio web del proyecto. Puede consultarlo para obtener más información.

Cómo ofrecer contenido estático usando Nginx en modo independiente

A un nivel fundamental, Nginx se puede utilizar para servir contenido estático, como HTML y archivos multimedia, en modo independiente, donde solo se utiliza el bloque de servidor predeterminado (análogo 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 esto 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 configuración principal de Nginx de muestra (/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). .

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 deshabilita ese sitio en particular.

Según su fuente de instalación, encontrará el archivo de configuración del sitio web predeterminado en /etc/nginx/conf.d/default.conf (si lo instaló desde el repositorio oficial NGINX). y EPEL) o /etc/nginx/sites-enabled/default (si instaló desde 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:

  • escuchar: especifica el puerto en el que escucha el servidor.
  • server_name: define el nombre del servidor, que puede ser nombres exactos, nombres comodín o expresiones regulares.
  • raíz: especifica el directorio desde el cual Nginx servirá páginas web y otros documentos.
  • índice: especifica los tipos de archivos de índice que se entregarán.
  • ubicación: se utiliza para procesar solicitudes de archivos y carpetas específicos.

Desde un navegador web, cuando apunta al servidor utilizando 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 utilizar 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 servidores)".

Cómo restringir el acceso a una página web con Nginx

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 utilizar esencialmente para restringir el acceso a todo el servidor HTTP, bloques de servidor individuales o bloques de ubicación.

Comience creando un archivo que almacenará 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 el usuario admin a esta lista (puede agregar tantos usuarios como sea posible), donde la opción -c se usa para especificar el archivo de contraseña y la opción -B para cifrar la contraseña. Una vez que presione [Entrar], se le pedirá que ingrese la contraseña del usuario:

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

Luego, asignemos los permisos y la propiedad adecuados al archivo de contraseña (reemplace el usuario y el 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, a un solo sitio web (usando su bloque de servidor) o a un directorio o archivo específico. Se pueden utilizar dos directivas útiles para lograr esto:

  • auth_basic: activa la validación del nombre de usuario y la contraseña mediante el protocolo “Autenticación básica HTTP”.
  • auth_basic_user_file: especifica el archivo de la credencial.

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 apunte 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 permitirá acceder al contenido del directorio; de lo contrario, recibirá un error "Autorización 401 requerida".

Cómo configurar hosts virtuales basados en nombres (bloques de servidores) en Nginx

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

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

  • wearelinux-console.net – /var/www/html/wearelinux-console.net/
  • welovelinux.com – /var/www/html/welovelinux.com/

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

sudo chmod -R 755 /var/www/html/wearelinux-console.net/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.wearelinux-console.net</title>
	</head>
<body>
	<h1>This is the index page of www.wearelinux-console.net</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/wearelinux-console.net.conf
sudo vi /etc/nginx/conf.d/welovelinux.com.conf

Agregue la siguiente declaración de bloque de servidor en el archivo wearelinux-console.net.conf.

server {
    listen         80;
    server_name  wearelinux-console.net;
    root           /var/www/html/wearelinux-console.net/public_html ;
    index          index.html;
    location / {
                try_files $uri $uri/ =404;
        }
     
}

A continuación, agregue la siguiente declaración de bloque de servidor en el archivo 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 debería hacerle ver las páginas principales de los dominios ficticios.

http://wearelinux-console.net
http://welovelinux.com

Importante: Si tiene SELinux habilitado, su configuración predeterminada no permite que Nginx acceda a archivos fuera de ubicaciones autorizadas conocidas (como /etc/nginx para configuraciones, /var/log/nginx para registros, /var/www/html para archivos web, etc.) .

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 seguro (HTTPS) en su sitio, lo cual es esencial para establecer una conexión confiable/segura entre los usuarios finales y su servidor al cifrar la información que se transmite hacia, 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 certificadora (CA). para usar con Nginx.

Los certificados autofirmados se pueden crear de forma gratuita y son prácticamente válidos para fines de prueba y para servicios internos de LAN únicamente. Para servidores públicos, se recomienda encarecidamente utilizar 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 usando la herramienta de línea de comando 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: muestra que estamos creando un certificado x509.
  • -nodos (NO DES): significa "no cifrar la clave".
  • -days 365: especifica el número de días durante los cuales el certificado será válido.
  • -newkey rsa:2048: especifica que la clave generada mediante el algoritmo RSA debe ser de 2048 bits.
  • -keyout /etc/nginx/ssl-certs/nginx.key: especifica la ruta completa de la clave RSA.
  • -out /etc/nginx/ssl-certs/nginx.crt: especifica la ruta completa del certificado.

A continuación, abra el archivo de configuración de su host virtual y agregue las siguientes líneas a una declaración de bloque de servidor que escucha en el puerto 443. Probaremos con el archivo de host virtual /etc/nginx/conf.d/wearelinux-console.net.conf.

sudo vi /etc/nginx/conf.d/wearelinux-console.net.conf

Luego agregue la directiva ssl al archivo de configuración de nginx, debería verse similar a lo que se muestra a continuación.

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  wearelinux-console.net;
    root           /var/www/html/wearelinux-console.net/public_html;
    index          index.html;
    location / {
                try_files $uri $uri/ =404;
        }

}

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

https://www.wearelinux-console.net

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 la CSR que se genera a una 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.

Lea también: La guía definitiva para proteger, reforzar y mejorar el rendimiento del servidor web Nginx

Resumen

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

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