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.038 ]

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

Autenticando usuários do Squid em um banco de dados MySQL

Controlando acesso às páginas do Apache na rede interna

Squid - Entendendo um pouco as configurações

Proxy com autenticação em servidores Samba ou Windows NT

Squid + proxy transparente + autentificação + SSL

  
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