Configuração e Implantação do Nginx em Servidores Linux

Preparação e Instalação do Nginx

Entes de iniciar o processo de instalação do Nginx, é recomendável verificar se alguma versão anterior já está presente no sistema e, se for o caso, removê-la para evitar conflitos.

whereis nginx

Em seguida, crie um diretório específico para o Nginx em /usr/local, que é um local comum para software compilado manualmente.

cd /usr/local
mkdir nginx
cd nginx

Acesse o site oficial do Nginx (nginx.org/download) para baixar a versão estável mais recente. Após o download, transfira o arquivo compactado (por exemplo, nginx-1.20.2.tar.gz) para o diretório /usr/local/nginx no seu servidor.

Com o arquivo no local, descompacte-o:

tar -xvf nginx-1.20.2.tar.gz

Navegue até o diretório da versão descompactada:

cd nginx-1.20.2

Instalação de Dependências

O Nginx requer algumas bibliotecas e ferramentas de compilação. Instale-as usando o gerenciador de pacotes yum (comum em sistemas CentOS/RHEL):

yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel

Configuração e Compilação

Execute o script configure para preparar a compilação. É importante incluir módulos como http_stub_status_module para monitoramento básico e http_ssl_module para suporte a HTTPS/SSL:

./configure --with-http_stub_status_module --with-http_ssl_module

Após a configuração, compile o Nginx e instale-o no sistema:

make
make install

Gerenciamento Básico do Nginx

O executável principal do Nginx, juntamente com scripts de controle, está localizado em /usr/local/nginx/sbin. Acesse este diretório para gerenciar o serviço.

cd /usr/local/nginx/sbin

Para iniciar o Nginx, você pode executá-lo diretamente, opcionalmente especificando o arquivo de configuração:

/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

Para recarregar a configuração ou reiniciar o Nginx, use os comandos de sinalização:

./nginx -s reload

Verifique se o Nginx está em execução:

ps -ef | grep nginx

Configuração de Firewall

Para permitir que o tráfego externo acesse o Nginx na porta 80 (HTTP) ou 443 (HTTPS), é necessário configurar o firewall do sistema. O exemplo a seguir usa firewall-cmd, que é padrão em sistemas CentOS 7+.

Verifique o status da porta 80:

firewall-cmd --query-port=80/tcp

Se a porta não estiver liberada, adicione-a permanentemente à zona pública e recarregue o firewall:

firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload

Verifique o status do firewall e as portas abertas:

firewall-cmd --state
netstat -tlnp

Observação: Se estiver utilizando um servidor em nuvem (como Alibaba Cloud, AWS, GCP, Azure), você também precisará configurar as regras de segurança (grupos de segurança ou listas de controle de acesso de rede) no painel de controle da sua provedora para permitir o tráfego nas portas desejadas.

Verificação da Instalação

Após iniciar o Nginx e configurar o firewall, acesse o endereço IP público do seu servidor em um navegador web. Se a instalação foi bem-sucedida, você verá a página de boas-vindas padrão do Nginx.

Comandos Essenciais do Nginx

  • ./nginx -s reload: Recarrega as configurações do Nginx sem interromper as conexões ativas.
  • ./nginx: Inicia o Nginx.
  • ./nginx -s stop: Encerra o Nginx de forma abrupta.
  • ./nginx -s reopen: Reabre os arquivos de log do Nginx.
  • ./nginx -s quit: Encerra o Nginx de forma elegante, aguardando a conclusão das conexões ativas.
  • nginx -v: Exibe a versão do Nginx.
  • killall nginx: Encerra todos os processos do Nginx.
  • ps -ef | grep nginx: Lista os processos do Nginx em execução.

Configuração do Nginx para Iniciar no Boot

Para garantir que o Nginx inicie automaticamente sempre que o servidor for reiniciado, é recomendável criar um serviço systemd.

1. Crie o arquivo de serviço nginx.service em /etc/systemd/system/:

sudo vim /etc/systemd/system/nginx.service

2. Adicione o seguinte conteúdo ao arquivo:

[Unit]
Description=Serviço Nginx
After=network.target

[Service]
Type=forking
User=root # Altere para o usuário sob o qual o Nginx deve rodar (ex: nginx)
Group=root # Altere para o grupo sob o qual o Nginx deve rodar (ex: nginx)
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit

[Install]
WantedBy=multi-user.target

3. Salve e feche o arquivo.

4. Recarregue a configuração do systemd para reconhecer o novo serviço:

sudo systemctl daemon-reload

5. Habilite o serviço Nginx para iniciar no boot e inicie-o imediatamente:

sudo systemctl enable nginx
sudo systemctl start nginx

Outros comandos úteis para o serviço systemd do Nginx:

  • sudo systemctl status nginx: Verifica o status do serviço.
  • sudo systemctl stop nginx: Para o serviço.
  • sudo systemctl restart nginx: Reinicia o serviço.

Configuração de Proxy Reverso e SSL

Para organizar suas configurações, é uma boa prática criar um diretório conf.d dentro de /usr/local/nginx/conf para armazenar arquivos de configuração específicos para seus domínios ou aplicações.

1. Crie o diretório conf.d e, opcionalmente, um subdiretório domain para certificados SSL:

mkdir /usr/local/nginx/conf/conf.d
mkdir /usr/local/nginx/conf/conf.d/domain

2. Inclua todos os arquivos .conf do diretório conf.d no arquivo principal nginx.conf, dentro do bloco http:

http {
    # ... outras configurações ...

    include             /usr/local/nginx/conf/mime.types;
    default_type        application/octet-stream;

    # Carrega arquivos de configuração adicionais
    include /usr/local/nginx/conf/conf.d/*.conf;

    # ... outros blocos server ou configurações padrão ...
}

3. Crie um novo arquivo de configuração para seu domínio em /usr/local/nginx/conf/conf.d/ (ex: seuservico.conf).

Exemplo de Proxy Reverso com SSL (HTTPS)

Este exemplo configura um servidor virtual que escuta na porta 443 (HTTPS), usa certificados SSL e encaminha as requisições para um serviço rodando localmente em uma porta específica (proxy reverso).

server {
    listen 443 ssl;
    server_name seu-dominio.com.br; # Substitua pelo seu domínio
    ssl_certificate /usr/local/nginx/conf/conf.d/domain/seu-dominio.com.br.pem; # Caminho para o certificado
    ssl_certificate_key /usr/local/nginx/conf/conf.d/domain/seu-dominio.com.br.key; # Caminho para a chave privada
    client_max_body_size 10M; # Limite de tamanho de requisição

    index index.html index.htm index.php; # Arquivos de índice padrão
    charset utf-8;

    # Raiz do documento (se houver arquivos estáticos diretamente neste servidor)
    # root /data/seu-servico;

    proxy_set_header X-Real-IP $remote_addr; # Preserva o IP real do cliente

    location / {
        proxy_connect_timeout 300s; # Tempo limite para conectar ao upstream
        proxy_read_timeout 300s;    # Tempo limite para ler resposta do upstream
        proxy_send_timeout 300s;    # Tempo limite para enviar requisição ao upstream
        proxy_set_header Host $host; # Preserva o cabeçalho Host original
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # Adiciona IP ao cabeçalho X-Forwarded-For
        proxy_pass http://127.0.0.1:8080; # Encaminha para o serviço na porta 8080
    }
}

Exemplo de Servidor para Recursos Estáticos com SSL

Este exemplo configura um servidor para servir arquivos estáticos com suporte a SSL e compressão Gzip.

server {
    listen 443 ssl;
    server_name cdn.seu-dominio.com.br; # Domínio para recursos estáticos
    ssl_certificate /usr/local/nginx/conf/conf.d/domain/cdn.seu-dominio.com.br.pem;
    ssl_certificate_key /usr/local/nginx/conf/conf.d/domain/cdn.seu-dominio.com.br.key;
    client_max_body_size 10M;

    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 5m;

    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;

    index index.html index.htm; # Arquivos de índice para o diretório raiz
    root /data/estaticos/app; # Raiz onde os arquivos estáticos estão localizados

    location / {
        try_files $uri $uri/ =404; # Tenta servir o arquivo ou diretório, senão retorna 404
    }

    gzip on; # Habilita compressão Gzip
    gzip_min_length 1000; # Tamanho mínimo para compressão
    gzip_proxied expired no-cache no-store private auth; # Comprimir para proxies
    gzip_types text/plain application/javascript application/x-javascript text/css application/xml application/octet-stream; # Tipos de MIME para comprimir
}

Configuração de Balanceamento de Carga (Load Balancing)

O Nginx pode atuar como um balanceador de carga, distribuindo requisições entre múltiplos servidores backend. Isso é configurado usando o bloco upstream.

Definição do Bloco Upstream

Adicione um bloco upstream dentro do bloco http no seu nginx.conf ou em um arquivo de configuração incluído. Este bloco define um grupo de servidores de back end.

http {
    # ... outras configurações ...

    # Configuração de grupo de servidores (upstream) para balanceamento de carga
    upstream servicos_backend {
        server 127.0.0.1:8080 weight=1; # Servidor principal com peso 1
        server 127.0.0.1:9090 weight=2; # Outro servidor com peso 2 (receberá o dobro de requisições)
        server 127.0.0.1:9000 backup;   # Servidor de backup, ativado apenas se os outros falharem
    }

    # ... outros blocos server ...
}

Parâmetros de Peso: O parâmetro weight define a proporção de requisições que um servidor receberá. No exemplo, o servidor na porta 9090 receberá o dobro de requisições que o servidor na porta 8080.

Servidor de Backup: O parâmetro backup designa um servidor que só será utilizado se todos os outros servidores ativos no grupo upstream estiverem indisponíveis. Isso é útil para atualizações, pois você pode desativar os servidores principais e o Nginx encaminhará o tráfego para o backup.

Configuração da Localização para Balanceamento de Carga

No bloco server onde você deseja aplicar o balanceamento de carga, configure um bloco location para direcionar o tráfego para o grupo upstream definido.

server {
    listen 80;
    server_name meu-app.com;

    location /api/ {
        proxy_pass http://servicos_backend/; # Encaminha para o grupo de servidores 'servicos_backend'
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_connect_timeout 50s;
        proxy_read_timeout 50s;
        proxy_send_timeout 50s;
    }

    # ... outras localizações ou configurações ...
}

Com esta configuração, qualquer requisição para /api/ será balanceada entre os servidores definidos no bloco servicos_backend.

Após quaisquer alterações na configuração do Nginx, sempre recarregue o serviço para que as mudanças entrem em vigor:

sudo systemctl reload nginx

Tags: nginx Linux CentOS RHEL Proxy Reverso

Publicado em 6-7 17:12 por Thomas