Apuntes de Kirby
  • 👀whoami
  • 🦉Redes
    • Introducción Redes
      • Organizaciones
      • Historia
      • Puntos de conexión
      • Métodos de acceso a la red
    • Clasificación de las redes
    • Topología de las red
    • Direccionamiento IP
      • IPv4
        • Subredes IPv4
        • Superredes IPv4
        • VLSM
      • IPv6
      • MAC
      • NAT
    • Enrutamiento estático
    • Enrutamiento dinámico
      • RIPv1 & RIPv2
      • Tablas de enrutamiento
      • 🚧Redes conmutadas
    • CML
      • 🚧1er CML lab
    • CISCO
      • ¿Qué son las VLAN?
        • Ejemplo 1 de VLAN
        • Ejemplo 2 de VLAN
      • Acceso y password
      • NAT / PAT
    • Firewalls
      • Tipos de firewalls
      • ZPF
        • Funcionamiento
        • Configurando un ZPF
      • Sophos Firewall XG
        • Sophos home
        • Aprendiendo a usar Sophos
      • pfSense
        • Instalando pfSense
        • OpenVPN en pfSense
        • Port Forward
        • Alias
    • Proxy
      • Squid en pfSense
        • Squid Proxy Server
        • SquidGuard Proxy
      • Proxy reverse Nginx
    • 🚧Suricata
  • 🐝Servicios
    • Servidores Web
      • Nginx
        • NGINX, hosts virtuales
        • Hosts virtuales basados en dominio
        • PHP-FPM
        • Nginx: PHP y MySQL
          • MySQLi - PHP
        • En Alpine linux
        • 🚧Proxy
    • Servidores de correo
      • Seguridad en el correo
      • Postfix
      • hMailServer
      • Clientes de correo
        • Mailutils
        • Mutt
    • Servidores de FTP
      • FileZilla
      • VSFTPD
      • FTP vía IIS
    • Servidores DNS
      • DNS - Windows Server 2016
      • DNS - Ubuntu Server 22.04
      • Systemd
    • Servidores DHCP
      • DHCP-Windows Server 2016
      • DHCP-Ubuntu Server 22.04
    • Servidores MySQL
    • 🚧Mensajería instantánea
      • Ejabberd
    • 🚧Imágenes - Vídeos
      • FFMPEG + YT-DLP
      • Plex
      • Jellyfin
      • Plesk
      • RTMP
      • SRT
    • Webmin + Virtualmin
  • NextCloud
  • 🔑Seguridad
    • NAS
      • Instalación Synology NAS en VirtualBox
        • Creación de volúmenes y su uso
        • Actualización Synology NAS
        • Creación de usuarios y carpetas compartidas
        • Funciones del panel de control
          • Acceso por SSH
          • Configuración de los servicios de archivos
          • Configuración de red
          • Copias de seguridad (restauración)
          • Seguridad
          • Personalizar páginas de inicio
          • Servicio de notificaciones
        • Centro de paquetes Synology
          • Servidores multimedia
          • Paquetes de utilidades
          • Cloud Sync
          • Hyper Backup
          • Synology Office
      • Truenas
        • Rsync en Truenas
      • OpenmediaVault
    • Backups
      • Rsync
        • Ejemplo de rsync
    • ¿Qué son las ACL?
    • SOPS/AGE
    • RAID
      • mdadm
  • 🐳Virtualización
    • Proxmox
      • Instalar en VMWare
      • Instalar en VirtualBox
      • Entorno Proxmox
      • Almacenamiento local
      • Añadir discos
      • Clonar
      • Qemu agent
      • Linux container - LXC
      • Clúster
      • Red Interna
      • 🚧Proxmox Backup
      • 🚧Otras consideraciones
    • Alpine Linux
    • Contenedores
      • Docker
        • YAML
        • Instalando Docker
        • Portainer
          • Instalando Portainer
          • Dentro de Portainer
        • Docker volumen
        • Docker compose
          • Docker: PHP y MySQL
          • Importar sitio web en Docker
          • Instalando Wordpress
      • Pi-hole
        • Instalando Pi-hole en Docker
        • Instalando Pi-hole en Debian
        • RDP
          • RDP - Docker
  • 🐞Misceláneas
    • Datos - codificación
    • IPTables
    • Túnel con Cloudflare
    • Servidor de video
    • Comandos de Linux
    • Anaconda & Spyder
    • CGI - NGINX
    • Arduino
      • Capítulo 0 Blink
      • Capítulo 1 Led
      • Capítulo 2 Botton & LED
  • ⁉️Interesante
    • Curioso
    • Ideas
Powered by GitBook
On this page
  • Archivos de configuración
  • Sirviendo contenido estático
  • Resultado
  • Acceso personalizado
  • Protegiendo un directorio específico

Was this helpful?

Edit on GitHub
  1. Servicios
  2. Servidores Web
  3. Nginx

NGINX, hosts virtuales

Nginx está compuesto por una serie de módulos que son controlados por directivas especificadas en el archivo de configuración.

Estas directivas se dividen en simples y de bloque.

  • Una directiva simple consiste en el nombre y los parámetros separados por espacio y terminados en punto y coma ;

  • Una directiva de block tiene la misma estructura que una simple, pero en lugar de ; termina con un conjunto adicional de instrucciones entre llaves { }. Si una directiva de bloque contiene otras directivas dentro de llaves, se denomina contexto.

Se considera que están dentro del contexto principal aquellas directivas colocadas en el archivo de configuración fuera de cualquier contexto.

Los eventos y las directivas http residen en el contexto principal, el servidor en http y la ubicación en el servidor.

http {
      server {
      }
}
location / {
      root /var/www;       
}

Archivos de configuración

Los archivos de configuración de Nginx se encuentran en el directorio:

/etc/nginx

y el archivo de configuración global es:

/etc/nginx/nginx.conf

La estructura de configuración del archivo de configuración principal se muestra como sigue:

Tener en cuenta que, en Ubuntu existe una directiva de inclusión adicional:

include/etc/nginx/sites-enabled/*;

porque el directorio /etc/nginx/sites-enabled/ almacena los enlaces simbólicos a los archivos de configuración de sitios web creados en /etc/nginx/sites-available/ para habilitar los sitios. Y el hecho de eliminar un enlace simbólico deshabilita ese sitio en particular.

El directorio donde se localizan todos los archivos de configuración de Nginx es /etc/nginx/ y dentro debemos tener en consideración /etc/nginx/sites-available, /etc/nginx/sites-enable y el propio /etc/nginx/nginx.conf que vimos anteriormente.

Archivo /sites-available/default

Este sería el bloque del servidor Nginx predeterminado de muestra ubicado en

/etc/nginx/conf.d/default.conf en el sistema de prueba.

Donde:

  • listen: 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.

  • root: especifica el directorio desde el cual Nginx servirá páginas web y otros documentos.

  • index: especifica los tipos de archivos de índice que se publicarán.

  • location: se utiliza para procesar solicitudes de archivos y carpetas específicos.

Solo de tener instalado el Nginx, si escribimos: localhost en el navegador veremos su página por defecto. Esto es:

Sirviendo contenido estático

Es de suponer que una tarea importante del servidor web es entregar archivos del tipo imágenes o páginas HTML estáticas. Vamos a implementar un ejemplo en el que, según la solicitud, los archivos se entregarán desde diferentes directorios locales /var/www/ con archivos HTML y /var/www/images que contiene imágenes.

Hay que tener en cuenta que debemos crear nuestro contenido web en un directorio. Podemos utilizar el directorio por defecto: /var/www/ y si lo analizamos, veremos que dentro se encuentra una carpeta llamada /var/www/html que contiene el archivo que se muestra desde el navegador: index.nginx-debian.html cuando escribimos: localhost en la barra de navegación.

Sitios web de prueba

En mi caso, crearé dos directorios dentro de la carpeta /var/www/:

/var/www/example1.com y /var/www/example2.com

Dentro de /var/www/example1.com creamos una carpeta para las imágenes. En este caso:

/var/www/example1.com/img de modo que tendremos una estructura como la siguiente:

El archivo index.html es muy simple:

<!DOCTYPE html>
<html>
<head>
<title>Punky Web</title>
</head>
<body>
 
<h1>Remember Coffee</h1>
<p>My sweet owl</p>
<img src="img/cafe.jpg" />
Sin café no funciono!!!
</body>
</html>

Para el caso de example2.com hacemos algo similar.

<!DOCTYPE html>
<html>
<head>
<title>Alita Web</title>
</head>
<body>
 
<h1>Papillon</h1>
<p>Siempre</p>
<img src="img/papillon.jpg" />
</body>
</html>

Archivos de configuración en nginx

Ya tenemos dos sitios web. Ahora tenemos que crear los ficheros de configuración dentro de /etc/nginx/sites-available:

/etc/nginx/sites-available/example1.conf
/etc/nginx/sites-available/example2.conf

En el archivo de configuración predeterminado default ya se incluye un ejemplo del bloque del servidor. Se encuentra comentado pero lo podemos utilizar copiando y pegando el propio archivo default, des comentamos las líneas y adecuamos a nuestras necesidades.

Por tanto, el archivo de configuración para el sitio web example1.com sería /etc/nginx/sites-available/example1.conf

server {
        listen 8080;
        root /var/www/example1.com;
        index index.html;
        server_name example1.com www.example1.com;

        location / {
                try_files $uri $uri/ =404;
        }

        location /images/{
                root /img;
        }
}

Y similar para el caso del sitio web example2.com sería /etc/nginx/sites-available/example2.conf

server {
        listen 8081;
        root /var/www/example2.com;
        index index.html;
        server_name example2.com www.example2.com;

        location / {
                try_files $uri $uri/ =404;
        }

        location /images/{
                root /img;
        }
}

Tener en cuenta que hemos utilizado un puerto diferente para cada sitio web: el 8080 para el example1.com y el 8081 para el example2.com.

Resultado

Podremos visualizar las dos páginas web desde un equipo cliente (en mi caso Ubuntu Desktop por red interna) utilizando la IP aunque no el dominio, esto es:

Si quiero verificar los puertos abiertos en el servidor podemos hacer:

sudo netstat –tlpn | grep nginx

y nos muestra lo siguiente:

Acceso personalizado

En lugar de utilizar los archivos de registro predeterminados, podemos definir archivos de registro personalizados para diferentes sitios web.

Para restringir el acceso a un sitio web/aplicación o algunas partes del mismo, podemos configurar la autenticación HTTP básica. Esto se puede utilizar esencialmente para restringir el acceso a todo el servidor HTTP, bloques de servidores individuales o bloques de ubicación. Para ello instalamos apache2-utils:

sudo apt install apache2-utils

A continuación, mediante la utilidad htpasswd, crearemos el archivo que almacenará nuestras credenciales de acceso (nombre de usuario/contraseña). Y como ejemplo, agreguemos el administrador de usuarios (en mi caso kirby) a esta lista. Tened en consideración que podemos agregar tantos usuarios como necesitemos.

Una vez que presione Enter, se te pedirá ingresar la contraseña del usuario:

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

Las opciones que vamos a utilizar son:

-c especificar el archivo de contraseña -B cifrar la contraseña.

Para mayor información acerca del funcionamiento de la herramienta htpasswd, puedes hacer:

man htpasswd

Luego, asignamos los permisos y la propiedad adecuados al archivo de contraseña (reemplaza el usuario y grupo por www-data).

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

Se puede restringir el acceso al servidor web, un solo sitio web (usando su bloque de servidor) o un directorio o archivo específico. Se pueden usar 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.

Protegiendo un directorio específico

Veamos a ver cómo proteger con contraseña el directorio /var/www/kirby.com/protected. Dentro de la carpeta /protected he puesto el archivo index.html para hacer la prueba.

Para ello agregamos el bloque location /protected en el archivo de configuración kirby.com.conf:

server {
    listen         80;
    server_name    www.kirby.com kirby.com;
    root           /var/www/kirby.com/;
    index          index.php  index.html;
    location / {
                try_files $uri $uri/ =404;
        }
    
    location /protected/ {
        auth_basic              "Restricted Access!";
        auth_basic_user_file    /etc/nginx/conf.d/.htpasswd;
    }
    
    location ~ /.php {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.2-fpm:sock;
    }
    
}

Ahora, guardamos los cambios y reiniciamos el servicio Nginx.

$ sudo systemctl restart nginx

o bien:

$ sudo nginx -s reload

Con esto, la próxima vez que intentes acceder a ese directorio http://www.kirby.com/protected te pedirá que ingreses las credenciales de inicio de sesión (en mi caso user: kirby y password: la elegida).

Un inicio de sesión exitoso te permite acceder al contenido del directorio; de lo contrario, obtendrá un error de Se requiere autorización 401.

En este ejemplo no hemos creado ningún contenido dentro del directorio protected así que para testear correctamente el sitio deberíamos hacerlo.

PreviousNginxNextHosts virtuales basados en dominio

Last updated 1 year ago

Was this helpful?

(café)

(papillon)

🐝
http://192.168.6.100:8080
http://192.168.6.100:8081
Archivo de configuración /etc/nginx/nginx.conf
Directorio /etc/nginx
Fichero /etc/nginx/sites-available/default
Página web por defecto de Nginx
Contenido del sitio example1.com
Sitio web www.example1.com
Los puertos habilitados para Nginx
Archivo .htpasswd
Drectorio /var/www/html/protected