Calculando link de Internet

Uma pergunta: Qual o tamanho indicado para o link de internet?

Irei expor abaixo alguns fatores fundamentais que devem ser usados para analisar a demanda e a dimensão do link.

Nota importante: todos os valores de links são dados em kbit/s, que é a notação correta. Transferencia de arquivos e medições via software/aplicativo são dadas em kbytes. 1 byte equivale a 8 bits, para se obter o valor em kbytes, deve-se dividir o valor em bits por 8.
Um link de 1024kbit/s provê o equivalente a 128KBytes em uma tranferência de arquivos, no máximo, em aplicações reais não se deve ignorar o overhead.

O principio de tudo e os calculos básicos

Quando a internet começou a ser distribuida para usuários residenciais por meio de conexões discadas, o tipo de conteúdo acessado na internet era moldado para esse tipo de conexão, algumas características marcantes dessa época:

  • as páginas de internet usavam poucas imagens e raramente ultrapassavam 30Kbytes de texto html.
  • não existia plug-in de flash, tampouco videos sob demanda.
  • não existia spam
  • não existia P2P
  • não existia orkut, Youtube, entre outras bobagens, MSN era fora de moda e o ICQ só transferia texto.
  • os arquivos enviados em anexo eram pequenos.
  • os usuários eram pacientes e sabiam alguma coisa sobre computador.
  • e o mais importante: internet era opção e luxo.

Uma conexão discada atingia no máximo 52Kbits por segundo (ou 6,5 Kbytes por segundo de download). A média era 48Kbits por usuário.
Quem tinha dinheiro conseguia pagar ISDN, e conseguia 128kbit/s usando 2 linhas.
Ao navegar na internet, um usuário esperava de 2 a 10 segundos para uma página ser carregada, e demorava em média 30 segundos para lê-la.

No tempo que ele estava “processando” o conteúdo adquirido, o elo entre ele e a internet ficava ocioso. O pulso cobrado pela ligação poderia sair caro na conta telefonica.
Sendo assim, se o provedor de internet, por sua vez, tambem estivesse conectado a internet ou backbone com um link de 48kbit/s e atendesse apenas esse cliente, o link externo ficaria ocioso por 80% do tempo, ou 100% ocioso na maior parte do dia. Considerando que todos os usuários de internet possuiam o mesmo perfil de navegação, o provedor poderia com um link de 48kbits, atender outros 10 clientes de 48kbits, aproveitando assim a ociosidade do link. Caso mais de um usuário iniciasse um download, haveria uma divisão natural da velocidade, ficando cada um com uma parcela justa do link principal do provedor.

Então, o provedor com um link de 48kbit/s poderia atender 10 usuários conectados a 48kbit/s cada um, e nem por isso a internet ficaria ruim. Esse calculo de usuários on-line recebe uma notação: 10: (dez para um).

Considerando que na época apenas 10% dos clientes cadastrados ficavam on-line simultaneamente no horário comercial, o provedor poderia ter 100 clientes e continuar oferecendo internet de qualidade.

Se os 20 usuários se conectassem e iniciassem um download, cada um seria limitado 5% da velocidade contratada. Esses “5%” seriam a garantia de link.
Se os 10 usuários se conectassem e iniciassem um download, cada um seria limitado 10% da velocidade contratada. Esses “10%” seriam a garantia de link.
Se os 5 usuários se conectassem e iniciassem um download, cada um seria limitado 20% da velocidade contratada. Esses “20%” seriam a garantia de link.
Assim, a garantia de link que um provedor pode oferecer é obtido atravéz da função:

garantia = 100 x (velocidade_do_link / (usuarios_on_line x velocidade_unitária))

A velocidade unitária é a menor velocidade vendida, mas considere o seguinte exemplo:

  • um provedor vende acessos de 64kbit/s e 128kbit/s, atravéz de ISDN.
  • no horário de pico há on-line: 40 usuários de 64k e 80 usuários de 128k.
  • em vez de considerar que há 120 usuários on-line, devemos utilizar, para o cálculo, com base na menor velocidade, que há 200 usuários on-line, uma vez que cada usuário de 128k consome o dobro de um usuário de 64k.
    Se o provedor em questão tivesse um link de 1 Megabit/s, a função de garantia ficaria assim:

Função: garantia = 100 x (velocidade_do_link / (usuarios_on_line x velocidade_unitária))

Variáveis:
velocidade_do_link = 1024 kbit/s
usuário_on_line = 200
velocidade_unitária = 64 kbit/s

Resolvendo:
garantia = 100 x (1024 / (200 x 64))
garantia = 100 x (1024 / 12800)
garantia = 100 x 0,08
garantia = 8

Resultado: o provedor só pode garantir ao usuário final 8% da velocidade vendica com base no horário comercial.
Se o dono do provedor, baseando-se na estátistica dos últimos meses, constatasse que apenas 25% dos usuários ficam on-line simultaneamente, ele poderia adquirir até 800 clientes cadastrados com um link de 1 Mega (1024 kbit/s). Porém a notação em questão é de 16:1, considerada alta para um link de 1 Mbit/s.

Garantias inferiores a 5% tentem a colocar um provedor de internet em estado crítico.
Garantias acima de 50% indicam ociosidade no link, e boa qualidade no fornecimento de internet.

Para dimensionar o tamanho necessário de link baseando-se na quantida de clientes que deseja atender, as únicas variáveis necessárias são: quantidade média de usuários on-line no horário de pico e a garantia de link que deseja oferecer. Use a função abaixo:

Função: velocidade_link = (garantia_de_link / 100) x (media_de_usuários_on_line x velocidade_unitária)

Variáveis:
media_de_usuários_on_line = 500
garantia_de_link = 15 (%)
velocidade_unitária = 128 kbit/s

Resolvendo:
velocidade_link = (15 / 100) x (500 x 128)
velocidade_link = 0.15 x 64000
velocidade_link = 9600

Assim, para atender a 500 usuários com velocidades de 128kbit/s garantindo 15% de banda, o provedor necessitará de um link de 9.6 Megabit/s.
Se a garantia fosse reduzida para 5%, o link necessário seria de 3.2 Megabit/s.

Para se obter a notação usada numa rede, use a função abaixo:

Função:
unidades_reais = (velocidade_link / velocidade_unitária)
notação = (media_de_usuários_on_line / unidades_reais)

Variáveis:
media_de_usuários_on_line = 500
velocidade_link = 3200 kbit/s
velocidade_unitária = 128 kbit/s

Resolvendo:
unidades_reais = (3200 / 128)
unidades_reais = 25

notação = 500 / 25
notação = 20

Resultado: Um link de 3.2 Mbit/s fornece 25 unidades reais de 128kbit/s, em cada unidade real de 128kbit/s há 20 clientes, logo a notação do nosso provedor exemplo é de 20:1 (vinte para um) – um pouco superfaturado!

Em uma boa notação, iniciando em 8:1, coloque 2 notações a cada 1 Mbit de link. Exemplo:
Link de 1 Mbit/s: 8:1
Link de 2 Mbit/s: 10:1
Link de 4 Mbit/s: 14:1

A cálculo de garantia é redundante em relação ao cálculo de notação, use o que gostar mais.

Questões importantes da atualidade

As notações e funções utilizadas foram inventadas na época da internet discada, hoje um usuário de internet tem tendencias bem diferentes, e os tipos de serviços oferecidos na internet aumentam consideravelmente sua permanencia on-line, e o consumo de banda aumenta significativamente.

Um exemplo prático: Assistir um video no youtube com exibição em tempo real requer banda de 600kbit/s. Um usuário de 300Kbit/s quer assistir um vídeo de 90 segundos, isso significa que, para assistir o video todo, ele consumirá 100% dos 300kbit/s por um intervalo de 180 segundos (3 minutos).
Provedores tem, em média, links de 4 megabit/s, assim, basta que 14 usuários de 300kbit/s assistam videos simultaneamente para que 100% do link principal seja comprometido.
Se nesse momento outros usuários estiverem utilizando a internet para outros fins e gerando fluxo de dados, os usuários televisivos terão que aguardar muito mais ara assistir seus videos, porem manterão o máximo de consumo disponível na rede até que o video seja exibido.

Outro grande vilão é o P2P. Protocolos de compartilhamento de arquivos como E-mule, Bittorrent são usados para fazer downloads de videos, músicas entre outros, em sua maioria ilegal. Ao iniciar o uso desses aplicativos, os usuários tendem a desenvolver um tipo de comportamento obsessivo-compulsivo por downloads, os efeitos colaterais para o provedor de internet são:
– Aumento significativo de permanencia on-line, influenciando drasticamente o calculo de garantia de banda.
– Consumo de 100% da banda vendida ao cliente por todo o tempo que ele estiver on-line.

Soluções para contornar fatores de risco no consumo de link

  • Proxy-cache HTTP
    Vantagem: Software capaz de armazenar sites e seus componentes (imagens e scripts) no servidor (disco ou ram). Garante que no segundo acesso a um mesmo conteúdo por qualquer cliente da rede, o conteúdo armazenado em cache seja enviado, em vez de buscá-lo na internet, economizando o consumo de link.
    Desvantagem: aplica-se apenas ao protocolo HTTP. Raramente consegue ganhos superiores a 40% no protocolo HTTP.

  • Proxy-cache HTTP especial
    Vantagem: Permite que o proxy-cache HTTP faça cache de conteúdo dinâmico, como videos, atualizações de softwares (Windows, Anti-virus, etc..). Softwares mais comuns: Super-Cache (comercial, presente no MyAuth3), cachevideos.com (GNU/GPL), ThunderCache (GNU/GPL).

  • Controle de conexões TCP simultaneas
    Vantagem: Usuários normais abrem 10 janelas no windows, no máximo 20. Isso significa entre 20 e 60 conexões TCP (alguns sites tem banners, javascript, flash para outros sites). Softwares de P2P abrem no mínimo 50 conexões por arquivo, o que significa que o usuário de P2P precisa de muitas conexões TCP para baixar os arquivos. Limitar cada cliente a 70 conexões TCP fará com que o software de P2P não consiga estabelecer todas as conexões necessárias, e os downloads serão realizados em baixa velocidade.
    Desvantagem: Quando o limite de conexões for atingido, as novas conexões são recusadas, um cliente com virus ou spyware consumirá essas conexões, e o cliente não conseguirá usar a internet.

  • Controle de volume
    O controle de volume é com certeza é o futuro de todo provedor de internet. Todas as operadores que oferecem acesso a internet com 3G já a utilizam.
    Vantagem: Nessa técnica cada usuário tem o volume de tráfego controlado pelo servidor do provedor, e após ultrapassar esse volume, o acesso é negado ou o cliente é reduzido a uma velocidade bem inferior a contratada. A técnica tende afetar apenas os usuários que consomem muita banda, pois atingirão o limite rapidamente, enquanto que os usuários normais raramente chegarão perto de consumir o volume proposto. Normalmente o limite fica entre 2 Gigabytes por mês.
    Desvantagem: Limita a venda de internet a pessoa física, uma vez que pessoa juridica consegue chegar ao limite mesmo utilizando internet para fins profissionais.

Quando aumentar o link

Uma arma indispensável para um provedor de internet é o controle estatístico. Ter em sua frente uma tela com indicadores de consumo, estatísticas de uso do link principal e do perfil de navegação dos usuários e entendê-los garantirá ações eficientes para oferecer uma boa conexão ao usuário final.

Acompanhe o gráfico de consumo do link constantemente, um indicador que seu link já atingiu o limite é se ele ficar quadrado no horário comercial, haverá a formação uma planície no alto da montanha, quanto mais larga for essa planície, mais crítica estará a situação.

No gráfico a seguir, o link é de 14 megabit/s e não há formação de planície, o que indica que o link ainda suporta mais clientes.

link_subindo

link_normal

Agora, acompanhando o mesmo link num gráfico que aborda o último ano:

Podemos ver que o consumo há 7 meses era em torno de 6 mbit/s, e cresceu 4 megabit/s até o mês atual.
Nessa projeção o provedor atingirá 100% de consumo de link (14 megabit/s) nos próximos 6 meses.

Por: Patrick Brandão

Tuning FreeBSD thousands of connections

mbuf clusters

FreeBSD stores the network data in the mbuf clusters 2Kb each, but only 1500B are used in each cluster (the size of the Ethernet packet)

mbufs

For each mbuf cluster there is “mbuf” structure needed, which have 256B in size and used to organize mbuf clusters in chains. There’s possibility to store some additional useful 100B data into the mbuf, but it is not always used.

If server have the RAM of 1Gb or more 25 thousands of mbuf clusters will be created by default but it is not enough in some cases.

When there’s no any free mbuf clusters available FreeBSD enters the zonelimit state and stops to answer to any network requests. You can see it as the `zoneli` state in the output of the `top` command.

To fix this problem the only solution is to log in through the local console and reboot the system. It is impossible to kill the process in `zoneli` state. This problem is also actual for Linux 2.6.x but even local console will not work in this state for Linux.

There is the patch that fixes the problem, it returns ENOBUFS error, which indicates entering the `zoneli` state and the program may close some connections when receives the error. Unfortunately this patch have not been merged into FreeBSD yet.

The state of used mbuf clusters can be checked by the following command:

> netstat -m

1/1421/1425 mbufs in use (current/cache/total)

0/614/614/25600 mbufs clusters in use (current/cache/total/max)

You can increase quantity of the mbufs clusters through the kern.ipc.nmbclusters parameter:

> sysctl kern.ipc.nmbclusters=65536

For earlier versions of FreeBSD mbuf clusters can be configured only in boot time:

/boot/loader.conf:

kern.ipc.mbclusters=65536

25000 mbuf clusters takes bout a 50Mb in the memory, 32000 – 74Mb, 65000 – 144 Mb (raises by the power of 2). 65000 is the boundary value and I can’t recommend to exceed it without increasing address space of the kernel first.

Increasing the amount of memory available for kernel

The default space for the kernel in memory is 1Gb for i386 architecture. To set it to 2Gb specify the following line in the kernel configuration file:

options KVA_PAGES=512

On the amd64 the the KVA is always 2Gb and there’s no possibility to increase it yet.

In addition to increasing the address space there’s the possibility to increase the limit of the physical memory available for kernel (320Mb by default). Let’s increase it to 1Gb:

/boot/loader.conf:

vm.kmem_size=1G

And reserve 275Mb for mbuf cluster from that space:

sysctl kern.ipc.nmbclusters=262144

Establishing the connection. syncache and syncookies

There’s approximately 100 bytes needed to serve one single connection.

Approximatelly 100 bytes space is used for single unfinished connection in syncache.

There’s possibility to store information about 15000 connections in memory. Approximately.

Snyncache parameters can bee seen by “sysctl net.inet.tcp.syncache” command (read-only).

Syncache parameters can be changed only during boot time:

/boot/loader.conf:

net.inet.tcp.syncache.hashsize=1024

net.inet.tcp.syncache.bucketlimit=100

when the new connection does not fit into overfull syncache FreeBSD enters the `syncookies` state (TCP SYN cookies). This possibility is enabled with:

sysctl net.inet.tcp.syncookies=1

The syncache population and the syncookies stats can be seen with `ntestat -s -p tcp` command.

When the connection is accepted it comes to the “listen socket queue”

Their’s stats can be seen with the `netstat -Lan` command.

Inreasing of the queue is possible with the `sysctl kern.ipc.somaxconn=4096` command

Whan the connection is accepted FreeBSD creates the sockets structures.

To increase the limit of the open sockets:

sysctl kern.ipc.maxsockets=204800

In earlier versions:

/boot/loader.conf:

kern.ipc.maxsockets=204800

The current state can be seen with the following command:

> vmstat -z

tcb hash

If the server processes several tens of thousands connections the tcb hash allows to detect the target connection for each incoming tcp packet quickly.

The tcb hash is 512 bytes by default.

The current size can be seen with:

sysctl net.inet.tcp.tcbhashsize

It is changeable in the boot time:

/boot/loader.conf:|

sysctl net.inet.tcp.tcbhashsize=4096

Files

Applicatios are working not with the sockets but with files. And there’s file descriptor needed for each socket because of that. To increase:

sysctl kern.maxfiles=204800

sysctl kern.maxfilesperproc=200000

These options can be changed on the live system but they will not affect already running processes. nginx have the ability to change the open files limit on the fly:

nginx.conf:

worker_limit_nofile 200000;

events {

worker_connections 200000;

}

receive buffers

Buffers for incoming data. 64Kb by default, if there’s no large uploads can be decreased to 8Kb (decreases the probability of overflow during a DDoS attack):

sysctl net.inet.tcp.recvspace=8192

For nginx:

nginx.conf:

listen 80 default rcvbuf=8k;

send buffers

Buffers for outgoing data. 32K by default. If data have a small size usually or there’s a lack of mbuf clusters it may be decreased:

sysctl net.inet.tcp.sendspace=16384

For nginx:

nginx.conf:

listen 80 default sendbuf=16k;

In the case when server has written some data to the socket but the client do not want to receive it the data will live in the kernel for several minutes even after the connection will be closed by timeout. Nginx have the option to erase all data after the timeout:

nginx.conf:

reset_timedout_connections on;

sendfile

Another way to save some mbuf clusters is the sendfile. It uses the kernel file buffers memory to send the data to the network interface without any intermediate buffers usage.

To enable in nginx:

nginx.conf:

sendfile on;

(you should explicitly switch it off if you’re sending files from the partition mounted via smbfs or cifs – ReRePi)

On the i386 platform with 1Gb and more memory 6656 sendfile buffers will be allocated which is usually enough. On the amd64 platform more optimal implementation is used and there’s no need in sendbufs at all.

On the sendbuf overflow the process stucks in the `sfbufa` state, but things turns ok after the buffer size is increased:

/boot/loader.conf:

kern.ipc.nsfbufs=10240

TIME_WAIT

After the connection was closed the socket enters the TIME_WAIT state. In this state it can live for 60 seconds by default. This time can be changed with sysctl (in milliseconds divided by 2. 2×30000 MSL = 60 seconds):

sysctl net.inet.tcp.msl=30000

TCP/IP ports

Outgoing connection are bind to the ports from the 49152 – 65535 range (16 thousands). It is better to be increased (1024 – 65535):

sysctl net.inet.ip.portrange.first=1024

sysctl net.inet.ip.portrange.last=65535

To use ports in natural order instead of random (to make the second connection for the same port impossible before TIME_WAIT):

sysctl net.inet.ip.portrange.randomized=0

In FreeBSD 6.2 the possibility to not create TIME_WAIT state for localhost connections was added:

sysctl net.inet.tcp.nolocaltimewait=1

Rewriter para youtube

#!/usr/bin/perl
# Modificado por Int21 (int211@gmail.com)
# Com base no rewriter do chudy_fernandez@yahoo.com e Syed
#### Monitorar
#
use IO::File;
$|=1;
STDOUT->autoflush(1);
$debug=1; ## recommended:0
$bypassallrules=0; ## recommended:0
$sucks=””; ## unused
$sucks=”sucks” if ($debug>=1);
$timenow=””;
$printtimenow=1; ## print timenow: 0|1
my $logfile = ‘/etc/squid/store2.log’;

open my $logfh, ‘>>’, $logfile
or die “Couldn’t open $logfile for appending: $!\n” if $debug;
$logfh->autoflush(1) if $debug;

#### main
while () {
$timenow=time().” ” if ($printtimenow);
print $logfh “$timenow”.”in : $_” if ($debug>=1);
chop; ## strip eol
@X = split;
$x = $X[0]; ## 0
$u = $X[1]; ## url
$_ = $u; ## url
# ip gateway
my $whatip = do { (my $tmp = $X[2]) =~ s/\///; $tmp };
my $whatip = do { (my $tmp = $whatip) =~ s/-//; $tmp };
$file = “/tmp/”.$whatip;
if ($bypassallrules){
$out=”$u”; ## map 1:1

#Youtube

}elsif (m/.*youtube.com\/watch\?(feature\=player_embedded&v|NR=1&v|feature\=fvwp&v|v)=([^\&\s]*)/) {
$out= $x[1];
put($2,$file);

}elsif (m/.*youtube.com\/v\/(.*)\?version/) {
$out= $x[1];
put($1,$file);

}elsif (m/.*youtube.com\/.*video_id=([^\&\s]*)/) {
$out= $x[1];
put($1,$file);

}elsif (m/.*youtube.com\/.*docid=([^\&\s]*)/) {
$out= $x[1];
put($1,$file);

#youtube com range (YOUTUBE split)
}elsif (m/(youtube|google).*videoplayback\?/) {
@id = m/[&?](id=[^\&]*)/;
@range = m/[&?](range=[^\&\s]*)/;
@begin = m/[&?](begin=[^\&\s]*)/;
@redirect = m/[&?](redirect_counter=[^\&]*)/;
if (m/[&?](id=o-[^\&\s]*)/)
{
$new_id = &get($file);
$out=”http://video-srv.youtube.com.VIDEOPLAYBACK/id=”.$new_id.”&@range”;
}
#
#
else{
$out=”http://video-srv.youtube.com.SQUIDINTERNAL/@itag&@id&@range@begin@redirect”;
}

#globo
}elsif (m/^http:\/\/voddownload\.globo\.com\/(.*\.(mp4|swf))\?(.*)/) {
$out=”http://voddownload.globo.com.SQUIDINTERNAL/” . $1 . “”;

#vk.me
}elsif (m/^http:\/\/*\.vk\.me\/(.*\.(mp4|swf))\?(.*)/) {
$out=”http://vk.me.SQUIDINTERNAL/” . $1 . “”;

#UOL video
}elsif (m/^http:\/\/video[0-9][0-9]*\.mais\.uol\.com\.br\/(.*\.(mp4|flv))\?(.*)/) {
$out=”http://video.mais.uol.com.SQUIDINTERNAL/” . $1 . “”;

#MSN video ex: http://content3.catalog.video.msn.com/e2/ds/0f215c62-92bc-424c-bbd6-a8a236e7aec4.mp4
}elsif (m/^http:\/\/*\.video\.msn\.com\/(.*\.(mp4|flv))\?(.*)/) {
$out=”http://video.msn.com.SQUIDINTERNAL/” . $1 . “”;

#for yimg.com with &sig=
} elsif (m/^http:\/\/([^\.]*)\.yimg\.com\/(.*)/) {
@y = ($1,$2);
$y[0] =~ s/[a-z]+([0-9]+)?/cdn/;
$y[1] =~ s/&sig=.*//;
$out=”http://” . $y[0] . “.yimg.com/” . $y[1] . “”;

#for yimg.com video
} elsif (m/^http:\/\/(.*\.yimg.com)\/(.*?)\/([^\?\&\=]*\.[^\/\?\&]{3,4})(\?.*)?$/) {
$out=”http://cdn.yimg.com//” . $3 . “”;

#for yimg.com doubled
} elsif (m/^http:\/\/(.*?)\.yimg\.com\/(.*?)\.yimg\.com\/(.*?)\?(.*)/) {
$out=”http://cdn.yimg.com/” . $3 . “”;

#for ytimg.com with &sig=
} elsif (m/^http:\/\/(.*?)\.ytimg\.com\/(.*)/) {
@y = ($1,$2);
$y[0] =~ s/[a-z]+[0-9]+/cdn/;
$y[1] =~ s/&sig=.*//;
$out=”http://ytimg/” . $y[0] . “.ytimg.com/” . $y[1] . “”;

#photos-X.ak.fbcdn.net where X a-z
} elsif (m/^http:\/\/photos-[a-z]?(\.ak\.fbcdn\.net)\/(.*?)\/(.*)/) {
$out=”http://photos” . $1 . “/” . $3 . “”;

} elsif (m/^http\:\/\/(photos-[a-z]\.ak\.fbcdn\.net|a[1-8]\.s?photos\.ak\.fbcdn\.net)\/h?photos-ak-.{4}(\/.*)/) {
$out=”http://photos.ak.fbcdn.SQUIDINTERNAL” . $2 . “”;
#YX.sphotos.ak.fbcdn.net where X 1-9, Y a-z

} elsif (m/^http:\/\/[a-z][0-9]\.sphotos(\.ak\.fbcdn\.net)\/(.*?)\/(.*)/) {
$out=”http://sphotos” . $1 . “/” . $3 . “”;

#Facebook Profile
} elsif (m/^http:\/\/(profile\.ak\.fbcdn\.net)\/(.*?)\/(.*)/) {
$out=”http://” . $1 . “/” . $3 . “”;

}elsif (m/^http:\/\/profile\.ak\.fbcdn\.net\/h?profile-ak-.{4}(\/.*)/) {
$out=”http://profile.ak.fbcdn.SQUIDINTERNAL” . $1 . “”;

}elsif (m/^http\:\/\/.*(profile|photo|photos|creative|vthumb).*\.ak\.fbcdn\.net(\/h(profile|photos|ads|vthumb)-ak-)(snc|ash|prn|frc)[0-9]?(.*)/) {
$out=”http://facebook.SQUIDINTERNAL” . $2 . “fb” . $5 . “”;

}elsif (m/^http\:\/\/.*(profile|photo|photos|creative|vthumb).*\.ak\.fbcdn\.net(\/(profile|photos|ads|vthumb)-ak-)(snc|ash|prn|frc)[0-9]?(.*)/) {
$out=”http://ads-facebook.SQUIDINTERNAL” . $2 . “fb” . $5 . “”;

}elsif (m/^http\:\/\/.*(static|profile).*\.ak\.fbcdn\.net(\/static-ak\/rsrc\.php\/v[0-9]\/(.*))/) {
$out=”http://statik-facebook.SQUIDINTERNAL/” . $3 . “”;

#facebook without statik http://static.ak.fbcdn.net/rsrc.php/yT/r/q-Drar4Ade6.ogg
}elsif (m/^http\:\/\/.*(static|profile).*\.ak\.fbcdn\.net(\/rsrc\.php\/v[0-9]\/(.*))/) {
$out=”http://statik-facebook.SQUIDINTERNAL/” . $3 . “”;

#http://i2.wp.com
} elsif (m/^http:\/\/i[0-2].wp.com\/graph.facebook.com\/(.*)/) {
$out=”http://WP-graph.facebook.com/” . $1 . “”;

#Facebook Video
} elsif (m/^http:\/\/(video\.ak\.fbcdn\.net)\/(.*?)\/(.*\.mp4)\??.*$/) {
$out=”http://” . $1 . “/” . $3 . “”;
} elsif (m/^http:\/\/video\.(.*)\.fbcdn\.net\/(.*?)\/([0-9_]+\.(mp4|flv|avi|mkv|m4v|mov|wmv|3gp|mpg|mpeg)?)(.*)/) {
$out=”http://video.ak.fbcdn.net/” . $3 . “”;

#Facebook Game
} elsif (m/^http:\/\/cityvillefb[0-3]?(.static.zgncdn.com.*)/) {
$out=”http://cityvillefb” . $1 . “”;

} elsif (m/^http:\/\/playerstatics[1-9]?(.poker.static.zynga.com.*)/) {
$out=”http://playerstatics.poker-zynga.” . $1 . “”;

} elsif (m/^http:\/\/kixeye[0-3]?(.cdn.kixeye.com.*)/) {
$out=”http://kixeye.com” . $1 . “”;

} elsif (m/^http:\/\/zynga[1-9]?-a(.akamaihd.net.*)/) {
$out=”http://zynga-akamaihd.net.” . $1 . “”;

} elsif (m/^http:\/\/s[1-9]?(.ninja.game321.com.*)/) {
$out=”http://ninja-game321.” . $1 . “”;

#### Anti Virus #####
#AVAST
} elsif (m/^http:\/\/download[0-9]{3}.(avast.com.*)/) {
$out=”http://avast-cdn.” . $1 . “”;
#KAV
} elsif (m/^http:\/\/dnl-[0-9]{2}.(geo.kaspersky.com.*)/) {
$out=”http://kav-cdn.” . $1 . “”;
#AVG
} elsif (m/^http:\/\/update.avg.com/) {
$out=”http://avg-cdn.” . $1 . “”;

#Face
} elsif (m/^http:\/\/i[1-9]{3}(.padepokan.cowe.*)/) {
$out=”http://www.facebook.com/groups/padepokan.cowe” . $1 . “”;

#Forum
} elsif (m/^http:\/\/i[1-9]{3}(.forbelajarbareng.*)/) {
$out=”http://www.facebook.com/groups/forbelajarbareng/” . $1 . “”;

#Forum
} elsif (m/^http:\/\/i[1-9]{3}(.ilmujaringan.*)/) {
$out=”http://www.facebook.com/groups/ilmujaringan/” . $1 . “”;

# Gstatic
} elsif (m/^http:\/\/([a-z])[\d]{1,2}?(.gstatic\.com.*|\.wikimapia\.org.*)/) {
$out=”http://” . $1 . $2 . “”;

# Virtual Earth
} elsif (m/^http:\/\/.*\.[a-z][0-9]\.(tiles\.virtualearth\.net)\/(.*\&n=z)/) {
$out=”http://” . $1 . “/” . $2 . “”;

# Scridb (assets)
} elsif (m/^http:\/\/imgv2-[0-9](\.scribdassets\.com.*)/) {
$out=”http://imgv2″ . $1 . “”;

# Google Maps 1
} elsif (($u =~ /(khm|khms|cbk|cbks|mt|mw|mlt|mts)[0-9]\.(google|googleapis)\.co(m|\.uk|\.id)/) && (m/^http:\/\/([^\/]*?)\/(.*\&z=[\d]+)/)) {
$out=”http://map-srv.google.com.SQUIDINTERNAL/” . $2 . “”;

# Google Chrome
} elsif (m/^http:\/\/(.*\.google\.com)\/(edgedl\/[^\?\&\=]*\.[a-z]{3,4})(\?.*)?$/) {
$out=”http://chrome-srv.google.com.SQUIDINTERNAL/” . $2 . “”;

# Google Maps 2
} elsif (m/^http:\/\/(cbk|mt|khm|mlt|tbn)[0-9]?(.google\.co(m|\.uk|\.id).*)/) {
$out=”http://” . $1 . $2 . “”;

# Gstatic + wikmapia
} elsif (m/^http:\/\/([a-z])[0-9]?(\.gstatic\.com.*|\.wikimapia\.org.*)/) {
$out=”http://” . $1 . $2 . “”;

#speedtest
}elsif (m/^http:\/\/(.*)\/speedtest\/(.*\.(jpg|txt))\?(.*)/) {
$out=”http://cdn.SQUIDINTERNAL/speedtest/” . $1 . “”;

#reverbnation
} elsif (m/^http:\/\/.*reverbnation.com\/(controller\/audio_player|audio_player)\/(.*)\/(\d{1,9})?/) {
$out=”http://c2lo-REVERBNATION-AUDIO/” . $3 . “”;

#apk
} elsif (m/^http:\/\/.*android.clients.google.com\/market\/GetBinary\/(.*)\/(.*)\?/) {
$out=”http://APK-PLAY-GOOGLE/” . $1 . “/” . $2 . “”;

#universal downloader
} elsif (m/^http:\/\/universal-downloader.en.softonic.com\/(.*)\/(.*)\?(.*)/) {
$out=”http://UNIVERSAL-DOWNLOADER/” . $2 . “”;

#ggpht.com 1
} elsif (m/^http:\/\/lh[0-9].ggpht.com\/(.*)/) {
$out=”http://GGPHT-GOOGLE/” . $1 . “”;

#ggpht.com 2
} elsif (m/^http:\/\/lh[0-9]?.ggpht.com\/(.*?)\/(.*?)\/(.*?)\/(.*)\/(.*)?$/) {
$out=”http:/ggpht.SQUIDINTERNAL/” . $1 . “/” . $2 . “/” . $4 . “/” . $5 . “”;

# http://s1.softpedia-static.com/base_img/_mobile_cat.gif
} elsif (m/^http:\/\/(.*)\.softpedia-static.com\/(.*)/) {
$out=”http://SOFTPEDIA/” . $2 . “”;
} elsif (m/^http:\/\/[0-9]{2}.(media.tumblr.com.*)/) {
$out=”http://TUMBLR.” . $1 . “”;

#mediafire
}elsif (m/^http:\/\/199\.91\.15\d\.\d*\/\w{12}\/(\w*)\/(.*)/) {
$out=”http://www.mediafire.com.SQUIDINTERNAL/” . $1 .”/” . $2 . “”;

#mediafire 1
}elsif (m/^http:\/\/199\.91\.15\d\.\d*\/(.*)\/(\w*)\/(.*)/) {
$out=”http://www.mediafire.com.SQUIDINTERNAL/” . $2 . “/” . $3 . “”;

}elsif (m/^http:\/\/205\.196\.12\d\.\d*\/(.*)\/(\w*)\/(.*)/) {
$out=”http://www.mediafire.com.SQUIDINTERNAL/” . $2 . “/” . $3 . “”;

#fileserve
}elsif (m/^http:\/\/fs\w*\.fileserve\.com\/file\/(\w*)\/[\w-]*\.\/(.*)/) {
$out=”http://www.fileserve.com.SQUIDINTERNAL/” . $1 . “./” . $2 . “”;

#filesonic
}elsif (m/^http:\/\/s[0-9]*\.filesonic\.com\/download\/([0-9]*)\/(.*)/) {
$out=”http://www.filesonic.com.SQUIDINTERNAL/” . $1 . “”;

#ziddu
} elsif (m/^http:\/\/(www\.ziddu\.com.*\.[^\/]{3,4})\/(.*?)/) {
$out=”http://” . $1 . “”;

#filesharing rapidshare
} elsif (($u =~ /rapidshare/) && (m/^http:\/\/(([A-Za-z]+[0-9-.]+)*?)([a-z]*\.[^\/]{3}\/[a-z]*\/[0-9]*)\/(.*?)\/([^\/\?\&]{4,})$/)) {
$out=”http://cdn.” . $3 . “/SQUIDINTERNAL/” . $5 . “”;

#4shared audio/video preview
} elsif (($X[1] =~ /4shared/) && (m/^http:\/\/(.*?)\.(.*?)\/(.*?)\/(dlink__2Fdownload_2F([^\/-]+))([a-zA-Z0-9-]+)\/([^\/\?\&]*\.[^\/\?\&]{2,3})(\?.*)?$/)) {
@y = ($1,$2,$3,$4,$7);
$y[0] =~ s/[a-z]+([0-9]+)?/cdn./;
$out=”http://” . $y[0] . $y[1] . “/” . $y[2] . “/” . $y[3] . “/” . $y[4] . “”;

#cdn, varialble 1st path
} elsif (($u =~ /filehippo|mediafire/) && (m/^http:\/\/(.*?)\.(.*?)\/(.*?)\/(.*)\.([a-z0-9]{3,4})(\?.*)?/)) {
@y = ($1,$2,$4,$5);
$y[0] =~ s/[a-z0-9]{2,5}/cdn./;
$out=”http://” . $y[0] . $y[1] . “/” . $y[2] . “.” . $y[3] . “”;

#http://s5.scribdassets.com/images/attribution_noncommercial.png
} elsif (m/^http:\/\/s[1-8]?(.scribdassets.com.*)/) {
$out=”http://cdn-scribdassets.” . $1 . “”;

#http://i54.tinypic.com/2crkryu.jpg
} elsif (m/^http:\/\/i[0-9]{2}(.tinypic.com.*)/) {
$out=”http://tinypic.” . $1 . “”;

#photobucket
} elsif (m/^http:\/\/i[1-9]{3}(.photobucket.com.*)/) {
$out=”http://photobucket3.” . $1 . “”;
} elsif (m/^http:\/\/i[1-9]{4}(.photobucket.com.*)/) {
$out=”http://photobucket.” . $1 . “”;

#http://i616.photobucket.com/albums/uu90/the_martian_cat/ATT00001-1.gif
} elsif (m/^http:\/\/i[1-9]{3}(.photobucket.com.*)/) {
$out=”http://photobucket3.” . $1 . “”;

#http://i1221.photobucket.com/albums/dd462/semprotcom/File/tri7bet-s.gif
} elsif (m/^http:\/\/i[1-9]{4}(.photobucket.com.*)/) {
$out=”http://photobucket.” . $1 . “”;

#### blogspot
} elsif (m/^http:\/\/[1-4].bp.(blogspot.com.*)/) {
$out=”http://blog-cdn.” . $1 . “”;

#blogpost Checked
} elsif (m/^http:\/\/[0-9]?.bp.blogspot\.com\/(.*)\/s.*?\/(.*(jpg|png|gif)?$)/) {
$out=”http:/bp.blogspot.com.SQUIDINTERNAL/” . $1 . “/” . $2 . “”;

#twimg.com
} elsif (m/^http:\/\/a[0-5]?(.twimg.com.*)/) {
$out=”http://cdn-twimg.com.” . $1 . “”;

# spicific servers starts here….
} elsif (m/^http:\/\/(www\.ziddu\.com.*\.[^\/]{3,4})\/(.*?)/) {
$out=”http://” . $1 . “”;

#cdn, varialble 1st path
} elsif (($u =~ /filehippo/) && (m/^http:\/\/(.*?)\.(.*?)\/(.*?)\/(.*)\.([a-z0-9]{3,4})(\?.*)?/)) {
@y = ($1,$2,$4,$5);
$y[0] =~ s/[a-z0-9]{2,5}/cdn./;
$out=”http://” . $y[0] . $y[1] . “/” . $y[2] . “.” . $y[3] . “”;

#rapidshare
} elsif (($u =~ /rapidshare/) && (m/^http:\/\/(([A-Za-z]+[0-9-.]+)*?)([a-z]*\.[^\/]{3}\/[a-z]*\/[0-9]*)\/(.*?)\/([^\/\?\&]{4,})$/)) {
$out=”http://cdn.” . $3 . “/SQUIDINTERNAL/” . $5 . “”;

} elsif (($u =~ /maxporn/) && (m/^http:\/\/([^\/]*?)\/(.*?)\/([^\/]*?)(\?.*)?$/)) {
$out=”http://” . $1 . “/SQUIDINTERNAL/” . $3 . “”;

#easythumbhost
} elsif (m/^http:\/\/tc[0-9]{1,2}?(.easythumbhost.com.*)/) {
$out=”http://cdn-EASY” . $1 . “”;

#Game
} elsif (m/^http:\/\/dl\.garenanow.com\/hon\/patcher\/(.*\.(exe|zip))\?/) {
$out=”http://dl.garena.SQUIDINTERNAL/” . $1 . “”;

#Google chrome update
} elsif (m/^http\:\/\/.*(pack.google.com.*)/) {
$out=”http://cdn.” . $1 . “”;

#Firefox OK
} elsif (m/^http:\/\/.*?firefox\/releases\/(.*?)\/(firefox.*(mar|exe)?$)/) {
$out=”http://firefox.SQUIDINTERNAL/ ” . $1 . “/” . $2 . “”;

#Mozilla update 1
} elsif (m/^http:\/\/(.*?)\/(firefox\/releases)\/(.*?[a-z]{3})$/) {
$out=”http://mozilla.org.SQUIDINTERNAL/” . $2 . “/” . $3 . “”;

#windows update
} elsif (m/^http:\/\/i[1-9]{3}(.windowsupdate.com.*)/) {
$out=”http://windowsupdate.com.” . $1 . “”;

#ubuntu update 3
} elsif (m/^http:\/\/(.*?)\/(ubuntu\/[a-zA-Z].*\/os\/.*)/) {
$out=”http://kambing.ui.ac.id.SQUIDINTERNAL/” . $2 . “”;

##### gado gado #####
#google-analytics [google image search]
} elsif (m/^http:\/\/www\.google-analytics\.com\/__utm\.gif\?.*/) {
$out=”http://www.google-analytics.com/__utm.gif”;

#static3.spilcdn.com/
} elsif (m/^http:\/\/static[1-9]?(.speelcdn.com.*)/) {
$out=”http://speelcdn.” . $1 . “”;

#http://t1.gstatic.com
} elsif (m/^http:\/\/t[1-9]?(.gstatic.com.*)/) {
$out=”http://cdn-gstatic.com.” . $1 . “”;

# http://0.gravatar.com
} elsif (m/^http:\/\/[0-3]?(.gravatar.com.*)/) {
$out=”http://cdn-gravatar.” . $1 . “”;

#http://s5.scribdassets.com/images/attribution_noncommercial.png
} elsif (m/^http:\/\/s[1-8]?(.scribdassets.com.*)/) {
$out=”http://cdn-scribdassets.” . $1 . “”;

# http://tc2.easythumbhost.com/
} elsif (m/^http:\/\/tc[0-9]?(.easythumbhost.com.*)/) {
$out=”http://cdn-easythumbhost.” . $1 . “”;

#http://static7.spilcdn.com/tw/img/_/profile/dummy_small.png
} elsif (m/^http:\/\/static[1-7]?(.spilcdn.com.*)/) {
$out=”http://spilcdn.” . $1 . “”;

#http://media5.picsearch.com/is
} elsif (m/^http:\/\/media[1-8]?(.picsearch.com.*)/) {
$out=”http://cdn-picsearch.” . $1 . “”;

#http://lh3.googleusercontent.com/-z2ZV9VfLsc0/TmetBcUiRBI/AAAAAAAAC_k/-wvptlnDXuQ/03.png
} elsif (m/^http:\/\/lh[3-6]?(.googleusercontent.com.*)/) {
$out=”http://googleusercontent.” . $1 . “”;

#http://i54.tinypic.com/2crkryu.jpg
} elsif (m/^http:\/\/i[0-9]{2}(.tinypic.com.*)/) {
$out=”http://tinypic.” . $1 . “”;

#Google android market
} elsif (m/^http:\/\/(.*\.android\.clients\.google\.com)\/(market\/[^\?\&\=]*)(\?.*)?$/) {
$out=”http://android-srv.google.com.SQUIDINTERNAL/” . $2 . “”;

#Sourceforge
} elsif (m/^http:\/\/(.*\.dl\.sourceforge\.net)\/(.*)/) {
$out=”http://dl.sourceforge.net.SQUIDINTERNAL/” . $2 . “”;

#IPV4 (TESTE POR IP ok)
} elsif (($u =~ /([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})/) && (m/^http:\/\/([^\/]*?)\/(thumbs|flv|key=|content).*?\/([^\/\?\&]*\.[\w\d]{3})\??.*$/)) {
$out=”http://vstreamcdn.com.SQUIDINTERNAL/” . $3 . “”;

# Webzilla
} elsif (($u =~ /([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})/) && (m/^http:\/\/([^\/]*?)\/remote_control.php.*?(file=.*)/)) {
$out=”http://webzilla.com.SQUIDINTERNAL/” . $2 . “”;

# Webzilla 1
} elsif (($u =~ /([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})/) && (m/^http:\/\/([^\/]*?)\/(.*\/[a-z]*\/thumbs.*)/)) {
$out=”http://webzilla.SQUIDINTERNAL/” . $2 . “”;

# Midphase
} elsif (($u =~ /([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})/) && (m/^http:\/\/([^\/]*?)\/(.*\/t\/([^\?\&\=]*\.[a-z]{3}))$/)) {
$out=”http://midphase.com.SQUIDINTERNAL/” . $2 . “”;
# cdn, variable.domain/.*/path/filename

# domain/.*/path/filename.”ex”, “ext” or “exte”
} elsif (($u =~ /filehippo/) && (m/^http:\/\/(.*?)(\.[^\/]*?)\/(.*?)\/([^\?\&\=]*)\.([\w\d]{2,4})\??.*$/)) {
@y = ($1,$2,$4,$5);
$y[0] =~ s/([a-z][0-9][a-z]dlod[\d]{3})|((cache|cdn)[-\d]*)|([a-zA-Z]+-?[0-9]+(-[a-zA-Z]*)?)/cdn/;
$out=”http://” . $y[0] . $y[1] . “/” . $y[2] . “.” . $y[3] . “”;

# domain/path/.*/filename.”ex”, “ext” or “exte”
} elsif (($u =~ /sharebeast/) && (m/^http:\/\/(.*?)(\.[^\.\-]*?[^\/]*\/[^\/]*)\/(.*?)\/([^\?\&\=]*)\.([\w\d]{2,4})\??.*$/)) {
@y = ($1,$2,$4,$5);
$y[0] =~ s/([a-z][0-9][a-z]dlod[\d]{3})|((cache|cdn)[-\d]*)|([a-zA-Z]+-?[0-9]+(-[a-zA-Z]*)?)/cdn/;
$out=”http://” . $y[0] . $y[1] . “/” . $y[2] . “.” . $y[3] . “”;

# Pornos
} elsif (($X[1] =~ /tube8|redtube|hardcore-teen|pornhub|tubegalore|xvideos|hostedtube|pornotube|redtubefiles/) && (m/^http:\/\/(([A-Za-z]+[0-9-.]+)*?(\.[a-z]*)?)\.([a-z]*[0-9]?\.[^\/]{3}\/[a-z]*)(.*?)((\/[a-z]*)?(\/[^\/]*){4}\.[^\/\?]{3,4})(\?.*)?$/)) {
$out=”http://PORNO-cdn.” . $4 . $6 . “”;

# domain/path/.*/path/filename
} elsif (($u =~ /fucktube/) && (m/^http:\/\/(.*?)(\.[^\.\-]*?[^\/]*\/[^\/]*)\/(.*)\/([^\/]*)\/([^\/\?\&]*)\.([^\/\?\&]{3,4})(\?.*?)$/)) {
@y = ($1,$2,$4,$5,$6);
$y[0] =~ s/(([a-zA-Z]+[0-9]+(-[a-zA-Z])?$)|([^\.]*cdn[^\.]*)|([^\.]*cache[^\.]*))/cdn/;
$out=”http://” . $y[0] . $y[1] . “/” . $y[2] . “/” . $y[3] . “.” . $y[4] . “”;

} elsif (($X[1] =~ /maxporn/) && (m/^http:\/\/([^\/]*?)\/(.*?)\/([^\/]*?)(\?.*)?$/)) {
$out=”http://” . $1 . “/SQUIDINTERNAL/” . $3 . “”;

# Maxporn
} elsif (($u =~ /maxporn/) && (m/^http:\/\/([^\/]*?)\/(.*?)\/([^\/]*?)(\?.*)?$/)) {
$out=”http://” . $1 . “/SQUIDINTERNAL/” . $3 . “”;

# Fucktube
} elsif (($u =~ /fucktube/) && (m/^http:\/\/(.*?)(\.[^\.\-]*?[^\/]*\/[^\/]*)\/(.*)\/([^\/]*)\/([^\/\?\&]*)\.([^\/\?\&]{3,4})(\?.*?)$/)) {
@y = ($1,$2,$4,$5,$6);
$y[0] =~ s/(([a-zA-A]+[0-9]+(-[a-zA-Z])?$)|([^\.]*cdn[^\.]*)|([^\.]*cache[^\.]*))/cdn/;
$out=”http://” . $y[0] . $y[1] . “/” . $y[2] . “/” . $y[3] . “.” . $y[4] . “”;

# Youjizz
} elsif (($u =~ /media[0-9]{1,5}\.youjizz/) && (m/^http:\/\/(.*?)(\.[^\.\-]*?\.[^\/]*)\/(.*)\/([^\/\?\&]*)\.([^\/\?\&]{3,4})(\?.*?)$/)) {
@y = ($1,$2,$4,$5);
$y[0] =~ s/(([a-zA-Z]+[0-9]+(-[a-zA-Z])?$)|([^\.]*cdn[^\.]*)|([^\.]*cache[^\.]*))/cdn/;
$out=”http://” . $y[0] . $y[1] . “/” . $y[2] . “.” . $y[3] . “”;

# imagehost
} elsif (m/^http:\/\/i[1-9]{3}(.imagehost123.com.*)/) {
$out=”http://imagehost123.com.” . $1 . “”;

##### Cache propagandas #####
} elsif (m/^http:\/\/([a-z0-9.]*)(\.doubleclick\.net|\.quantserve\.com|\.googlesyndication\.com|yieldmanager|cpxinteractive)(.*)/) {
$y = $3;$z = $2;
for ($y) {
s/pixel;.*/pixel/;
s/activity;.*/activity/;
s/(imgad[^&]*).*/\1/;
s/;ord=[?0-9]*//;
s/;&timestamp=[0-9]*//;
s/[&?]correlator=[0-9]*//;
s/&cookie=[^&]*//;
s/&ga_hid=[^&]*//;
s/&ga_vid=[^&]*//;
s/&ga_sid=[^&]*//;
# s/&prev_slotnames=[^&]*//
# s/&u_his=[^&]*//;
s/&dt=[^&]*//;
s/&dtd=[^&]*//;
s/&lmt=[^&]*//;
s/(&alternate_ad_url=http%3A%2F%2F[^(%2F)]*)[^&]*/\1/;
s/(&url=http%3A%2F%2F[^(%2F)]*)[^&]*/\1/;
s/(&ref=http%3A%2F%2F[^(%2F)]*)[^&]*/\1/;
s/(&cookie=http%3A%2F%2F[^(%2F)]*)[^&]*/\1/;
s/[;&?]ord=[?0-9]*//;
s/[;&]mpvid=[^&;]*//;
s/&xpc=[^&]*//;
# yieldmanager
s/\?clickTag=[^&]*//;
s/&u=[^&]*//;
s/&slotname=[^&]*//;
s/&page_slots=[^&]*//;
}
$out=”http://ALTA-LATENCIA-ANUNCIOS/” . $1 . $2 . $y . “”;

#cache high latency ads
} elsif (m/^http:\/\/(.*?)\/(ads)\?(.*?)/) {
$out=”http://” . $1 . “/” . $2 . “”;

#general purpose for cdn servers. add above your specific servers.
} elsif (m/^http:\/\/([0-9.]*?)\/\/(.*?)\.(.*)\?(.*?)/) {
$out=”http://cdn-url//” . $2 . “.” . $3 . “”;

#generic http://variable.domain.com/path/filename.”ex” “ext” or “exte” with or withour “? or %”
} elsif (m/^http:\/\/(.*)(\.[^\.\-]*?\..*?)\/(.*)\.([^\/\?\&]{2,4})((\?|\%).*)?$/) {
@y = ($1,$2,$3,$4);
$y[0] =~ s/(([a-zA-Z]+[0-9]+(-[a-zA-Z])?$)|(.*cdn.*)|(.*cache.*))/cdn/;
$out=”http://” . $y[0] . $y[1] . “/” . $y[2] . “.” . $y[3] . “”;

} else {
$out=”$u”;
}
print $logfh “$timenow”.”out: $x $out $X[2] $X[3] $X[4] $X[5] $X[6] $X[7]\n” if ($debug>=1);
print “$x $out $X[2] $X[3] $X[4] $X[5] $X[6] $X[7]\n”;
}

sub put {
my ($string, $files) = @_;
open FILE, ‘>’.$files;
print FILE $string;
close FILE;

}

sub get{
my $filename = $_[0];
open(INFO, $filename);
@lines = ;
close(INFO);
my $string = “”;
foreach (@lines){
$string .= $_;
}
return $string;
}
close $logfh if ($debug);

por int21 Postado em Cache

Eu não quero cache disso!

Bom, pra dar continuidade a nossa sessão cache e afins, existem situações em que o cache acaba atrapalhando certos dominios, um deles que vejo dar cacete direto é o do HOTMAIL (grande mikrosoft…) que não tolera um sistema de cache.

e pra “dar um grau” e TIRAR o dominio do cache no squid é simples.

acl SEMCACHE dstdomain "/etc/squid/semcache.txt"
no_cache deny SEMCACHE

colocando essa linha e criando o arquivo semcache.txt vc eliminara esse bendito problema de erros ao tentar acessas as contas do hotmail e etc.

um exemplo do semcache.txt que eu evitaria alguns dominios seria:

.hotmail.com
*.live.com

Um forte abraço galera.

por int21 Postado em Cache