Instalando o nginx

O primeiro passo é instalar o nginx. Não há muito o que falar nessa parte. O Guia do PC utiliza Ubuntu Server, logo, o nginx pode ser instalado com apt-get install nginx (o mesmo para outros sistemas baseados em Debian). Consulte a documentação para a sua distribuição. Se você gosta de compilar seus próprios programas, acesse a página de download do nginx e baixe a última versão.

Configurando o nginx

Agora vem a melhor parte: configurar o servidor. A wiki do projeto fornece algumas dicas para você configurar o seu. É importante lembrar que o nginx é um servidor web completo, e a única razão para eu ter feito isso foi para evitar qualquer possível incompatibilidade com os sistemas já servidos pelo Apache (como os que utilizam mod_rewrite por meio de .htaccess).

O “truque” para que nossa técnica funcione é o seguinte: fazer o nginx utilizar a porta 80 (HTTP) e deixar o Apache rodando em outra porta. No caso do Guia do PC, eu deixei o Apache rodando na porta 1234, mas você pode escolher qualquer outra porta, como 13579 ou 6969. Primeiro, vamos mudar a porta do Apache. Isso pode ser feito editando o arquivo /etc/apache2/ports.conf (em alguns casos, a configuração está em httpd.conf ou apache2.conf) e alterando as diretivas NameVirtualHost e Listen, como na imagem abaixo.

Trocando a porta do Apache no /etc/apache2/ports.conf

Trocando a porta do Apache no /etc/apache2/ports.conf

Dependendo de como você configurou seu servidor, talvez seja necessário alterar o arquivo de configuração específico do seu site (como os VirtualHosts, localizados em /etc/apache2/sites-enabled) para que ele também escute na porta desejada.

Agora, vamos configurar o /etc/nginx/nginx.conf, que fará nossa belezinha funcionar. Minha configuração foi baseada no exemplo da wiki do nginx.


user                    www-data www-data;
worker_processes        4;
error_log               /var/log/nginx/error.log;
pid                     /var/run/nginx.pid;
worker_rlimit_nofile    8192;
 
events {
    worker_connections  4096;
}
 
http {
    include    mime.types;
    include    /etc/nginx/proxy.conf;
 
    default_type application/octet-stream;
    log_format   main '$remote_addr - $remote_user [$time_local]  $status '
      '"$request" $body_bytes_sent "$http_referer" '
      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log   /srv/www/guiadopc.com.br/logs/nginx.log  main;
    sendfile     on;
    tcp_nopush   on;
    server_names_hash_bucket_size 128;
 
    server {
        listen       80;
        server_name  guiadopc.com.br www.guiadopc.com.br;
        access_log   /srv/www/guiadopc.com.br/logs/nginx.log  main;
 
        location ~ ^/(images|javascript|js|css|flash|media|static)/ {
            root    /srv/www/guiadopc.com.br/public_html;
            expires 30d;
        }
 
        location ~* ^.+.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)$ {
            root    /srv/www/guiadopc.com.br/public_html;
            expires 30d;
        }
 
        location / {
        proxy_pass      http://127.0.0.1:1234;
        }
    }
}

Acredito que o arquivo é auto-explicativo. Vou só dar uma atenção maior aos parâmetros que você, necessariamente, precisa alterar. Nos dois access_log, você precisa especificar o local em que deseja guardar os logs de acesso do nginx. Em server_name, é uma boa ideia alterar o valor para o endereço do seu site. Em root, insira o caminho da pasta em que estão guardados todos os arquivos do site. Na diretiva proxy_pass, coloque o endereço no qual os requests dinâmicos (páginas em PHP, por exemplo) serão “redirecionados”. Isso será feito pelo próprio nginx, logo, você não precisa colocar um IP público aqui. Não se esqueça de utilizar a mesma porta que você configurou no Apache!(a não ser que você goste de ver erros 404 por toda parte :) )

Se você não tem um /etc/nginx/proxy.conf configurado, pode utilizar o arquivo abaixo (é o mesmo da wiki do nginx). Se você não criar esse arquivo, seu nginx não iniciará.


proxy_redirect          off;
proxy_set_header        Host            $host;
proxy_set_header        X-Real-IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size    10m;
client_body_buffer_size 128k;
proxy_connect_timeout   90;
proxy_send_timeout      90;
proxy_read_timeout      90;
proxy_buffers           32 4k;

Colocando o nginx e o Apache em ação!

Agora que você já configurou o Apache e o nginx, reinicie os dois servidores. Isto pode ser feito comservice apache2 restart && service nginx restart. Pronto, seu servidor já está funcionando!

Tá, e o que eu ganhei com isso?

Ao acessar seu site, com certeza você já notou uma melhora no desempenho, especialmente se ele estiver em um VPS com poucos recursos e roda aplicativos pesados em PHP, como o WordPress. O Apache consome megabytes de RAM preciosos para cada requisição do usuário. Ao utilizar o nginx para servir seu conteúdo estático (imagens, CSS, JavaScript), você liberou grande parte dessas requisições e deixou o Apache apenas com a parte pesada do serviço.

Outra vantagem muito importante: seu Apache estará menos congestionado. Quando um usuário visita seu site, o Apache abre uma conexão para que o usuário possa fazer o download do conteúdo. Essa conexão fica aberta até o término do download. Com o nginx como proxy reverso, acontecerá o seguinte: o nginx acessará os arquivos do Apache e, como o acesso é feito localmente (na mesma máquina ou em uma máquina da rede local), o download do conteúdo é praticamente instantâneo, liberando as conexões do Apache para outras requisições. O nginx foi feito para suportar muitas conexões, logo, você não terá problemas com isso.

Antes, com o Apache servindo todo o conteúdo, o consumo de memória do servidor do Guia do PC ficava por volta dos 900 MB, degradando significativamente a velocidade de carregamento do site e derrubando a máquina muitas vezes, por falta de recursos. Com o nginx servindo conteúdo estático…213 MB de RAM. Em horário de pico!

Isto é, um ganho de quase 80%! Isso porque, em alguns casos, o uso de memória cai para 160 MB. Sobra muito mais processamento e memória para quando você sair na página principal do Digg, não? :) O nginx também é muito, muito, mas muito mais rápido que o Apache. Não tem nem comparação. Faça testes com ferramentas como o ApacheBench e você saberá do que estou falando.



Uso de processador e HD (Fonte: http://blog.zhuzhaoyuan.com). A linha vermelha representa a separação entre Apache e nginx como proxy reverso.

Claro que não dá para fazer milagre. Esse baixo consumo de memória só foi obtido porque o servidor está rodando apenas com os serviços essenciais para que as coisas funcionem: Postfix, Apache, nginx, MySQL, SSH, firewall e nada mais (mesmo). O servidor de DNS é externo, o gerenciamento de arquivos é feito por SFTP ao invés de FTP (dispensando o uso de um servidor FTP e usando o próprio SSH para isso) e o Postfix apenas redireciona os e-mails para contas externas. Simples assim. Nada de painel de controle e outros serviços que deixam o servidor lerdo. Porém, se você não tem como deixar seu servidor bem enxuto, garanto que se beneficiará mesmo assim. Até a próxima!

Fonte:
Paulo Higa
Home-page: paulohiga.com/posts/nginx-proxy-reverso-php-apache.php