As redes de entrega de conteúdo (CDNs) são usadas em sites e aplicativos principalmente para acelerar o carregamento de elementos estáticos. Isso acontece devido ao armazenamento em cache de arquivos em servidores CDN localizados em diferentes regiões geográficas. Após solicitar os dados via CDN, o usuário os recebe do servidor mais próximo.O princípio de operação e funcionalidade de todas as redes de entrega de conteúdo é aproximadamente o mesmo. Depois de receber uma solicitação para baixar um arquivo, o servidor CDN o pega no servidor original e o entrega ao usuário, ao mesmo tempo em cache por um determinado período de tempo. Todas as solicitações subsequentes são respondidas do cache. Todas as CDNs têm opções para pré-carregar arquivos, limpar o cache, definir seu período de retenção e muito mais.Ocorre que, por um motivo ou outro, você precisa organizar sua própria rede de entrega de conteúdo e, em seguida, deixe-nos ajudá-lo a construir outra bicicleta.
Fonte: Infográfico vetor criado por pikisuperstar - www.freepik.comQuando você precisa do seu próprio CDN
Considere os casos em que iniciar seu próprio CDN faz sentido:- quando você deseja economizar, e os custos de operação, mesmo ao usar CDNs baratas como o BunnyCDN, são várias centenas de dólares por mês
- se queremos obter um cache permanente ou um cache sem vizinhos no servidor e no canal
- na região que você precisa, os serviços CDN não têm pontos de presença
- quaisquer configurações especiais de entrega de conteúdo necessárias
- queremos acelerar a entrega de conteúdo dinâmico, aproximando-nos dos usuários do servidor de produção
- existe a preocupação de que um serviço CDN de terceiros possa coletar ou usar ilegalmente informações sobre o comportamento do usuário (para serviços sem conformidade com o GDPR) ou se envolver em outras ações ilegais
Na maioria dos outros casos, é melhor usar as soluções prontas existentes.O que você precisa para executar
É maravilhoso se você tiver seu próprio sistema autônomo (AS). Com ele, você pode atribuir o mesmo IP a vários servidores e seguir estas instruções no nível da rede para direcionar os usuários para o servidor mais próximo. Vale dizer que, mesmo com o bloco de endereços / 24, é possível construir uma rede de entrega de conteúdo. Alguns provedores de servidores permitem que você faça um anúncio para uso em todas as regiões disponíveis para eles.Se você não é um proprietário feliz de um bloco de endereços IP, para executar uma CDN simples, será necessário:Com o registro de domínio, tudo é simples - registre-se em qualquer zona com qualquer registrador. Você também pode usar um subdomínio para uma CDN, como algo como cdn.namedomain.com . Na verdade, em nosso exemplo, faremos isso.Quanto ao pedido de servidores, eles devem ser alugados nas regiões e nos países em que seu público-alvo está localizado. Se o projeto for intercontinental, é conveniente escolher provedores de hospedagem que ofereçam servidores em todo o mundo imediatamente. Exemplos: OVH , Leaseweb e 100Tb para servidores dedicados, Vultr e DigitalOcean para nuvem virtual *.Para nossa CDN privada, solicitamos 3 servidores virtuais em diferentes continentes. At vultrno servidor por US $ 5 / mês, temos 25 GB de espaço SSD e 1 TB de tráfego . Ao instalar, selecione o último Debian. Nossos servidores:
Frankfurt , ip: 199.247.18.199
Chicago , ip: 149.28.121.123
Cingapura , ip: 157.230.240.216* A Vultr e a DigitalOcean prometem um empréstimo de US $ 100 aos usuários registrados usando os links do artigo imediatamente após adicionar um método de pagamento. O autor também recebe um pequeno elogio disso, o que é muito significativo para ele agora. Por favor, seja compreensivo.Configurar geoDNS
Para que quando um usuário acessa um domínio ou subdomínio CDN, ele é direcionado para o servidor desejado (mais próximo a ele), precisamos de um servidor DNS com a função geoDNS.O princípio e o procedimento do geoDNS são os seguintes:- Define o IP do cliente que enviou a solicitação DNS ou o IP do servidor DNS recursivo usado para processar a solicitação do cliente. Esses servidores recursivos geralmente são provedores de DNS.
- Por IP, o cliente conhece seu país ou região. Para isso, são utilizadas as bases GeoIP, das quais existem muitas hoje. Existem algumas boas opções gratuitas .
- Dependendo da localização do cliente, ele fornece o endereço IP do servidor CDN mais próximo.
Você pode criar um servidor DNS com a função geoDNS , mas é melhor usar soluções prontas com uma rede de servidores DNS ao redor do mundo e o Anycast pronto para uso :- louDNS de US $ 9,95 / mês , tarifa GeoDNS, por padrão, há um failover de DNS
- Zilore de US $ 25 / mês , failover de DNS ativado
- Amazon Route 53 de US $ 35 / mês para solicitações geográficas líquidas de 50 milhões. O failover de DNS é cobrado separadamente
- DNS facilitado a partir de US $ 125 / mês , há 10 failover de DNS
- Cloudflare , recurso de direção geográfica disponível em tarifas corporativas
Ao fazer o pedido do geoDNS, você deve prestar atenção ao número de solicitações incluídas na tarifa e levar em consideração que o número real de chamadas para o domínio pode exceder as expectativas várias vezes. Milhões de aranhas, scanners, spammers e outros espíritos malignos trabalham incansavelmente.Quase todos os serviços DNS incluem um indispensável para a criação de um serviço CDN - Failover DNS. Com ele, você pode configurar o monitoramento de seus servidores e, na ausência de sinais de vida, substituir automaticamente o endereço do servidor que não está funcionando por um servidor de backup nas respostas DNS.Para construir nossa CDN, usaremos o ClouDNS , a tarifa do GeoDNS.Adicione uma nova zona DNS à sua conta, indicando seu domínio. Se criarmos a CDN em um subdomínio e o domínio principal já estiver em uso, imediatamente após adicionar a zona, não esqueça de adicionar os registros DNS em funcionamento existentes. O próximo passo é criar para o domínio / subdomínio CDN vários registros A, cada um dos quais será aplicado à região que definimos. Você pode especificar continentes ou países como regiões; as sub-regiões estão disponíveis para os EUA e o Canadá.No nosso caso, o CDN será levantado na cdn.sayt.in subdomínio . Adicionando a zona sayt.in , crie o primeiro registro A para o subdomínio e direcione toda a América do Norte para o servidor em Chicago:Repita o procedimento para outras regiões, lembrando-se de criar uma entrada para as regiões padrão. Aqui está o resultado:O último registro padrão na captura de tela significa que todas as regiões indeterminadas (como Europa, África, usuários de Internet via satélite etc.) serão enviadas para um servidor em Frankfurt.Isso completa a configuração básica do DNS. Resta acessar o site do registrador de domínios e substituir os NSs de domínio atuais pelos emitidos pelo ClouDNS. E enquanto os NSs serão atualizados, prepararemos o servidor.Instalar certificados SSL
Nossa CDN funcionará em HTTPS; portanto, se você já possui certificados SSL para um domínio ou subdomínio, faça o upload para todos os servidores, por exemplo, no diretório / etc / ssl / yourdomain /Se não houver certificados, você pode obter um grátis em Let's Encrypt. O script ACME Shell é perfeito para isso . O cliente é conveniente, fácil de configurar e, o mais importante - permite validar o domínio / subdomínio do DNS por meio da API do ClouDNS.Instalaremos o acme.sh somente em um dos servidores - europeu 199.247.18.199, a partir do qual os certificados serão copiados para todos os outros. Para instalar, faça:root@cdn:~# wget -O - https://get.acme.sh | bash; source ~/.bashrc
Durante a instalação do script, uma tarefa CRON será criada para renovação adicional de certificados sem a nossa participação.A verificação do domínio ao emitir um certificado será realizada usando DNS usando a API. Portanto, na conta pessoal ClouDNS no menu API do revendedor, você precisa criar uma nova API de usuário e definir uma senha para ela. O auth-id resultante com a senha será gravada no arquivo ~ / .acme.sh / DnsApi / dns_cloudns.sh (para não ser confundido com o dns_clou d arquivo dns.sh ). Aqui estão as linhas para remover o comentário e editar:CLOUDNS_AUTH_ID=<auth-id>
CLOUDNS_AUTH_PASSWORD="<>"
Agora pedimos um certificado SSL para cdn.sayt.inroot@cdn:~# acme.sh --issue --dns dns_cloudns -d cdn.sayt.in --reloadcmd "service nginx reload"
Nos parâmetros para o futuro, especificamos um comando para recarregar automaticamente a configuração do servidor da web após cada renovação do período de validade do certificado no futuro.Todo o processo de obtenção de um certificado pode levar até 2 minutos, não o interrompa. Se ocorrer um erro de validação de domínio, tente executar o comando novamente. No final, veremos onde os certificados foram carregados:
Lembre - se desses caminhos, eles precisarão ser especificados ao copiar o certificado para outros servidores, bem como nas configurações do servidor web. Não prestamos atenção ao erro ao recarregar os arquivos de configuração do Nginx - em um servidor totalmente configurado, ele não estará presente ao renovar certificados.Tudo o que resta para nós através do SSL é copiar o certificado recebido para dois outros servidores, salvando o caminho para os arquivos. Crie os mesmos diretórios em cada um deles e faça uma cópia:root@cdn:~# mkdir -p /root/.acme.sh/cdn.sayt.in/
root@cdn:~# scp -r root@199.247.18.199:/root/.acme.sh/cdn.sayt.in/* /root/.acme.sh/cdn.sayt.in/
Para que a renovação do certificado seja regular, criaremos uma tarefa CRON diária nos dois servidores com o comando:scp -r root@199.247.18.199:/root/.acme.sh/cdn.sayt.in/* /root/.acme.sh/cdn.sayt.in/ && service nginx reload
Nesse caso, o acesso ao servidor de origem remoto deve ser configurado por chave , ou seja, sem digitar uma senha. Não se esqueça de fazê-lo.Instale e configure o Nginx
Para retornar conteúdo estático, usaremos o Nginx, configurado como um servidor proxy de cache. Atualize a lista de pacotes e instale-a nos três servidores:root@cdn:~# apt update
root@cdn:~# apt install nginx
Em vez do padrão, use a configuração do spoiler abaixo:nginx.confuser www-data;
worker_processes auto;
pid /run/nginx.pid;
events {
worker_connections 4096;
multi_accept on;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log off;
error_log /var/log/nginx/error.log;
gzip on;
gzip_disable "msie6";
gzip_comp_level 6;
gzip_proxied any;
gzip_vary on;
gzip_types text/plain application/javascript text/javascript text/css application/json application/xml text/xml application/rss+xml;
gunzip on;
proxy_temp_path /var/cache/tmp;
proxy_cache_path /var/cache/cdn levels=1:2 keys_zone=cdn:64m max_size=20g inactive=7d;
proxy_cache_bypass $http_x_update;
server {
listen 443 ssl;
server_name cdn.sayt.in;
ssl_certificate /root/.acme.sh/cdn.sayt.in/cdn.sayt.in.cer;
ssl_certificate_key /root/.acme.sh/cdn.sayt.in/cdn.sayt.in.key;
location / {
proxy_cache cdn;
proxy_cache_key $uri$is_args$args;
proxy_cache_valid 90d;
proxy_pass https://sayt.in;
}
}
}
Na configuração, edite:- max_size - tamanho do cache que não excede o espaço em disco disponível
- inativo - tempo de armazenamento para dados em cache que ninguém acessou
- ssl_certificate e ssl_certificate_key - caminhos para o certificado SSL e os arquivos de chave
- proxy_cache_valid - tempo de armazenamento para dados em cache
- proxy_pass - o endereço do servidor original do qual a CDN solicitará arquivos para armazenamento em cache. No nosso exemplo, isso é sayt.in
Como você pode ver, tudo é simples. A complexidade só pode surgir na configuração do tempo de cache devido à semelhança das diretivas inativas e proxy_cache_valid . Vamos analisá-los em nosso exemplo. Aqui está o que acontece com inactive = 7d e proxy_cache_valid 90d :- se a solicitação não for repetida dentro de sete dias, os dados serão excluídos do cache após esse período
- se a solicitação for repetida pelo menos uma vez a cada 7 dias, os dados no cache serão considerados desatualizados após 90 dias e, na próxima solicitação, o Nginx os atualizará retirando-os do servidor original
Após terminar de editar o nginx.conf , recarregue a configuração:root@cdn:~# service nginx reload
Nossa CDN está completamente pronta. Por US $ 15 / mês temos pontos de presença em três continentes e 3 TB de tráfego: 1 TB em cada local.Verificando o funcionamento da CDN
Vejamos os pings para nossa CDN de diferentes localizações geográficas. Para isso, qualquer serviço de ping é adequado.Os resultados são bons. Agora, colocaremos a imagem de teste test.jpg na raiz do site principal e verificaremos a velocidade do seu download via CDN. Mal disse o que fez . O conteúdo é entregue rapidamente.Escreveremos um pequeno script caso desejemos limpar o cache no ponto CDN.purge.sh#!/bin/bash
if [ -z "$1" ]
then
echo "Purging all cache"
rm -rf /var/cache/cdn/*
else
echo "Purging $1"
FILE=`echo -n "$1" | md5sum | awk '{print $1}'`
FULLPATH=/var/cache/cdn/${FILE:31:1}/${FILE:29:2}/${FILE}
rm -f "${FULLPATH}"
fi
Para excluir todo o cache, basta executá-lo, um arquivo separado pode ser limpo assim:root@cdn:~# ./purge.sh /test.jpg
Em vez de conclusões
Finalmente, quero dar algumas dicas úteis para passar imediatamente pelo rake, o que ao mesmo tempo deixou minha cabeça dolorida:- Para aumentar a tolerância a falhas da CDN, é recomendável configurar o Failover de DNS, o que ajuda a alterar rapidamente um registro A em caso de falha do servidor. Isso é feito no painel de controle dos registros DNS do domínio
- CDN, . CDN, 6-7 : , (), (), , ,
- CDN. , , -
- , ,
- Tente verificar pings de diferentes lugares nos seus servidores. Assim, você pode ver as regiões mais próximas aos pontos CDN e configurar o GeoDNS corretamente
- Dependendo das tarefas, não é impróprio configurar o Nginx para requisitos específicos de armazenamento em cache e levando em consideração a carga no servidor. Os artigos sobre o cache do Nginx - aqui e a aceleração do trabalho sob cargas pesadas: aqui e aqui me ajudaram bastante.