Squid atuando como proxy reverso

Neste artigo mostro como usar o Squid a favor dos servidores web, atuando como servidor proxy reverso, onde conseguimos poupar o Apache e o MySQL de acessos repetitivos, economizando processamento e deixando o acesso aos sites hospedados muito mais rápido. Grandes empresas já usam esta solução, um exemplo é o UOL, outro o Jogossimples.com.br.

[ Hits: 64.076 ]

Por: Alexandre Correa em 27/11/2007


Configurando o Squid



O Squid vai fazer o papel de "servidor web", recebendo as requisições da internet na porta 80 e repassando-as para os servidores web REAIS. Caso o Squid tenha a página solicitada em CACHE, os servidores WEB REAIS não recebem a requisição, simplesmente o SQUID que responde. :)

O /etc/squid/squid.conf fica assim:

#Lista na porta 80 e o site padrão sera www.meusite.com.br caso a requisição não tenha um header Host especificado.
http_port 200.200.200.1:80 vhost defaultsite=www.meusite.com.br
#Lista porta 3401 para requisições SNMP, caso não queira obter informações do squid via SNMP, coloque 0 no lugar da porta, você pode usar cacti, mrtg, rrdtool para gerar estatísticas do Squid, são gerados gráficos bem interessantes.
snmp_port 3401
#Não usaremos este protocolo de comunicação entre proxies, pois temos apenas 1 proxy.
icp_port 0
#Configurando a pasta de cache, 20GB, primeiro nível com 32 pastas e cada pasta terá 256 sub-pastas.
cache_dir aufs /var/spool/squid 20000 32 256
#Mantendo objetos recentes e pequenos na memoria
memory_replacement_policy heap GDSF
#Mantendo objetos recentes no disco (independente do tamanho)
cache_replacement_policy heap LFUDA
#Ativando pools de memoria, evitando o Squid ficar realocando memoria toda hora que precisar, manterá pools de 32MB
memory_pools on
memory_pools_limit 32 MB

#Não fazer cache de paginas dinâmicas
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
cache deny QUERY
#Fazer cache dos headers 'vary'
cache_vary on
acl apache rep_header Server ^Apache
broken_vary_encoding allow apache
#memoria alocada para objetos em TRANSITO
cache_mem 128 MB
#Manutenção do cache
cache_swap_low 90
cache_swap_high 95
#Tamanho máximo de objetos que serão gravados em disco/memoria, este valor varia de acordo com cada tipo de conteúdo servido pelos servidores WWW, se você servir arquivos muito grandes, aumente de acordo com a necessidade.
maximum_object_size 4 MB
#Tamanho minimo de objetos gravados, aqui ele vai gravar TUDO
minimum_object_size 0 KB
#Tamanho máximo de objetos mantidos na memoria
maximum_object_size_in_memory 64 KB
#Manter 1024 registros de DNS na memoria
fqdncache_size 1024

#Arquivos de logs
access_log /var/log/squid/access.log
cache_log /var/log/squid/cache.log
cache_store_log none
emulate_httpd_log on
log_ip_on_direct on

#Configurações extras
mime_table /etc/squid/mime.conf
log_mime_hdrs off
log_fqdn off
ftp_user anonymous@aonze.com.br
ftp_passive on
ftp_sanitycheck on
ftp_telnet_protocol on
check_hostnames on
allow_underscore on
dns_timeout 1 minutes
request_header_max_size 16 KB

#Estas 'refresh_pattern' fazem com que o squid mantenha o máximo possível um objeto em cache, aumentando o cache HIT e byte HIT
refresh_pattern -i \.jpg$ 0 50% 21600 reload-into-ims
refresh_pattern -i \.gif$ 0 50% 21600 reload-into-ims
refresh_pattern -i \.png$ 0 50% 21600 reload-into-ims
refresh_pattern -i \.jpeg$ 0 50% 21600 reload-into-ims
refresh_pattern -i \.bmp$ 0 50% 21600 reload-into-ims
refresh_pattern -i \.tif$ 0 50% 21600 reload-into-ims
refresh_pattern -i \.tiff$ 0 50% 21600 reload-into-ims
refresh_pattern -i \.swf$ 0 50% 21600 reload-into-ims

refresh_pattern -i \.html$ 0 20% 1440
refresh_pattern -i \.htm$ 0 20% 1440
refresh_pattern -i \.shtml$ 0 20% 1440
refresh_pattern -i \.shtm$ 0 20% 1440

refresh_pattern -i \.mov$ 2880 80% 21600 reload-into-ims
refresh_pattern -i \.avi$ 2880 80% 21600 reload-into-ims
refresh_pattern -i \.mpg$ 2880 80% 21600 reload-into-ims
refresh_pattern -i \.mpeg$ 2880 80% 21600 reload-into-ims
refresh_pattern -i \.qtm$ 2880 80% 21600 reload-into-ims
refresh_pattern -i \.flv$ 2880 80% 21600 reload-into-ims

refresh_pattern -i \.wav$ 1440 100% 4320 reload-into-ims
refresh_pattern -i \.au$ 1440 100% 4320 reload-into-ims
refresh_pattern -i \.mid$ 1440 100% 4320 reload-into-ims
refresh_pattern -i \.mp3$ 2880 100% 21600 reload-into-ims

refresh_pattern -i \.zip$ 7200 50% 21600 reload-into-ims
refresh_pattern -i \.gz$ 0 50% 10080 reload-into-ims
refresh_pattern -i \.arj$ 0 50% 4320 reload-into-ims
refresh_pattern -i \.lha$ 0 50% 4320 reload-into-ims
refresh_pattern -i \.lzh$ 0 50% 4320 reload-into-ims
refresh_pattern -i \.rar$ 7200 50% 21600 reload-into-ims
refresh_pattern -i \.tgz$ 0 50% 21600 reload-into-ims
refresh_pattern -i \.tar$ 0 50% 21600 reload-into-ims
refresh_pattern -i \.Z$ 0 50% 4320 reload-into-ims
refresh_pattern -i \.sit$ 0 50% 4320 reload-into-ims

refresh_pattern -i \.pdf$ 7200 50% 10080 reload-into-ims

#O que não bater nas regras acima, recebem valores padrões, NÃO aconselho alterar estas 3 abaixo, e estas devem ser as ULTIMAS regras..
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern . 0 20% 4320

#Objetos em transito que forem interrompidos, terminar o download se a porcentagem do download for maior que 85%
quick_abort_min 50 KB
quick_abort_max 50 KB
quick_abort_pct 85

#caches de respostas
negative_ttl 3 minutes
positive_dns_ttl 5 hours
negative_dns_ttl 2 minute

#Servidor de DNS, recomendo rodar um servidor dns cache-only na MESMA maquina do Squid, e também colocar forwarders para outros servidores de dns próximos fazendo com que o tempo de resposta dns fique bem baixo..
dns_nameservers 127.0.0.1

#timeouts
refresh_stale_hit 30 seconds
connect_timeout 1 minute
peer_connect_timeout 30 seconds
read_timeout 15 minutes
request_timeout 1 minutes
persistent_request_timeout 1 minute
client_lifetime 1 day
pconn_timeout 30 seconds
ident_timeout 10 seconds
half_closed_clients off
forward_timeout 3 minutes


#tempo de espera antes de matar o processo
shutdown_lifetime 30 seconds

#Regras para acesso, vamos proteger nosso Squid de acessos indevidos, fazendo com que não temos um PROXY OPEN RELAY.

#ip localhost
acl localhost src 127.0.0.1
#ips dos servidores
acl hosted dst 200.200.200.1 192.168.0.1 192.168.0.2 192.168.0.3
#protocolo cache_object, utilizado pelo cache manager
acl manager proto cache_object
acl all src 0.0.0.0/0.0.0.0

#Permitir protocolo para localhost
http_access allow manager localhost
#ninguém mais alem do próprio servidor acessa o cache_object
http_access deny manager
#permite o localhost acesso ao proxy
http_access allow localhost
#permite acesso aos ips dos servidores
http_access allow hosted
#ninguém mais acessa nada que não bater nas regras acima.. deve ser SEMPRE a ultima regra

#CASO for gerar estatísticas snmp, adicionar estas regras

acl snmppublic snmp_community public
snmp_access allow snmppublic localhost

snmp_access deny all
snmp_incoming_address 0.0.0.0
snmp_outgoing_address 255.255.255.255
#### fim do snmp

#respostas http, permitidas todas para todos
http_reply_access allow all
#tamanho máximo do cabeçalho de resposta
reply_header_max_size 10 KB

#informações
cache_mgr hostmaster@meusite.com.br
cache_effective_user squid
cache_effective_user squid

#esconde versão do squid
httpd_suppress_version_string on
#seta o host para www.meusite.com.br caso contrario o squid anexa o hostname da maquina, podendo causar problemas na respostas.
visible_hostname www.meusite.com.br

#manter 10 arquivos de logs
logfile_rotate 10

#usar buffer do sistema, o squid não controla o buffer tcp neste caso..
tcp_recv_bufsize 0 bytes

#mantem ip de origem no header
forwarded_for on
#mantem uma lista de clientes acessando o cache
client_db on
buffered_logs off
#Aplica o header If-modified-since em todos os objetos
reload_into_ims on

#permite conexões persistentes
client_persistent_connections on
server_persistent_connections on
#não permite manter a conexão ativa quando esta for um erro, (404, 500, etc etc).
persistent_connection_after_error off

#detectar conexões permanentes com erro
detect_broken_pconn on
pipeline_prefetch on
ie_refresh on
relaxed_header_parser on


#fazer a entrega aos servidores WEB, aqui que acontece a 'magica'

cache_peer 192.168.0.2 parent 80 0 no-query originserver round-robin
cache_peer 192.168.0.3 parent 80 0 no-query originserver round-robin

#EOF

Salve o squid.conf.

Execute o comando:

# squid -k parse

para validar o squid.conf.

Agora é necessário que o Squid crie a estrutura do cache, execute o comando:

# squid -z

O Squid vai criar a estrutura das pastas no /var/spool/squid.

Adicione o Squid na inicialização do sistema:

# chkconfig --add squid
# chkconfig squid on


Agora inicie o Squid:

# service squid start

Pronto! O Squid vai receber as requisições e repassar (aleatoriamente) para os servidores web.

Uma dica interessante, caso o servidor web 1 seja melhor do que o servidor web 2, você pode definir um PESO na opção cache_dir para que o melhor servidor atenda mais requisições e o servidor 2 atenda um número MENOR. Vamos supor que o www1 suporte 4 vezes mais do que o www2, então ficaria assim:

cache_peer 192.168.0.2 parent 80 0 no-query originserver round-robin weight=4
cache_peer 192.168.0.3 parent 80 0 no-query originserver round-robin weight=1

A cada 4 requisições para o www1, ele manda a 1 para o www2. :)

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Configurando o Apache
   3. Configurando o Squid
   4. Final
Outros artigos deste autor

Wireless USB no Linux

Leitura recomendada

Squid avançado + OpenLDAP

Squid autenticando no Windows utilizando grupos do AD

Squid - Configuração básica, funcional e limpa

SquidGuard: Bloqueando o acesso a Web

Filtragem de páginas SSL (443) no Squid transparente

  
Comentários
[1] Comentário enviado por dailson em 27/11/2007 - 11:35h

Quero parabenizar pelo altíssmo nível do seu tutorial. E pelas dicas do squid.conf
Parabéns Alexandre.

[2] Comentário enviado por capitainkurn em 27/11/2007 - 14:36h

Excelente artigo! Já está em meus favoritos.

[3] Comentário enviado por pixelman em 28/11/2007 - 08:59h

Show de bola alê
ficou mto bom sumido :)~

[4] Comentário enviado por ads119@gmail.com em 17/12/2007 - 20:21h

Muito bom mesmo cara, só que para mim esta dando esta mensagem.
[root@xxxx squid]# squid -k parse
FATAL: Bungled squid.conf line 2: http_port 200.200.200.1:80 vhost defaultsite=www.meusite.com.br
Squid Cache (Version 2.5.STABLE14): Terminated abnormally.

Alguém sabe porque isto acontece?

[5] Comentário enviado por alexandrecorrea em 17/12/2007 - 21:21h

precisa ser squid versao 2.6 !!!

[6] Comentário enviado por ads119@gmail.com em 17/12/2007 - 21:31h

Valew!!! Mas no 2.5 não tem como rolar?

[7] Comentário enviado por alexandrecorrea em 17/12/2007 - 21:44h

tem sim, mas essa parte de proxy reverso no 2.5 é muito fraca.. no 2.6 esta muito melhor, a versao 2.6 teve um rebuild legal.. esta mais estavel e mais rapida...

recomendaria voce a atualizar seu squid para 2.6 !!

digite squid -v q ele te mostra a linha de comando utilizada para configurar.. ai voce tira o que nao for usar.. e compila o 2.6 do mesmo modo :)

[8] Comentário enviado por ads119@gmail.com em 17/12/2007 - 23:13h

Show, tks!!!

[9] Comentário enviado por rfranzen em 27/12/2007 - 14:13h

Aí cara, parabéns. Fazia tempo que não pintava por aqui um artigo com assunto novo e nível técnico elevado.

Show de bola.

[10] Comentário enviado por vlcunes em 16/01/2017 - 17:02h

Parabéns pelo conteúdo, amigo!

Tenho uma dúvida: Quando o cliente faz requisição para o endereço "www.meusite.com.br" como é que o servidor diferencia para qual servidor WEB deve ser redirecionado?

Em um único servidor,eu tenho o apache e o IIS.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts