Guia Prático e Conciso para Configuração do Nginx em Cenários Comuns

Visão Geral

O que é o Nginx?

Nginx (engine x) é um servidor web leve, também utilizado como servidor de proxy reverso e como proxy de correio eletrônico (IMAP/POP3).

O que é um proxy reverso?

Um proxy reverso aceita conexões da internet e as encaminha para servidores em uma rede interna. As respostas dos servidores internos são então retornadas aos clientes. Neste cenário, o servidor de proxy atua como um intermediário, apresentando-se como um servidor de destino.

Instalação e Utilização Básica

Instalação

Para instruções detalhadas de instalação, consulte a documentação oficial do Nginx.

Utilização

O gerenciamento do Nginx é feito através de comandos simples. Os coamndos mais comuns são:

nginx -s encerramento_rapido   # Finaliza o Nginx rapidamente, sem salvar informações.
nginx -s encerramento_suave    # Finaliza o Nginx de forma suave, salvando informações.
nginx -s recarregar            # Recarrega os arquivos de configuração.
nginx -s reabrir_log           # Reabre os arquivos de log.
nginx -c caminho/do/arquivo    # Especifica um arquivo de configuração.
nginx -t                       # Testa a sintaxe dos arquivos de configuração.
nginx -v                       # Exibe a versão do Nginx.
nginx -V                       # Exibe a versão, compilador e parâmetros de configuração.

Para Windows, um script em lote pode simplificar o processo. Abaixo, um exemplo para o diretório de instalação:

@echo off
nginx.exe -s stop
nginx.exe -t -c conf/nginx.conf
nginx.exe -c conf/nginx.conf

Exemplos de Configuração

Configuração de Proxy Reverso HTTP

O objetivo é configurar um proxy reverso HTTP simples. O arquivo nginx.conf padrão pode ser modificado da seguinte forma:

worker_processes  1;
error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  principal  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent"';

    access_log  /var/log/nginx/access.log  principal;
    sendfile    on;
    keepalive_timeout  65;

    upstream servidor_aplicativo {
        server 127.0.0.1:8089;
    }

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

        location / {
            proxy_pass http://servidor_aplicativo;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }

        location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
            root /caminho/para/recursos/estaticos;
            expires 30d;
            access_log off;
        }

        location /status {
            stub_status on;
            access_log off;
            allow 127.0.0.1;
            deny all;
        }
    }
}

Para aplicar, altere seu arquivo hosts e reinicie o Nginx.

Configuração de Balanceamento de Carga

Para distribuir o tráfego entre múltiplos servidores, utilize o bloco upstream.

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    access_log    /var/log/nginx/access.log;

    upstream cluster_servidores {
        server 192.168.1.11:80 weight=3;
        server 192.168.1.12:80;
        server 192.168.1.13:80 backup;
    }

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

        location / {
            proxy_pass http://cluster_servidores;
            proxy_next_upstream error timeout;
            proxy_set_header Host $host;
            proxy_connect_timeout 30;
        }
    }
}

Configuração para Múltiplas Aplicações Web

Direcionar subcaminhos para diferentes aplicações é feito com múltiplos blocos location.

http {
    upstream app_vendas {
        server localhost:8081;
    }
    upstream app_admin {
        server localhost:8082;
    }

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

        location / {
            proxy_pass http://app_vendas;
        }

        location /administracao/ {
            proxy_pass http://app_admin;
        }

        location /api/ {
            proxy_pass http://backend_api;
        }
    }
}

Configuração de Proxy Reverso HTTPS

Habilitar HTTPS envolve aidcionar diretivas SSL ao bloco server.

server {
    listen 443 ssl;
    server_name www.meudominio.com;

    ssl_certificate      /etc/nginx/ssl/certificado.pem;
    ssl_certificate_key  /etc/nginx/ssl/chave_privada.key;

    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;

    location / {
        proxy_pass http://backend_http;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
    }
}

Servidor de Arquivos Estáticos e Estáticos Puros

Para servir um site estático, aponte a root para o diretório dos arquivos.

server {
    listen 80;
    server_name static.meudominio.com;
    root /var/www/site_estatico;
    index index.html;

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

    # Configuração para servidor de download de arquivos
    location /downloads/ {
        autoindex on;
        autoindex_exact_size off;
        autoindex_localtime on;
        charset utf-8;
        alias /srv/armazenamento/;
    }
}

Solução de CORS com Nginx

Para resolver problemas de Cross-Origin, insira os cabeçalhos CORS diretamente no Nginx.

Crie um arquivo /etc/nginx/conf.d/cors.conf:

if ($request_method = 'OPTIONS') {
    add_header 'Access-Control-Allow-Origin' '*';
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
    add_header 'Access-Control-Allow-Headers' 'DNT,X-Requested-With,Content-Type,Authorization';
    add_header 'Access-Control-Max-Age' 1728000;
    add_header 'Content-Type' 'text/plain; charset=utf-8';
    add_header 'Content-Length' 0;
    return 204;
}

add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always;
add_header 'Access-Control-Allow-Headers' 'DNT,X-Requested-With,Content-Type,Authorization' always;

Então, inclua este arquivo nos server blocks ou location blocks necessários:

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

    location /api/ {
        include /etc/nginx/conf.d/cors.conf;
        proxy_pass http://servidor_api_interno:8080/;
    }
}

Tags: nginx Proxy Reverso Balanceamento de Carga HTTPS CORS

Publicado em 6-18 17:23