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.
Download

Nginx - Linux New Media