REDES O pequeno e poderoso servidor web e proxy reverso Nginx Web mais rápida O rápido e prático servidor web Nginx é fácil de configurar e estender. por Jeremy Garcia O Nginx (a pronúncia correta é êndjinn-éks) [1] é um servidor HTTP e proxy reverso de código aberto. Conhecido por sua alta performance, estabilidade, grande número de opções, facilidade de configuração e baixo consumo de recursos. O Nginx, escrito por Igor Sysoev, é utilizado em muitos sites de grande porte, incluindo WordPress. com, Hulu e LinuxQuestions.org. Além de sua funcionalidade com HTTP, o Nginx também pode servir como proxy IMAP/POP3. O suporte básico do Nginx a HTTP inclui a capacidade de servir arquivos estáticos, proxy reverso acelerado com cache opcional, um balanceamento de carga simples, tolerância a falhas, FastCGI remoto com caching e aceleração e server name indication (SNI) SSL/TLS. Assim como o httpd do Apache, o Nginx possui muitos recursos que Tabela 1: Infraestrutura 56 Máquina IP público IP interno nginx 10.0.0.1 192.168.1.1 web01 nenhum 192.168.1.2 web02 nenhum 192.168.1.3 são implementados de maneira modular e só precisam ser habilitados se necessários. Diferentemente do httpd baseado em processos, o Nginx é assíncrono. A maior vantagem disso é a escalabilidade. Por um lado, em um servidor baseado em processos, cada conexão simultânea necessita de uma thread, o que pode levar a um overhead significativo, principalmente sob carga intensa. Por outro, um servidor assíncrono se baseia em eventos e lida com as requisições em uma única thread (ou, pelo menos, algumas poucas). Instalação Se você já tem um site simples ou está começando um do zero, é bem possível que você possa deixar o Apache de lado e usar o Nginx para to- http://www.linuxmagazine.com.br Nginx | REDES das as suas necessidades com HTTP. Nesse caso, é recomendável visitar a página de módulos do Nginx [2] e verificar se todos os recursos necessários estão disponíveis. Este artigo descreve um uso comum do Nginx como proxy reverso com balanceamento de carga em múltiplos backends httpd do Apache. O Nginx serve algum conteúdo estático e, depois, compacta automaticamente o conteúdo dinâmico do httpd via proxy. A maioria das distribuições GNU/ Linux possui o Nginx nos repositórios de pacotes, por isso, é possível instalá-lo facilmente com o gerenciador de pacotes padrão. Se a sua distribuição não oferecer um pacote, ou se o pacote oferecido for antigo demais, visite http://nginx.net/ e baixe a última versão estável (0.7.63 no momento da produção deste artigo). A instalação envolve o processo padrão ./configure && make && sudo make install. É recomendável verificar as opções de configuração disponíveis e adaptá-las ao seu ambiente, apesar de os padrões funcionarem na maioria dos casos. Por padrão, o comando ./configure deve retornar algo semelhante a: Configuration summary + using system PCRE library + using system OpenSSL library + md5: using OpenSSL library + using sha1 library: /usr/include + using system zlib library É importante verificar se as bibliotecas mostradas estão presentes, caso você planeje usar os recursos providos por elas. Por exemplo, o módulo Rewrite necessita da biblioteca PCRE e o SSL precisa da OpenSSL. Com o Nginx instalado, é hora de criar uma configuração básica. Configuração básica Este artigo se baseia numa infraestrutura com três servidores. A máquina com Nginx deve estar, de Linux Magazine #61 | Dezembro de 2009 Listagem 1: Arquivo nginx.conf básico 01 02 03 04 05 06 07 08 09 10 11 12 user nobody; worker_processes 2; events { worker_connections 1024; use epoll; } http { include mime.types; default_type application/octet‑stream; log_format custom ‘$http_host $remote_addr ‑ $remote_user [$time_local] “$request” ‘ 13 ‘$status $body_bytes_sent “$http_referer” ‘ 14 ‘”$http_user_agent”’; 15 access_log /path/to/access.log custom; 16 sendfile on; 17 server_tokens off; 18 19 upstream cluster { 20 server 192.168.1.2 weight=1; // o peso pode ser alterado para 21 server 192.168.1.3 weight=1; // enviar mais tráfego a um servidor. 22 } 23 24 server { 25 listen 10.0.0.1:80; 26 server_name www.domain.com domain.com; 27 location / { 28 proxy_pass http://cluster; 29 proxy_redirect off; 30 proxy_set_header Host $host; 31 proxy_set_header X‑Real‑IP $remote_addr; 32 proxy_set_header X‑Forwarded‑For $proxy_add_x_forwarded_for; 33 proxy_buffers 8 32k; 34 } 35 } 36 } Listagem 2: SSL no nginx.conf 01 server { 02 listen 10.0.0.1:443; 03 server_name www.domain.com; 04 add_header Front‑End‑Https on; 05 keepalive_timeout 70; 06 ssl on; 07 ssl_certificate /path/to/server.crt; 08 ssl_certificate_key /path/to/server.key; 09 10 location / { 11 proxy_pass http://cluster; 12 proxy_redirect off; 13 proxy_set_header Host $host; 14 proxy_set_header X‑Real‑IP $remote_addr; 15 proxy_set_header X‑Forwarded‑For $proxy_add_x_forwarded_for; 16 proxy_buffers 4 32k; 17 proxy_set_header X‑Forwarded‑Proto https; 18 } 19 } 57 REDES | Nginx preferência, na rede pública (interagindo com os usuários) e também na rede privada (comunicando-se com os servidores). As máquinas com o httpd não necessitam de acesso à rede pública. O esquema usado para este artigo está na tabela 1. Tendo-a em mente, edite o arquivo nginx.conf com as informações da listagem 1. Essa configuração fará com que todos os dois servidores httpd recebam o mesmo número de requisições. Por padrão, o Nginx faz um balanceamento de carga bem simples, via rodízio de requisições. Se você quiser que as requisições sejam distribuídas para os servidores com base no endereço IP do cliente, use a diretiva ip_hash. O suporte a ou- Listagem 3: Gzip no nginx.conf 01 gzip on; 02 gzip_http_version 1.0; 03 gzip_vary on; 04 gzip_min_length 1100; 05 gzip_buffers 16 8k; 06 gzip_comp_level 5; 07 gzip_proxied any; 08 gzip_types text/plain text/css application/javascript text /javascript text/xmlapplication/x‑javascript; 09 gzip_disable “MSIE [1‑6]\.”; Listagem 4: nginx.conf com memcached 01 server { 02 location / { 03 set $memcached_key $uri; 04 memcached_pass name:11211; 05 default_type text/html; 06 error_page 404 @fallback; 07 } 08 09 location @fallback { 10 proxy_pass cluster; 11 } 12 } Listagem 5: stub_status nginx.conf 01 location /nginx_status { 02 stub_status on; 03 access_log off; 04 allow TRUSTED.IP.ADDRESSES 05 deny all; 06 } Listagem 6: Saída do comando nginx_status 01 02 03 04 05 58 Active connections: 291 server accepts handled requests 16630948 16630948 31070465 Reading: 6 Writing: 179 Waiting: 106 This server has 291 active connections, has accepted and handled 16630948 connections while serving 31070465 requests... tros algoritmos de balanceamento de carga mais avançados já está nos planos de uma versão futura do Nginx. Note que, por padrão, todas as requisições passadas aos processos dos httpds parecerão estar vindo do endereço IP da máquina do Nginx. Sugere-se passar o IP da requisição original aos httpds por meio do cabeçalho X–Forwarded–For HTTP e depois interceptar a informação com o módulo mod_rpaf, que altera o endereço IP visível por outros módulos httpd. O módulo mod_rpaf é livre e está disponível para download em [3]. Suporte a SSL Para usar o Nginx como proxy reverso de balanceamento de carga, configurá-lo para manipular requisições SSL trará muitos benefícios. Isso simplifica a configuração do httpd, diminui as exigências à CPU associadas aos processos SSL e facilita o balanceamento de carga, pois elimina a necessidade de sessões SSL sticky (persistentes). É fácil configurar o suporte a SSL: ele utiliza os mesmos arquivos CRT e KEY do Apache. Usando como modelo a configuração do proxy da listagem 1, adicione as da listagem 2. Note que há duas ressalvas na implementação atual do SSL no Nginx. A versão estável não possui suporte a listas de revogação de certificado. Este problema vem sendo trabalhado nas versões instáveis a partir da 0.8.7. Em seguida, se você possuir um arquivo de certificado intermediário (aquele necessário para obter o certificado junto à Autoridade Certificadora), ele não é especificado separadamente, como seria no Apache. Em vez disso, é preciso adicionar a informação deste arquivo ao final do arquivo principal de certificação. Isso é feito digitando catchain.crt >> server.crt na linha de comando. Feito isso, você não usará mais o http://www.linuxmagazine.com.br Nginx | REDES arquivo de certificação intermediário; simplesmente aponte ssl_cer‑ tificate para o arquivo principal de certificação. Conteúdo estático e cache O próximo passo é fazer o Nginx servir imagens estaticamente. Esta etapa permitirá ajustar os processos do httpd para servir conteúdo dinâmico. Também serviremos imagens com cabeçalhos de expiração para 30 dias, o que diminui o número de requisições de imagens comuns que o cliente precisa fazer, pois elas raramente mudam. Para isso, adicione o seguinte ao contexto do seu servidor: location ~* ^.+\.(jpg|jpeg|gif|png) $ { root /path/to/www; expires 30d; } Se for preferível desabilitar os logs de requisição de imagens, adicione a seguinte linha à configuração: access_log off; Em seguida, o Nginx compactará com gzip parte dos dados de saída recebidos do httpd antes de enviálos ao navegador. O servidor Nginx compacta somente certos conteúdos com base no mime type e não compactará nada para navegadores sabidamente defeituosos. Adicione o código da listagem 3 ao contexto do servidor. Se você deseja fazer cache de certos conteúdos dinâmicos, há duas opções: cache baseado em arquivos ou memcached. Se você estiver pensando em usar o Nginx para manter um cache, é preciso atentar à diferença de conteúdo caso o visitante esteja logado ou não. Para ativar o cache baseado em arquivos, adicione Linux Magazine #61 | Dezembro de 2009 Tabela 2: Módulos do Nginx Módulo Descrição HTTP Referer Filtra requisições com base no cabeçalho Referer HTTP Limit Zone Limita conexões simultâneas de um cliente HTTP Limit Requests Limita a frequência de conexões de um cliente User ID Envia cookies de identificação HTTP Addition Anexa textos aleatórios às páginas FLV Faz streaming de vídeos em Flash Perl Executa o Perl diretamente no Nginx e chama o Perl através do SSI WebDAV Suporte pass-through do WebDAV Substitution Substitui textos das páginas Image Filter Transforma imagens com a LibGD Secure Link Protege páginas com uma chave secreta XSLT Realiza pós-processamento das páginas com XSLT o seguinte ao contexto http de seu arquivo de configuração: proxy_cache_path /data/Nginx/cache levels=1:2 keys_zone=one:10m; O parâmetro levels determina o número de subdiretórios do cache, e a chave e o nome do arquivo são um MD5 da URL servida, resultando em nomes como /data/nginx/cache/c/29/ b7f54b2df7773722d382f4809d65029c. Com o caminho do cache especificado no contexto http, é possível configurar o cache no contexto http, do servidor ou de localização. Para fazer cache de todas as respostas 200 e 302 durante 30 minutos e todas as 404 por cinco minutos, adicione o seguinte: proxy_cache one; proxy_cache_valid 200 302 30m; proxy_cache_valid 404 5m; Figura 1Além de exemplos de configuração e links de recursos, a comunidade Nginx oferece lista de emails, fórum e canal IRC. 59 REDES | Nginx Se for preferível usar o memcached, a facilidade é a mesma (veja a listagem 4). Estatísticas do servidor Muitos sistemas de monitoramento suportam o módulo mod_status do Apache para reunir e examinar dados estatísticos. O módulo stub_ status desempenha o mesmo papel no Nginx. Esse módulo não vem compilado e precisa ser habilitado com o parâmetro de configuração --with-http_stub_status_module. Uma vez compilado, adicione o código da listagem 5 a seu arquivo de configuração. Uma requisição HTTP a domínio.com/nginx_status retorna um texto de resposta no formato mostrado na listagem 6. Módulos adicionais O módulo mod_rewrite do Apache é usado em vários sites. O Nginx possui um módulo de reescrita de URLs, mas sua sintaxe é ligeiramente diferente daquela do módulo do Apache. A wiki do Nginx contém todos os detalhes [4]. Um exemplo do recurso da reescrita é a simples reestruturação da URL para torná-la compatível com SEO: rewrite ^/users/(.*)$ /user.php?user=$1? last; Uma reescrita mais complicada usa uma condição if para redirecionar o visitante para um domínio consistente: if ($host ~* www\.(.*)) { set $host_without_www $1; rewrite ^(.*)$ http://$host_ without_www$1 permanent; } O módulo GeoIP cria variáveis com base no endereço IP de um cliente, comparado com os arqui60 vos binários do MaxMind GeoIP. O módulo GeoIP do Nginx tem dois pré-requisitos – LibGeoIP e o(s) banco(s) de dados MaxMind GeoIP. A última LibGeoIP está disponível no site MaxMind [5], mas lembre-se de que muitas distribuições possuem a LibGeoIP em seus repositórios de pacotes. Adicione as seguintes linhas a seu contexto http para ativar o módulo GeoIP: geoip_country GeoIP.dat; geoip_city GeoLiteCity.dat; Agora, você terá à disposição as variáveis listadas em http://wiki.Nginx. org/NginxHttpGeoIPModule. Um caso comum de uso do módulo GeoIP é o emprego da variável $geoip_coun‑ try_code para enviar requisições a diferentes servidores, com base no país. Se você quiser passar informa- ções do GeoIP para o Apache, adicione o seguinte à sua configuração do proxy: proxy_set_header HTTP_GEO $geo; A tabela 2 mostra alguns outros módulos do Nginx, com uma pequena explicação sobre suas funções. Conclusão Usar o Nginx como proxy reverso com cache a seu servidor Apache pode aumentar significativamente o desempenho de sua infraestrutura. Além disso, o uso de alguns recursos avançados do Nginx oferece maior flexibilidade e pode permitir a realização de tarefas que não seriam possíveis com uma instalação anterior. Recomenda-se ler a documentação online (figura 1) e familiarizar-se com o Nginx antes de adotá-lo em ambientes de produção. n Mais informações [1]Nginx: http://www.Nginx.org [2]Página de módulos do Nginx: http://wiki.Nginx.org/NginxModules [3]mod_rpaf: http://stderr.net/apache/rpaf/ [4]Módulo de reescrita de URLs do Nginx: http://wiki.Nginx.org/NginxHttpRewriteModule [5]MaxMind: http://geolite.maxmind.com/download/geoip/database/ Sobre o autor Jeremy Garcia é fundador e administrador do site LinuxQuestions.org, que utiliza o Nginx e é uma das maiores comunidades Linux da Web. Ele usa Linux há mais de dez anos e é um defensor ardente, mas realista, do Código Aberto. Gostou do artigo? Queremos ouvir sua opinião. Fale conosco em [email protected] Este artigo no nosso site: http://lnm.com.br/article/3161 http://www.linuxmagazine.com.br Quer falar com os 30.000 profissionais de TI com maior nível de conhecimento técnico do mercado nacional? Então anuncie na Linux Magazine! Segundo dados do Instituto Verificador de Circulação*, a Linux Magazine é atualmente a segunda revista mais vendida para profissionais de TI do mercado editorial brasileiro. Além disso, é a revista que tem o público mais qualificado no quesito técnico. Nossa combinação exclusiva de conteúdo avançado com uma abordagem prática faz da Linux Magazine a publicação preferida de quem toma decisões e faz recomendações para compra de produtos e contratação de serviços. Anuncie conosco e fale com esse público. Para anunciar, entre em contato: [email protected] 11 4082.1300 *Comparação de circulação para os últimos três meses de publicações nacionais voltadas ao segmento de TI.