Crea y personaliza tu CDN

Las redes de entrega de contenido (CDN) se usan en sitios y en aplicaciones principalmente para acelerar la carga de elementos estáticos. Esto sucede debido al almacenamiento en caché de archivos en servidores CDN ubicados en diferentes regiones geográficas. Habiendo solicitado datos a través de CDN, el usuario los recibe del servidor más cercano.

El principio de funcionamiento y funcionalidad de todas las redes de entrega de contenido es aproximadamente el mismo. Después de recibir una solicitud para descargar un archivo, el servidor CDN lo toma una vez del servidor original y se lo entrega al usuario, al mismo tiempo que lo almacena en caché durante un período de tiempo determinado. Todas las solicitudes posteriores se responden desde el caché. Todos los CDN tienen opciones para precargar archivos, borrar el caché, configurar su período de retención y mucho más.

Sucede que, por una razón u otra, necesita organizar su propia red de entrega de contenido y luego, déjenos ayudarlo a construir otra bicicleta.


Fuente: vector de infografía creado por pikisuperstar - www.freepik.com


Cuando necesitas tu propia CDN


Considere los casos cuando comience su propio CDN tiene sentido:

  • cuando desea ahorrar dinero y los costos de funcionamiento incluso cuando se usan CDN de bajo costo como BunnyCDN son varios cientos de dólares al mes
  • si queremos obtener un caché permanente o un caché sin vecinos en el servidor y el canal
  • en la región que necesita, los servicios de CDN no tienen puntos de presencia
  • cualquier configuración especial de entrega de contenido requerida
  • queremos acelerar la entrega de contenido dinámico al acercarnos a los usuarios del servidor de producción
  • Existe la preocupación de que un servicio de CDN de terceros pueda recopilar o usar ilegalmente información sobre el comportamiento del usuario (hola a servicios sin cumplir con GDPR) o participar en otras acciones ilegales

En la mayoría de los otros casos, es más aconsejable utilizar soluciones ya existentes.


Lo que necesitas para correr


Es maravilloso si tienes tu propio sistema autónomo (AS). Con él, puede asignar la misma IP a varios servidores y seguir estas instrucciones a nivel de red para dirigir a los usuarios al más cercano. Vale la pena decir que incluso con el bloque de direcciones / 24, es posible construir una red de entrega de contenido. Algunos proveedores de servidores le permiten hacer un anuncio para su uso en todas las regiones disponibles para ellos.

Si no es un propietario feliz de un bloque de direcciones IP, para ejecutar un CDN simple necesitará:

  • . ,
  • geoDNS . , ,



Con el registro de dominio, todo es simple: regístrese en cualquier zona con cualquier registrador. También puede usar un subdominio para un CDN, como algo como cdn.namedomain.com . En realidad, en nuestro ejemplo, lo haremos.

En cuanto a los servidores de pedidos, deben alquilarse en las regiones y países donde se encuentra su audiencia de usuarios. Si el proyecto es intercontinental, es conveniente elegir proveedores de alojamiento que ofrezcan servidores en todo el mundo de inmediato. Ejemplos: OVH , Leaseweb y 100Tb para servidores dedicados, Vultr y DigitalOcean para nube virtual *.

Para nuestro CDN privado, pedimos 3 servidores virtuales en diferentes continentes. En vultren el servidor por $ 5 / mes obtenemos 25GB de espacio SSD y 1TB de tráfico . Al instalar, seleccione la última versión de Debian. Nuestros servidores:

Frankfurt , ip: 199.247.18.199

Chicago , ip: 149.28.121.123

Singapur , ip: 157.230.240.216

* Vultr y DigitalOcean prometen un préstamo de $ 100 a los usuarios registrados utilizando los enlaces en el artículo inmediatamente después de agregar un método de pago. El autor también recibe un pequeño cumplido de esto, que es muy significativo para él ahora. Por favor sea comprensivo.


Configurar geoDNS


Para que cuando un usuario acceda a un dominio o subdominio CDN, sea dirigido al servidor deseado (más cercano a él), necesitamos un servidor DNS con la función geoDNS.

El principio y el procedimiento de geoDNS es el siguiente:

  1. Define la IP del cliente que envió la solicitud DNS, o la IP del servidor DNS recursivo que se utiliza para procesar la solicitud del cliente. Estos servidores recursivos suelen ser proveedores de DNS.
  2. Por cliente IP conoce su país o región. Para esto, se utilizan bases GeoIP, de las cuales hay muchas hoy en día. Hay algunas buenas opciones gratuitas .
  3. Dependiendo de la ubicación del cliente, él le da la dirección IP del servidor CDN más cercano.

Usted mismo puede construir un servidor DNS con la función geoDNS , pero es mejor usar soluciones preparadas con una red de servidores DNS en todo el mundo y Anycast listo para usar :

  • louDNS desde $ 9.95 / mes , tarifa GeoDNS, por defecto hay una conmutación por error DNS
  • Zilore desde $ 25 / mes , DNS Failover habilitado
  • Amazon Route 53 desde $ 35 / mes por 50 millones de solicitudes geográficas netas. La conmutación por error de DNS se cobra por separado
  • DNS fácil desde $ 125 / mes , hay 10 DNS Failover
  • Cloudflare , función de dirección geográfica disponible en tarifas empresariales

Al ordenar geoDNS, debe prestar atención a la cantidad de solicitudes incluidas en la tarifa y tener en cuenta que la cantidad real de llamadas al dominio puede superar las expectativas varias veces. Millones de arañas, escáneres, spammers y otros espíritus malignos trabajan incansablemente.

Casi todos los servicios DNS incluyen un elemento indispensable para construir un servicio CDN: DNS Failover. Al usarlo, puede configurar el monitoreo de sus servidores y, en ausencia de signos de vida, reemplazar automáticamente la dirección del servidor que no funciona con un servidor de respaldo en las respuestas de DNS.

Para construir nuestro CDN, usaremos ClouDNS , la tarifa GeoDNS.

Agregue una nueva zona DNS en su cuenta, indicando su dominio. Si compilaremos el CDN en un subdominio y el dominio principal ya está en uso, inmediatamente después de agregar la zona, no olvide agregar los registros DNS de trabajo existentes. El siguiente paso es crear para el dominio / subdominio CDN varios registros A, cada uno de los cuales se aplicará a la región que establezcamos. Puede especificar continentes o países como regiones; las subregiones están disponibles para EE. UU. Y Canadá.

En nuestro caso, la CDN se elevará en el cdn.sayt.in subdominio . Agregando la zona sayt.in , cree el primer registro A para el subdominio y dirija toda América del Norte al servidor en Chicago:


Repita para otras regiones, recordando crear una entrada para las regiones predeterminadas. Aquí está el resultado:



El último registro predeterminado en la captura de pantalla significa que todas las regiones indeterminadas (y esto es Europa, África, usuarios de Internet satelital, etc.) se enviarán a un servidor en Frankfurt.

Esto completa la configuración básica de DNS. Queda por ir al sitio web del registrador de dominios y reemplazar los NS de dominio actuales con los emitidos por ClouDNS. Y aunque se actualizarán los NS, prepararemos el servidor.


Instalar certificados SSL


Nuestro CDN funcionará en HTTPS, por lo que si ya tiene certificados SSL para un dominio o subdominio, cárguelos en todos los servidores, por ejemplo, en el directorio / etc / ssl / yourdomain /.

Si no hay certificados, puede obtener uno gratis de Let's Encrypt. El script ACME Shell es perfecto para esto . El cliente es conveniente y fácil de configurar, y lo más importante: le permite validar el dominio / subdominio para DNS a través de la API desde ClouDNS.

Instalaremos acme.sh solo en uno de los servidores: el europeo 199.247.18.199, desde el cual se copiarán los certificados a todos los demás. Para instalar, haga:

root@cdn:~# wget -O - https://get.acme.sh | bash; source ~/.bashrc

Durante la instalación del script, se creará una tarea CRON para una mayor renovación de certificados sin nuestra participación.

La verificación del dominio al emitir un certificado se realizará utilizando DNS utilizando la API, por lo tanto, en la cuenta personal de ClouDNS en el menú de la API del distribuidor, debe crear una nueva API de usuario y establecer una contraseña para ella. El ID de autenticación resultante con la contraseña se escribe en el archivo ~ / .acme.sh / dnsapi / dns_cloudns.sh (no debe confundirse con el archivo dns_clou d dns.sh ). Aquí están las líneas para descomentar y editar:

CLOUDNS_AUTH_ID=<auth-id>
CLOUDNS_AUTH_PASSWORD="<>"

Ahora pedimos un certificado SSL para cdn.sayt.in

root@cdn:~# acme.sh --issue --dns dns_cloudns -d cdn.sayt.in --reloadcmd "service nginx reload"

En los parámetros para el futuro, especificamos un comando para volver a cargar automáticamente la configuración del servidor web después de cada renovación del período de validez del certificado en el futuro.

Todo el proceso de obtención de un certificado puede demorar hasta 2 minutos, no lo interrumpa. Si se produce un error de validación de dominio, intente ejecutar el comando nuevamente. Al final, veremos dónde se cargaron los certificados:



recuerde estas rutas, deberán especificarse al copiar el certificado en otros servidores, así como en la configuración del servidor web. No prestamos atención al error de volver a cargar los archivos de configuración de Nginx: en un servidor totalmente configurado no estará presente al renovar los certificados.

Todo lo que nos queda por SSL es copiar el certificado recibido en otros dos servidores guardando la ruta a los archivos. Cree los mismos directorios en cada uno de ellos y haga una copia:

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 la renovación del certificado sea regular, crearemos una tarea CRON diaria en ambos servidores con el comando:
scp -r root@199.247.18.199:/root/.acme.sh/cdn.sayt.in/* /root/.acme.sh/cdn.sayt.in/ && service nginx reload

En este caso, el acceso al servidor de origen remoto debe configurarse por clave , es decir sin ingresar una contraseña. No te olvides de hacerlo.


Instalar y configurar Nginx


Para devolver contenido estático, utilizaremos Nginx, configurado como un servidor proxy de almacenamiento en caché. Actualice la lista de paquetes e instálela en los tres servidores:

root@cdn:~# apt update
root@cdn:~# apt install nginx

En lugar del predeterminado, use la configuración del spoiler a continuación:
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;
    }
  }
}


En la configuración, edite:

  • max_size : el tamaño de la memoria caché no excede el espacio disponible en el disco
  • inactivo : tiempo de almacenamiento para datos en caché a los que nadie accedió
  • ssl_certificate y ssl_certificate_key : rutas de acceso al certificado SSL y archivos clave
  • proxy_cache_valid - tiempo de almacenamiento para datos en caché
  • proxy_pass : la dirección del servidor original desde el cual la CDN solicitará archivos para el almacenamiento en caché. En nuestro ejemplo, esto es sayt.in

Como puede ver, todo es simple. La complejidad solo puede surgir al configurar el tiempo de caché debido a la similitud de las directivas inactivas y proxy_cache_valid . Los analizaremos en nuestro ejemplo. Esto es lo que sucede con inactive = 7d y proxy_cache_valid 90d :

  • Si la solicitud no se repite dentro de los 7 días, los datos se eliminarán de la memoria caché después de este período
  • Si la solicitud se repite al menos una vez cada 7 días, los datos en la memoria caché se considerarán obsoletos después de 90 días y, en la próxima solicitud, Nginx la actualizará tomándola del servidor original.

Después de terminar de editar nginx.conf , vuelva a cargar la configuración:

root@cdn:~# service nginx reload

Nuestro CDN está completamente listo. Por $ 15 / mes obtuvimos puntos de presencia en tres continentes y 3 TB de tráfico: 1 TB en cada ubicación.


Comprobación del funcionamiento de CDN


Miremos los pings a nuestro CDN desde diferentes ubicaciones geográficas. Para esto, cualquier servicio de ping es adecuado.
Punto de lanzamientoAnfitriónIPTiempo promedio, ms
Alemania Berlíncdn.sayt.in199.247.18.1999.6
Países Bajos, Amsterdamcdn.sayt.in199.247.18.19910,1
Francia Pariscdn.sayt.in199.247.18.19916,3
Gran Bretaña, Londrescdn.sayt.in199.247.18.19914,9
Canadá Torontocdn.sayt.in149.28.121.12316,2
Estados Unidos, San Franciscocdn.sayt.in149.28.121.12352,7
Estados Unidos, Dallascdn.sayt.in149.28.121.12323,1
Estados Unidos, Chicagocdn.sayt.in149.28.121.1232.6
Estados Unidos, Nueva Yorkcdn.sayt.in149.28.121.12319,8
Singapurcdn.sayt.in157.230.240.2161.7
Japón Tokiocdn.sayt.in157.230.240.21674,8
Australia, Sydneycdn.sayt.in157.230.240.21695,9
Los resultados son buenos. Ahora colocaremos la imagen de prueba test.jpg en la raíz del sitio principal y verificaremos la velocidad de su descarga a través de CDN. Apenas dicho que hecho . El contenido se entrega rápidamente.

Escribiremos un pequeño script en caso de que queramos borrar el caché en el punto 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 eliminar todo el caché, simplemente ejecútelo, un archivo separado se puede limpiar así:

root@cdn:~# ./purge.sh /test.jpg


En lugar de conclusiones


Finalmente, quiero dar algunos consejos útiles para poder pasar inmediatamente por encima del rastrillo, lo que a la vez me hizo doler la cabeza:

  • Para aumentar la tolerancia a fallas de CDN, se recomienda configurar la conmutación por error de DNS, que ayuda a cambiar rápidamente un registro A en caso de falla del servidor. Esto se hace en el panel de control de los registros DNS del dominio.
  • CDN, . CDN, 6-7 : , (), (), , ,
  • CDN. , , -
  • , ,
  • Intente verificar pings desde diferentes lugares a sus servidores. Para que pueda ver las regiones más cercanas a los puntos CDN y configurar GeoDNS correctamente
  • Dependiendo de las tareas, no está fuera de lugar configurar Nginx para requisitos de almacenamiento en caché específicos y teniendo en cuenta la carga en el servidor. Los artículos sobre el caché Nginx - aquí y la aceleración del trabajo bajo cargas pesadas: aquí y aquí me ayudaron mucho.

All Articles