Libro: Nginx Cookbook

By rogerarjona July 3, 2023, 9:04 p.m. Balanceadores Servidores Nginx Proxy

Nginx se ha convertido en una herramienta esencial para servir aplicaciones basadas en Web. Su rendimiento y su capacidad para manejar grandes cantidades de tráfico lo han convertido en una opción popular para empresas de todos los tamaños.

El libro explica desde la instalación de la aplicación, hasta configuración avanzada para servir grandes cantidades de tráfico. En este resumen, pondré lo que me pareció más interesante del libro.

Ver las estadísticas de Nginx.

Una de las formas de ver las estadísticas de nginx es habilitando "nginx_status" y acceder al servidor en la url "/nginx_status" para poder visualizar la información de las conexiones y las peticiones realizadas al servidor. Sin embargo, existe un paquete de Python que lee el archivo de log para poder realizar estas métricas de formas simple sin tener que exponer la URL de información.

El repositorio es el siguiente: https://github.com/lebinh/ngxtop
Basta con instalarlo en el entorno de python y ejecutarlo.

Instalación

pip install ngxtop

Ejecución

ngxtop

Output

running for 411 seconds, 64332 records processed: 156.60 req/sec

Summary:
|   count |   avg_bytes_sent |   2xx |   3xx |   4xx |   5xx |
|---------+------------------+-------+-------+-------+-------|
|   64332 |         2775.251 | 61262 |  2994 |    71 |     5 |

Detailed:
| request_path                             |   count |   avg_bytes_sent |   2xx |   3xx |   4xx |   5xx |
|------------------------------------------+---------+------------------+-------+-------+-------+-------|
| /abc/xyz/xxxx                            |   20946 |          434.693 | 20935 |     0 |    11 |     0 |
| /xxxxx.json                              |    5633 |         1483.723 |  5633 |     0 |     0 |     0 |
| /xxxxx/xxx/xxxxxxxxxxxxx                 |    3629 |         6835.499 |  3626 |     0 |     3 |     0 |
| /xxxxx/xxx/xxxxxxxx                      |    3627 |        15971.885 |  3623 |     0 |     4 |     0 |
| /xxxxx/xxx/xxxxxxx                       |    3624 |         7830.236 |  3621 |     0 |     3 |     0 |
| /static/js/minified/utils.min.js         |    3031 |         1781.155 |  2104 |   927 |     0 |     0 |
| /static/js/minified/xxxxxxx.min.v1.js    |    2889 |         2210.235 |  2068 |   821 |     0 |     0 |
| /static/tracking/js/xxxxxxxx.js          |    2594 |         1325.681 |  1927 |   667 |     0 |     0 |
| /xxxxx/xxx.html                          |    2521 |          573.597 |  2520 |     0 |     1 |     0 |
| /xxxxx/xxxx.json                         |    1840 |          800.542 |  1839 |     0 |     1 |     0 |

Modificaciones de Nginx para mejorar su uso.

Optimizar la configuración de Nginx es esencial para mejorar su rendimiento y eficiencia. Al modificar aspectos clave en el archivo de configuración conseguimos incrementos en su funcionamiento, pero también podríamos afectar al rendimiento si no sabemos que es lo que estamos cambiando. El libro menciona lo siguiente:

  1. Ubicación del archivo de configuración: Se encuentra comúnmente en /etc/nginx/nginx.conf o /usr/local/nginx/conf/nginx.conf.
  2. worker_processes: El parámetro worker_processes controla el número de procesos de trabajo de Nginx que manejarán las solicitudes entrantes. De manera predeterminada, está configurado para aprovechar el número de núcleos disponibles en el servidor. Si tu servidor tiene múltiples núcleos, puedes aumentar este valor para aprovechar al máximo el rendimiento. Sin embargo, ten en cuenta que aumentar este valor en exceso puede consumir recursos del sistema.
  3. worker_connections: El parámetro worker_connections determina el número máximo de conexiones simultáneas que puede manejar cada proceso de trabajo. Aumentar este valor puede permitir que Nginx maneje más solicitudes concurrentes.
  4. keepalive_timeout: La directiva keepalive_timeout establece el tiempo máximo en segundos que una conexión se mantendrá abierta en espera de solicitudes adicionales. Ajustar este valor adecuadamente puede mejorar la eficiencia al evitar el establecimiento y cierre frecuente de conexiones.
  5. Almacenamiento en caché: Nginx ofrece opciones para almacenar en caché contenido estático, como imágenes, archivos CSS y JavaScript. Puedes habilitar la caché utilizando directivas como proxy_cache_path y proxy_cache.
  6. Compresión de contenido (gzip): La compresión de contenido puede reducir el tamaño de los archivos transmitidos y acelerar la entrega al cliente. La directiva gzip te permite habilitar la compresión en Nginx y configurar parámetros como el nivel de compresión y los tipos de archivos a comprimir.

¿Como debuggear Nginx?

Los registros de Nginx son una fuente valiosa de información que nos permite comprender mejor el rendimiento y el comportamiento de nuestro servidor web. Estos archivos se configuran en el archivo de .conf de tu aplicación, puede cambiarse el nombre y la ubicación.

  1. Registro de acceso (access.log): El registro de acceso de Nginx, por lo general denominado access.log, registra cada solicitud HTTP que recibe el servidor. Proporciona información detallada sobre cada solicitud, como la dirección IP del cliente, la fecha y hora de la solicitud, el método HTTP utilizado y el código de estado de la respuesta.
  2. Registro de error (error.log): El registro de error de Nginx, conocido como error.log, registra cualquier evento o error relacionado con el servidor. Esto puede incluir errores de configuración, solicitudes fallidas, tiempo de espera agotado, etc. Es fundamental revisar este registro para solucionar problemas y mejorar la estabilidad del servidor.

Los archivos de log tienen el siguiente formato:

192.168.0.1 - - [30/Jun/2023:10:35:27 +0000] "GET /secure-page HTTP/1.1" 200 2048 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.45.67.89 Safari/537.36" SSLv3/TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 256

Para modificar el formato de registro de Nginx, debes ajustar la directiva log_format en el archivo de configuración de Nginx. La directiva log_format define el formato del registro de acceso y te permite personalizar qué información se registra y cómo se presenta. Aquí hay una guía paso a paso para modificar el formato de registro de Nginx:

  1. Abre el archivo de configuración principal de Nginx en tu editor de texto preferido. Por lo general, se encuentra en /etc/nginx/nginx.conf o /usr/local/nginx/conf/nginx.conf.
  2. Busca la sección http en el archivo de configuración. Dentro de esa sección, ubicarás la directiva log_format.
  3. La directiva log_format tiene un nombre seguido de un espacio y una cadena de formato.

Para modificar el formato de registro, puedes editar la cadena de formato según tus necesidades. Aquí hay algunos marcadores de formato comunes que puedes utilizar:

  • $remote_addr: Dirección IP del cliente.
  • $remote_user: Nombre de usuario, si está habilitada la autenticación.
  • $time_local: Fecha y hora de la solicitud.
  • $request: Línea de solicitud HTTP completa.
  • $status: Código de estado HTTP de la respuesta.
  • $body_bytes_sent: Tamaño en bytes de la respuesta enviada al cliente.
  • $http_referer: URL de la página desde la que se realizó la solicitud.
  • $http_user_agent: Agente de usuario del cliente (navegador).

Redireccionar.

Para redireccionar solicitudes con Nginx, puedes utilizar la directiva rewrite en el archivo de configuración. La directiva rewrite te permite definir reglas de redirección basadas en patrones de URL. Aquí te explico cómo puedes redireccionar con Nginx:

  1. Abre el archivo de configuración principal de Nginx en tu editor de texto preferido. Por lo general, se encuentra en /etc/nginx/nginx.conf o /usr/local/nginx/conf/nginx.conf.
  2. Busca la sección server donde deseas aplicar la redirección. Puedes agregar una nueva sección server si deseas aplicarla a un dominio o ubicación específica.
  3. Dentro de la sección server, agrega una directiva location que defina la ruta o el patrón de URL para el cual deseas aplicar la redirección. Por ejemplo:
server {
    listen 80;
    server_name example.com;

    location /old-page {
            rewrite ^/old-page$ /new-page permanent;
    }
}
  • regex es la expresión regular que coincide con la URL que deseas redireccionar.
  • destino es la URL a la que deseas redireccionar.
  • código es un código de redirección opcional (por ejemplo, 301 para una redirección permanente).

Bloquear peticiones y agentes maliciosos.

Para bloquear peticiones con Nginx, puedes utilizar la directiva deny en tu archivo de configuración. La directiva deny te permite especificar direcciones IP, rangos de direcciones IP o patrones de IP que deseas bloquear. Justo como el ejemplo anterior, dentro del "location" agregamos la linea "deny":

server {
    listen 80;
    server_name example.com;

    location /admin {
        deny 192.168.0.1 10.0.0.1;
    }
}

Reverse Proxy VS Forward Proxy


La diferencia entre un reverse proxy y un forward proxy en Nginx radica en la dirección del flujo de las solicitudes y respuestas entre los clientes y los servidores.

Un reverse proxy actúa como intermediario entre los clientes y los servidores. Cuando un cliente realiza una solicitud, el reverse proxy recibe la solicitud y la reenvía al servidor correspondiente. Luego, recibe la respuesta del servidor y la envía de vuelta al cliente. El cliente no sabe que está comunicándose directamente con el servidor, ya que todo el flujo de datos pasa a través del reverse proxy. Algunas características clave del reverse proxy son:

  • Oculta la existencia y detalles de los servidores reales.
  • Puede distribuir la carga entre varios servidores mediante balanceo de carga.
  • Puede proporcionar caché para mejorar el rendimiento.
  • Puede realizar la terminación SSL para conexiones seguras.

Nginx es ampliamente utilizado como un servidor reverse proxy debido a su rendimiento y capacidad para manejar múltiples conexiones simultáneas.

Un forward proxy también actúa como intermediario entre los clientes y los servidores, pero con una diferencia clave. En lugar de representar a los servidores finales, un forward proxy representa a los clientes y permite que estos soliciten recursos a través del proxy. El cliente configura su navegador o aplicación para utilizar el forward proxy, y todas las solicitudes salientes se envían primero al proxy. El proxy, a su vez, reenvía esas solicitudes a los servidores correspondientes y devuelve las respuestas al cliente. Algunas características clave del forward proxy son:

  • Permite a los clientes navegar por Internet de forma anónima ocultando su dirección IP real.
  • Puede realizar filtrado de contenido y control de acceso para bloquear o permitir ciertos recursos.
  • Puede proporcionar caché para acelerar las respuestas a solicitudes recurrentes.

Explicación