- Round-robin de requisições;
- Failover (Remover automaticamente o servidor down do cluster);
- Controle de acessos através de ACL`s;
- Cache de objetos;
- Definição de "peso" para cada servidor.
É um proxy que geralmente fica na frente de servidores web recebendo as requisições vindas da internet, tratando-as e entregando a um ou mais servidores internos.
OBS1: Todas as requisições que chegarem nos servidores web internos vão chegar com o ip do servidor proxy, contudo, existe um patch para o kernel e para o próprio squid chamado tproxy que possibilita a total transparência das requisições. Segue um link que trata de forma mais profunda o assunto:
http://www.balabit.com/support/community/products/tproxy/
OBS2: É importante ter um servidor de DNS interno para que o squid possa consultar e fazer o round-robin, principalmente se você hospedar vários sites. Basta criar vários Hosts do tipo A iguais, mas com os ips diferentes ex:
www IN A 192.168.0.1
www IN A 192.168.0.2
www IN A 192.168.0.3
A implantação é muito simples e funcionará assim:
Teremos um servidor SQUID na frente e dois ou mais servidores web que receberão as conexões a partir do próprio squid. Basta apontar todas as requisições do(s) site(s) da sua empresa para o proxy reverso que ela vai se encarregar de verificar se tem o objeto em cache, caso não tenha, repassa para um dos servidores internos, pega a resposta e entrega ao cliente.
Instalação do Squid
Eu particularmente gosto de usar o squid 2.7, é realmente muito estável e performático:
wget http://www.squid-cache.org/Versions/v2/2.7/squid-2.7.STABLE9.tar.gz
Depois:
./configure --enable-delay-pools --enable-arp-acl --enable-htcp --enable-cache-digests --enable-cachemgr-hostname=localhost --enable-digest-auth-helpers=password --enable-epoll --enable-external-acl-helpers=ip_user,ldap_group,unix_group,wbinfo_group --enable-ident-lookups --with-large-files --enable-linux-netfilter --enable-auth=ntlm,basic --enable-basic-auth-helpers=multi-domain-NTLM,SMB --enable-ntlm-fail-open --enable-ntlm-auth-helpers=SMB,fakeauth --enable-referer-log --enable-removal-policies=heap,lru --enable-snmp --enable-storeio=aufs,diskd,null,ufs --enable-useragent-log --enable-wccpv2 --with-aio --with-dl --with-pthreads --enable-follow-x-forwarded-for --prefix=/usr/local/squid2_7
Depois:
make && make install
Configuração do Squid
Segue abaixo um arquivo de configuração completo e comentado nos pontos mais importantes, não vou comentar todos os parâmetros pois existe uma vasta documentação sobre eles no próprio site oficial:
http://www.squid-cache.org/Doc/config/
# Coloque o site principal, vai ser a direção default do squid
http_port 80 vhost defaultsite=www.exemplo.com.br
icp_port 0
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY
cache_mem 1 GB
cache_swap_low 90
cache_swap_high 95
# Aqui você define a partição de cache e a forma de armazenamento,
# particularmente uso o diskd pois é mais performático que o ufs
# e suporta mais requisições por segundo.
# http://oreilly.com/catalog/squid/chapter/ch08.pdf
# Além disso aconselho a partição de cache
# com o filesystem ReiserFS.
cache_dir diskd /cache 1024 64 256 Q1=64 Q2=72
cache_access_log /var/log/squid/access.log
cache_log none
cache_store_log none
#Usuário que o squid vai rodar, não esqueça de adicioná-lo no sistema adduser
cache_effective_user squid
cache_effective_group squid
memory_pools on
memory_pools_limit 32 MB
maximum_object_size 4 MB
minimum_object_size 0 KB
maximum_object_size_in_memory 64 KB
fqdncache_size 1024
mime_table /usr/local/squid2_7/etc/mime.conf
log_mime_hdrs off
log_fqdn off
check_hostnames off
allow_underscore on
# Servidor de DNS que o squid vai usar para resolver as requisições, muito importante!
dns_nameservers 127.0.0.1
request_header_max_size 1 MB
quick_abort_min 50 KB
quick_abort_max 50 KB
quick_abort_pct 85
connect_timeout 60 seconds
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
shutdown_lifetime 30 seconds
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
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern . 0 20% 4320
acl all src 0.0.0.0/0.0.0.0
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443 563
acl Safe_ports port 9876
acl Safe_ports port 80 # http
acl Safe_ports port 81
acl Safe_ports port 8081
acl Safe_ports port 8082
acl Safe_ports port 8083
acl Safe_ports port 82 #
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 563 # https, snews
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl Safe_ports port 23000
acl tam port 444
acl CONNECT method CONNECT
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_reply_access allow all
reply_header_max_size 10 KB
httpd_suppress_version_string on
tcp_recv_bufsize 0 bytes
forwarded_for on
follow_x_forwarded_for allow all
http_access allow all
icp_access allow all
detect_broken_pconn on
pipeline_prefetch on
ie_refresh on
relaxed_header_parser on
client_persistent_connections on
server_persistent_connections on
persistent_connection_after_error off
reload_into_ims on
# Aqui é a parte mais importante do balanceamento de carga, onde dizemos quais são os servidores
# que fazem parte do cluster e caso necessário o weight (peso) para cada servidor.
# Isto é importante caso você tenha servidores com hardware diferentes e queira destinar mais # conexões para as máquinas mais robustas. No nosso caso vou colocar três vezes mais conexões # para o primeiro servidor
cache_peer 192.168.0.1 parent 80 0 no-query originserver round-robin no-digest weight=3
cache_peer 192.168.0.2 parent 80 0 no-query originserver round-robin no-digest weight=1
cache_peer 192.168.0.3 parent 80 0 no-query originserver round-robin no-digest weight=1
visible_hostname www.exemplo.com.br
cache_mgr contato@exemplo.com.br
Pronto!
Você já tem um balanceamento de carga web ;)
0sem comentários ainda