Armazenamento em nuvem de nível empresarial com NGINX Plus e Minio

NGINX | 19 de janeiro de 2017

Este é um artigo de convidado escrito por Nitish Tiwari, desenvolvedor de software da Minio, um servidor de armazenamento distribuído de objetos especializado em aplicações na nuvem e na abordagem DevOps para o desenvolvimento e a entrega de aplicações. Os interesses de Nitish incluem infraestrutura baseada em software, especialmente armazenamento e sistemas distribuídos.

Neste post, Nitish explica como usar o NGINX e o NGINX Plus como um proxy reverso e balanceador de carga para servidores Minio. O conteúdo se aplica igualmente ao NGINX e ao NGINX Plus; para simplificar, menciona apenas o NGINX Plus.

Projetando o armazenamento de objetos

Quase todos os aplicativos precisam de armazenamento, mas cada um tem necessidades específicas e utiliza o armazenamento de maneiras diferentes. Considere, por exemplo, um repositório de documentos: quando pequeno, talvez não precise atender a solicitações frequentes de leitura, mas deve ser capaz de crescer com o tempo. Já outro aplicativo, como uma galeria de imagens, precisa responder rapidamente às solicitações e, ao mesmo tempo, ser escalável ao longo do tempo.

Essas nuances dificultam a configuração do armazenamento. No entanto, nem tudo é tão ruim – com o advento do armazenamento de objetos como a forma padrão de armazenar dados não estruturados, HTTP tornou-se o modo de comunicação padrão, uniformizando a maneira como os aplicativos se comunicam com o armazenamento.

Ainda assim, a questão permanece: como criar uma configuração de armazenamento de objetos que seja adaptada aos requisitos da sua aplicação, mas que continue flexível?

Como o armazenamento de objetos envolve servidores e clientes HTTP, faz sentido usar um servidor web versátil como o NGINX Plus na camada frontal para processar o tráfego HTTP. Um servidor leve de armazenamento de objetos, como o Minio, pode ser usado para fornecer armazenamento escalável no backend. A flexibilidade de um sistema desse tipo é fundamental para criar um serviço de nível empresarial.

NGINX Plus é um balanceador de carga eficiente para instâncias distribuídas do servidor de armazenamento de objetos em nuvem Minio
O NGINX Plus encerra conexões SSL/TLS de clientes e balanceia a carga entre servidores de armazenamento em nuvem Minio

Com o NGINX Plus, os administradores podem não apenas balancear a carga do tráfego de entrada, mas também armazená-lo em cache, limitar sua taxa, encerrar conexões SSL/TLS e até mesmo filtrá-lo com base em vários parâmetros. O Minio, por sua vez, oferece um servidor leve de armazenamento de objetos compatível com o Amazon S3.

O MinIO foi desenvolvido para armazenamento de IA e é ideal para armazenar dados não estruturados, como fotos, vídeos, arquivos de log, backups e imagens de máquinas virtuais e contêineres. O servidor Minio é leve o suficiente para ser integrado à pilha de aplicativos, assim como Node.js, Redis e MySQL. O Minio também oferece suporte a um modo distribuído, permitindo agrupar várias unidades — até mesmo em máquinas diferentes — em um único servidor de armazenamento de objetos.

Neste post, exploraremos alguns dos recursos do NGINX Plus em vários casos de uso e aprenderemos a combiná-los com o Minio para configurar um sistema de armazenamento de objetos pronto para produção, altamente escalável, altamente disponível e estável.

NGINX Plus como proxy reverso e balanceador de carga

O NGINX Plus é amplamente conhecido como um servidor proxy reverso. Mas por que é necessário um proxy reverso para o Minio? Vejamos alguns casos de uso:

  • Com um proxy reverso NGINX Plus à frente de um ou mais servidores Minio, você tem a liberdade de mover as instâncias do servidor Minio para diferentes máquinas/locais ao longo do tempo, sem precisar atualizar clientes ou aplicações.
  • O NGINX Plus pode balancear a carga do tráfego de entrada e distribuí-lo uniformemente entre as instâncias de servidor Minio distribuído.
  • Um proxy NGINX Plus pode fazer parte de uma configuração de armazenamento de objetos de alta disponibilidade com o Minio, usando o Minio Client (mc) e o comando mirror.

O NGINX Plus atua como proxy reverso do tráfego dos clientes, encaminhando as solicitações para um servidor de backend que escuta na URL especificada pela diretiva proxy_pass. No trecho de configuração a seguir, uma instância autônoma do Minio está em execução em localhost, portanto, está disponível em http://localhost:9000. Todas as solicitações recebidas na porta 80 para o diretório de nível superior (/) em www.example.com são encaminhadas ao Minio. O NGINX Plus define explicitamente o cabeçalho Host com o valor presente na solicitação original.

server {    listen 80;
    server_name www.example.com;

    location / {
        proxy_set_header Host $http_host;
        proxy_pass       http://localhost:9000;
    }
}

Se você tiver vários servidores Minio, distribua o tráfego entre eles listando-os em um bloco de configuração upstream e referenciando o grupo de upstream na diretiva 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 obter mais detalhes sobre como configurar o NGINX ou o NGINX Plus como proxy para o Minio, consulte a documentação do Minio.

Terminação SSL/TLS

Como o HTTPS está se tornando o protocolo padrão para grande parte do tráfego da Web, faz sentido implantar um servidor HTTPS para o Minio, em vez de simplesmente um servidor HTTP. É relativamente fácil configurar o NGINX Plus como um servidor HTTPS. Para começar, você precisa de um certificado SSL/TLS; o Let’s Encrypt fornece certificados SSL/TLS gratuitos e oferece integração com o NGINX Plus.

A próxima etapa é editar o arquivo de configuração do NGINX Plus. Nele, você precisa especificar o parâmetro ssl na diretiva listen do bloco server e, em seguida, especificar os arquivos que contêm o certificado do servidor e a chave 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 obter mais informações sobre a terminação SSL/TLS, consulte o Guia do Administrador do NGINX Plus.

Cache

Os servidores de armazenamento de objetos não são conhecidos por sua velocidade, mas isso não significa necessariamente respostas lentas aos clientes. Quando você habilita o cache no servidor NGINX Plus, ele armazena dados acessados com frequência e pode retorná-los imediatamente ao cliente, sem precisar encaminhar a solicitação ao servidor de backend.

Veja como funciona. O cache da Web do NGINX Plus fica entre o cliente e o Minio, salvando uma cópia de cada arquivo de conteúdo solicitado. Quando um cliente solicita um conteúdo armazenado no cache, o NGINX Plus o retorna diretamente, sem entrar em contato com o Minio. Isso melhora o tempo de resposta para o cliente e reduz a carga no servidor Minio.

Você configura o cache do NGINX Plus para o Minio com as diretivas proxy_cache_path e proxy_cache. A diretiva proxy_cache_path define o local e a configuração do cache, enquanto a diretiva proxy_cache o ativa. Para obter mais detalhes, consulte Um guia sobre armazenamento em cache com o NGINX e o 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;
    }
}

Limitação de taxa

Às vezes, é necessário limitar as solicitações por motivos comerciais ou de segurança. Com o NGINX Plus, você pode limitar a largura de banda disponível, o número de solicitações ou o número de conexões.

Para limitar a largura de banda, use a diretiva limit_rate. Este exemplo limita a velocidade de download a 200 KB por segundo:

server {    # ...
    location /images/ {
        limit_rate 200k;
        # ...
    }
}

Para limitar a taxa de requisições, use as diretivas limit_req e limit_req_zone, como neste exemplo, que limita cada endereço IP exclusivo a 10 requisições por segundo, permitindo picos de 20 requisições.

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 o número de conexões, use as diretivas limit_conn e limit_conn_zone. Este exemplo limita cada endereço IP exclusivo a 5 conexões simultâneas.

limit_conn_zone $binary_remote_addr zone=my_conn_limit:10m;
server {
    # ...
    location /images/ {
        limit_conn my_conn_limit 5;
        # ...
    }
}

Para mais detalhes, consulte o Guia de Administração do NGINX Plus.

Resumo

Neste post, demonstramos o uso de vários recursos do NGINX Plus para balanceamento de carga — em particular, para balanceamento de carga na frente de um servidor de armazenamento de objetos Minio. A combinação do NGINX Plus com o Minio permite configurar um servidor de armazenamento de objetos flexível e adaptado aos requisitos da sua aplicação.

Para saber mais sobre balanceamento de carga com o NGINX Plus, consulte estas publicações do blog e outros recursos:

Para experimentar o NGINX Plus, comece hoje mesmo sua avaliação gratuita de 30 dias ou entre em contato conosco para conversar sobre seus casos de uso.


Compartilhar

Publicações relacionadas no blog

Como o F5 NGINX One aprimora o gerenciamento e a observabilidade
NGINX | 10/10/2024

Como o F5 NGINX One aprimora o gerenciamento e a observabilidade

Descubra como o F5 NGINX One aprimora o gerenciamento e a observabilidade de ambientes híbridos e multicloud ao oferecer um console web centralizado baseado em SaaS, com insights em tempo real, conformidade automatizada e gerenciamento simplificado de configurações.

Do OpenAPI ao NGINX como gateway de API usando uma API declarativa
NGINX | 17/06/2024

Do OpenAPI ao NGINX como gateway de API usando uma API declarativa

Descubra como transformar uma definição de esquema OpenAPI em uma configuração NGINX totalmente funcional, operando como um API Gateway com a segurança de um Web Application Firewall e um Portal do Desenvolvedor, usando uma abordagem declarativa de API.

Como gerenciar picos repentinos de tráfego e sobrecarga do servidor
NGINX | 14/07/2021

Como gerenciar picos repentinos de tráfego e sobrecarga do servidor

Picos de tráfego e sobrecarga de servidores são preocupações sérias para varejistas online em qualquer época, mas especialmente durante a “Cyber Season” de compras de fim de ano. Detalhamos como você pode aproveitar as soluções de entrega de aplicações de nível de produção da NGINX para se preparar para aumentos repentinos de tráfego.

Distribuição segura de chaves privadas SSL com o NGINX
NGINX | 02/04/2019

Distribuição segura de chaves privadas SSL com o NGINX

Descrevemos três maneiras progressivamente mais seguras de proteger chaves privadas SSL ao configurar o NGINX para processar tráfego HTTPS: permitir acesso de leitura apenas ao usuário root, criptografar as chaves com senhas armazenadas separadamente e distribuir as senhas a partir de um repositório central.

Agrupando solicitações de API em lotes com NGINX Plus e o módulo JavaScript do NGINX
NGINX | 24/05/2018

Agrupando solicitações de API em lotes com NGINX Plus e o módulo JavaScript do NGINX

O módulo JavaScript do NGINX lançado com o NGINX Plus R15 oferece suporte a subsolicitações, possibilitando uma classe totalmente nova de casos de uso para o NGINX Plus. Este exemplo completo também usa a API do NGINX Plus e os módulos de chave-valor para converter solicitações de API dos clientes em solicitações separadas para as APIs dos microsserviços que compõem um aplicativo.

Como superar o esgotamento de portas efêmeras no NGINX e no NGINX Plus
NGINX | 19/04/2016

Como superar o esgotamento de portas efêmeras no NGINX e no NGINX Plus

Confira dicas para evitar o esgotamento de portas efêmeras com ajustes no kernel do Linux, conexões keepalive e conexões vinculadas dinamicamente a endereços IP locais.