Esta es una entrada de blog de Nitish Tiwari, desarrollador de software en Minio, un servidor de almacenamiento de objetos distribuido especializado en aplicaciones en la nube y en el enfoque DevOps para el desarrollo y la entrega de aplicaciones. Entre los intereses de Nitish se encuentran las infraestructuras basadas en software, especialmente el almacenamiento y los sistemas distribuidos.
En este artículo, Nitish explica cómo utilizar NGINX y NGINX Plus como proxy inverso y balanceador de carga para servidores Minio. El artículo se aplica por igual a NGINX y NGINX Plus; para abreviar, solo se hace referencia a NGINX Plus.
Diseño del almacenamiento de objetos
Casi todas las aplicaciones necesitan almacenamiento, pero cada una lo necesita y utiliza de una forma concreta. Pensemos, por ejemplo, en un almacén de documentos: cuando es pequeño, quizá no tenga que atender solicitudes de lectura frecuentes, pero debe poder escalar a medida que pasa el tiempo. Otra aplicación, como una galería de imágenes, necesita tanto responder rápidamente a las solicitudes como escalar con el tiempo.
Estos matices dificultan la configuración del almacenamiento. Sin embargo, no todo son malas noticias: con la llegada del almacenamiento de objetos como método predeterminado para guardar datos no estructurados, HTTP se ha convertido en el modo de comunicación predeterminado, estandarizando la forma en que las aplicaciones se comunican con el almacenamiento.
Aun así, la pregunta sigue siendo: ¿cómo se configura un almacenamiento de objetos que se adapte a los requisitos de su aplicación y que, al mismo tiempo, siga siendo flexible?
Dado que el almacenamiento de objetos implica el uso de servidores y clientes HTTP, tiene sentido colocar delante un servidor web versátil como NGINX Plus para gestionar el tráfico HTTP. En el backend, se puede utilizar un servidor de almacenamiento de objetos ligero como Minio para proporcionar un almacenamiento escalable. La flexibilidad de un sistema de este tipo es clave para crear un servicio de nivel empresarial.

Con NGINX Plus, los administradores no solo pueden equilibrar la carga del tráfico entrante, sino también almacenarlo en caché, limitarlo, finalizar conexiones SSL/TLS e incluso filtrarlo en función de diversos parámetros. Minio, por su parte, ofrece un servidor ligero de almacenamiento de objetos compatible con Amazon S3.
MinIO está diseñado para el almacenamiento de IA y es especialmente adecuado para almacenar datos no estructurados, como fotos, vídeos, archivos de registro, copias de seguridad e imágenes de máquinas virtuales y contenedores. El servidor Minio es lo suficientemente ligero como para integrarse en la pila de aplicaciones, al igual que Node.js, Redis y MySQL. Minio también admite un modo distribuido, que permite agrupar varias unidades – incluso en máquinas diferentes – en un único servidor de almacenamiento de objetos.
En este artículo exploraremos algunas de las funciones de NGINX Plus en distintos casos de uso y aprenderemos a combinarlas con Minio para configurar un sistema de almacenamiento de objetos apto para entornos de producción, altamente escalable, con alta disponibilidad y estable.
NGINX Plus como proxy inverso y equilibrador de carga
NGINX Plus es ampliamente conocido como servidor proxy inverso. Pero ¿por qué se necesita un proxy inverso para Minio? Veamos algunos casos de uso:
- Con un proxy inverso NGINX Plus delante de uno o varios servidores Minio, puede trasladar las instancias del servidor Minio a diferentes máquinas o ubicaciones cuando lo necesite, sin tener que actualizar los clientes ni las aplicaciones.
- NGINX Plus puede equilibrar la carga del tráfico entrante y distribuirlo uniformemente entre las instancias de servidores Minio distribuidos.
- Un proxy NGINX Plus puede formar parte de una configuración de almacenamiento de objetos de alta disponibilidad con Minio mediante el cliente de Minio (
mc) y el comandomirror.
NGINX Plus actúa como proxy inverso del tráfico de los clientes, pasando las solicitudes a un servidor backend que escucha en la URL especificada por la directiva proxy_pass. En el siguiente fragmento de configuración, se ejecuta una instancia independiente de Minio en localhost, por lo que está disponible en http://localhost:9000. Todas las solicitudes que llegan al puerto 80 al directorio de nivel superior (/) de www.example.com se pasan a Minio. NGINX Plus establece explícitamente la cabecera Host en el valor que tenía en la solicitud original.
server { listen 80;
server_name www.example.com;
location / {
proxy_set_header Host $http_host;
proxy_pass http://localhost:9000;
}
}Si tiene varios servidores Minio, distribuya el tráfico entre ellos incluyéndolos en un bloque de configuración upstream y haciendo referencia al grupo de servidores upstream en la directiva proxy_pass:
upstream minio_servers { server minio-server-1:9000; server minio-server-2:9000; }
server {
listen 80;
server_name www.example.com;
location / {
proxy_set_header Host $http_host;
proxy_pass http://minio_servers;
}
}Para obtener más información sobre cómo configurar NGINX o NGINX Plus como proxy para Minio, consulte la documentación de Minio.
Terminación SSL/TLS
Ahora que HTTPS se está convirtiendo en el protocolo predeterminado para gran parte del tráfico web, tiene sentido implementar un servidor HTTPS para Minio, en lugar de limitarse a un servidor HTTP. Configurar NGINX Plus como servidor HTTPS es bastante sencillo. Para empezar, necesita un certificado SSL/TLS; Let’s Encrypt proporciona certificados SSL/TLS gratuitos y se integra con NGINX Plus.
El siguiente paso es editar el archivo de configuración de NGINX Plus. Aquí debe especificar el parámetro ssl en la directiva listen del bloque server, y después indicar los archivos que contienen el certificado del servidor y la clave privada:
server { listen 80;
server_name www.example.com;
return 301 https://www.example.com$request_uri;
}
server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate www.example.com.crt; ssl_certificate_key www.example.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_set_header Host $http_host;
proxy_pass http://localhost:9000;
}
}Para obtener más información sobre la terminación SSL/TLS, consulte la Guía del administrador de NGINX Plus.
Almacenamiento en caché
Los servidores de almacenamiento de objetos no son conocidos por su velocidad, pero eso no tiene por qué traducirse en respuestas lentas para los clientes. Al habilitar el almacenamiento en caché en el servidor NGINX Plus, este guarda los datos a los que se accede con frecuencia y puede devolverlos inmediatamente al cliente sin tener que reenviar la solicitud al servidor backend.
Así es como funciona. La caché web de NGINX Plus se sitúa entre el cliente y Minio y guarda una copia de cada archivo de contenido solicitado. Cuando un cliente solicita contenido almacenado en la caché, NGINX Plus lo devuelve directamente, sin contactar con Minio. Esto mejora el tiempo de respuesta al cliente y reduce la carga del servidor Minio.
La caché de NGINX Plus para Minio se configura con las directivas proxy_cache_path y proxy_cache. La directiva proxy_cache_path establece la ubicación y la configuración de la caché, mientras que la directiva proxy_cache la activa. Para obtener más información, consulte Guía sobre el almacenamiento en caché con NGINX y NGINX Plus.
proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
# ...
location / {
proxy_cache my_cache;
proxy_set_header Host $http_host;
proxy_pass http://localhost:9000;
}
}Limitación de solicitudes
A veces es necesario limitar las solicitudes por motivos empresariales o de seguridad. Con NGINX Plus, puede limitar el ancho de banda disponible, el número de solicitudes o el número de conexiones.
Para limitar el ancho de banda, utilice la directiva limit_rate. Este ejemplo limita la velocidad de descarga a 200 KB por segundo:
server { # ...
location /images/ {
limit_rate 200k;
# ...
}
}Para limitar la frecuencia de las solicitudes, utilice las directivas limit_req y limit_req_zone, como en este ejemplo, que limita cada dirección IP única a 10 solicitudes por segundo y permite ráfagas de 20 solicitudes.
limit_req_zone $binary_remote_addr zone=my_req_limit:10m rate=10r/s;
server {
# ...
location /images/ {
limit_req zone=my_req_limit burst=20;
# ...
}
}Para limitar el número de conexiones, utilice las directivas limit_conn y limit_conn_zone. Este ejemplo limita cada dirección IP única a 5 conexiones simultáneas.
limit_conn_zone $binary_remote_addr zone=my_conn_limit:10m;
server {
# ...
location /images/ {
limit_conn my_conn_limit 5;
# ...
}
}Para obtener más información, consulte la Guía de administración de NGINX Plus.
Resumen
En este artículo hemos mostrado cómo utilizar varias funciones de NGINX Plus para el balanceo de carga, en particular, delante de un servidor de almacenamiento de objetos Minio. La combinación de NGINX Plus y Minio permite configurar un servidor de almacenamiento de objetos flexible y adaptado a los requisitos de su aplicación.
Para obtener más información sobre el balanceo de carga con NGINX Plus, consulte estas entradas de blog y otros recursos:
- Balanceo de carga de alto rendimiento, una descripción general del balanceo de carga con NGINX y NGINX Plus
- Guía de administración de NGINX Plus
- 5 razones para pasarse al software de balanceo de carga, un libro electrónico que analiza las principales razones para dejar de usar ADC de hardware
Para probar NGINX Plus, empiece hoy mismo su prueba gratuita de 30 días o póngase en contacto con nosotros para hablar sobre sus casos de uso.
Sobre el autor
Artículos relacionados del blog
Únete a F5 NGINX en AppWorld 2024
Descubre las numerosas razones para asistir al evento insignia de F5, que incluirá un emocionante anuncio sobre la cartera de productos NGINX.
Rotación de certificados SSL/TLS sin reinicios en NGINX Open Source
La función de diccionario compartido permite configurar NGINX sin necesidad de reiniciarlo al renovar los certificados SSL/TLS.
Exposición de APIs en Kubernetes
La unidad 2 de Microservices March 2022 se centra en cómo exponer tus API en Kubernetes. Aquí tienes enlaces a los recursos que necesitas: la retransmisión en directo del 14 de marzo, artículos de blog y otros recursos de preparación, y el laboratorio práctico «Protege las API de Kubernetes mediante la limitación de solicitudes».
NGINX Sprint 2.0: visión clara, código renovado y nuevos compromisos con el código abierto
Hoy, en NGINX Sprint 2.0, anunciamos cómo respaldaremos nuestra visión del futuro de las aplicaciones modernas con una mayor presencia en la comunidad de código abierto, incluida la participación en el proyecto comunitario Kubernetes, nuevos proyectos de software de código abierto y la arquitectura de referencia para aplicaciones modernas.
Presentamos NGINX Plus R22
NGINX Plus R22 incorpora nuevas funcionalidades, como la compatibilidad con OCSP para verificar la revocación de certificados en TLS mutuo, el uso de varios proveedores de identidad OIDC en una configuración, el seguimiento en tiempo real de la limitación de solicitudes y conexiones en el panel de NGINX Plus y mejoras en NGINX JavaScript.
Presentamos NGINX Plus R17
NGINX Plus R17 incorpora compatibilidad con la limitación de velocidad en dos fases y con TLS 1.3, la versión más reciente del protocolo Transport Layer Security. La configuración de OpenID Connect es más sencilla y NGINX ModSecurity WAF es el doble de rápido que antes. También se ha actualizado el módulo JavaScript de NGINX.