Crie e personalize sua CDN

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.com


Quando 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:

  • . ,
  • geoDNS . , ,



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:

  1. 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.
  2. 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 .
  3. 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.in

root@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.conf
user 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.
Ponto de lançamentoHospedeiroIPTempo médio, ms
Alemanha Berlimcdn.sayt.in199.247.18.1999,6
Holanda, Amsterdãcdn.sayt.in199.247.18.19910.1
França Pariscdn.sayt.in199.247.18.19916,3
Grã-Bretanha, Londrescdn.sayt.in199.247.18.19914,9
Canadá Torontocdn.sayt.in149.28.121.12316,2
EUA, São Franciscocdn.sayt.in149.28.121.12352,7
EUA, Dallascdn.sayt.in149.28.121.12323,1
EUA, Chicagocdn.sayt.in149.28.121.1232.6
EUA, Nova Iorquecdn.sayt.in149.28.121.12319,8
Cingapuracdn.sayt.in157.230.240.2161.7
Japão Tóquiocdn.sayt.in157.230.240.21674,8
Austrália, Sydneycdn.sayt.in157.230.240.21695,9
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.

All Articles