En esta publicación que lanzo por aquí, cacharreando en un laboratorio me encuentro con la necesidad de montar un “mini-cdn” y reitero «a lo pobre» 🙂 ,para entregar contenido de tipo streaming a dos partes del mundo EEUU, y Europa.
Esto viene a raíz de un problemilla que tenia un compi… donde el streaming en 1080p, y algo de 4K no iba muy fino, en la actualidad solo hacia uso de un proxy inverso en una nube.. y el contenido se lo traía de otro server, hasta aquí todo bien salvo cuando tienes que entregar este contenido en diferentes zonas del mundo, donde la latencia poco a poco no es el mayor de los problemas en la gran mayoría de veces, pero la estabilidad de la red… pues eso… de fina tiene poco dependiendo de la ubicación donde este el palomo. Y eso que estamos hablando de dos territorios que mas o menos… van finos y estables en cuanto a las rutas, otra cosa ya es conectarte desde la zona APAC (jeje), not comments 🙂
Por tanto la única solución es montar un CDN a lo pobre jaja, (alguno pensara tíraselo al Cloudlflare, BunnyCDN (si sobre todo es dar servicio en la zona APAC, Fastly,…) el primero si nos vamos a la Free-Tier (estaríamos violando su política indicado claramente en su TOS, con lo que caria un ban en pocas horas, aunque ciertamente dudo de como aplican esto… dado que hay «webs» que usan mucho este tipo de servicio…), y los demás mu caros…
Solución!!
La solución pasa por montar 2 VMs con dos Nginx en mi caso, actuando de Proxy Inverso, uno en EEUU y otro en Europa, aquí personalmente para este tipo de entorno uso Hetzner, donde pillamos las más básicas con un limite mensual de 20Tb de salida, lo cual es mas que suficiente, claro esta que iría mas rápido y estable via VPC, pero en este caso no dispone de VPC Global, solo tiene de region, para esto nos tendríamos que ir a AWS, Linode, Google.. etc, pero no hay charrasca…
No obstante el peering entre ambos Datacenters es muy estable y va muy fino, aun sin ser una VPC.
Y todo esto junto al servicio de AWS Route 53 le aplicaremos una política de routing a las consultas DNS, que nos redirigen a cada uno de los proxies dependiendo de la latencia y por ende, la cercanía al servidor 🙂
Breve funcionamiento del sistema

Empezamos pues:
1·) Alta de IAM (Creación de la politica)
Nos vamos a IAM, políticas y por ultimo la creamos (JSON)
{
"Version": "2012-10-17",
"Id": "certbot-dns-route53 sample policy",
"Statement": [
{
"Effect": "Allow",
"Action": [
"route53:ListHostedZones",
"route53:GetChange"
],
"Resource": [
"*"
]
},
{
"Effect" : "Allow",
"Action" : [
"route53:ChangeResourceRecordSets"
],
"Resource" : [
"arn:aws:route53:::hostedzone/<Aqui el id de la zona alojada>"
]
}
]
}
2·) Alta de IAM (Creación del usuario)
Nos creamos un usuario en el IAM, y únicamente le vinculamos la política anteriormente creada. Una vez hallamos echo esto, lo único que tenemos que hacer es generar nuestras claves de acceso.
3·) Creación de la zona delegada, creación de registros y aplicación del routing
3.1·) Configuración de Route 53 (Creación de zona alojada)


Vale con esto ya generado nos vamos a nuestro proveedor DNS (en mi caso Cloudflare), este proveedor si admite la delegación de subdominios, aquí cada uno tendría que consultar o ver si tiene posibilidad.
Básicamente lo que tenemos que hacer es irnos al panel DNS de cloudflare, y ponernos a dar de alta los NS que nos proporciona Route53…

3.2·) Creación de registros
Crearemos dos registros A, uno en cada zona, en mi caso en FrankFurt y el otro en el Norte de Virginia.
Importante… y por aclarar… el registro A que corresponde a Europa indicaremos la IP del VPS de Europa y el de EEUU indicaremos la IP del VPS de EEUU, pero ambos nombres del registro A, han de ser idénticos.

Por tanto nos llegados a este punto estaríamos así:
asxc.occ.syshelp.me
: El dominio principal, y al cual tenemos apuntando con un registro a cada VPS, y con nuestra maravillosa politica de Routing basada en latencia.asxc-us.occ.syshelp.me
: Registro A estatico a la maquinuca de EEUUasxc-eu.occ.syshelp.me
: Registro A estatico a la maquinuca de Europaasxc-eu-origin.occ.syshelp.me
: «EL ORIGEN» 🙂
3.3·) Configuración y emisión de los certis (Cerbot… «cuanto bien has echo…»)
3.3.1 Abrimos una consolilla y a picar :) (Este proceso le repetimos en ambas VMs)
sudo apt update
sudo apt install certbot python3-certbot-dns-route53 nginx
**Nos copiamos las credenciales a un lugar seguro
/XXXXXXX/.aws/credentials
[default]
aws_access_key_id = Axxxxxxxxxxxxxxx
aws_secret_access_key = 5xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
3.3.2 Emision del certificado principal
(En ambas maquinas)
certbot certonly --dns-route53 -d asxc.occ.syshelp.me
**Si todo va bien... pues eso habra creado el registro DNS para la validacion, y todo estara ok :)
3.3.3 Emision del certificado VM EUropa (VPS Europa)
certbot certonly --dns-route53 -d asxc-eu.occ.syshelp.me
3.3.3.1 Configuracion NGINX Europa (Aqui tenemos dos configs)
Nos creamos un site ej: asxc.occ.syshelp.me.conf
server {
server_name asxc.occ.syshelp.me;
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/asxc.occ.syshelp.me/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/asxc.occ.syshelp.me/privkey.pem;
gzip on;
gzip_vary on;
gzip_min_length 1000;
gzip_proxied any;
gzip_types text/plain text/css text/xml application/xml text/javascript application/x-javascript image/svg+xml;
gzip_disable "MSIE [1-6]\.";
# Si veis que el contenido a enviar pesa.. pues tocara aumentar
client_max_body_size 100M;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Sec-WebSocket-Extensions $http_sec_websocket_extensions;
proxy_set_header Sec-WebSocket-Key $http_sec_websocket_key;
proxy_set_header Sec-WebSocket-Version $http_sec_websocket_version;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Accept-Encoding "";
# Buffer quitado, le enviamos al palomo el contenido tan pronto lo pida.
proxy_redirect off;
proxy_buffering off;
location / {
proxy_pass https://asxc-eu-origin.occ.syshelp.me;
}
}
server {
if ($host = asxc.occ.syshelp.me) {
return 301 https://$host$request_uri;
}
listen 80 ;
server_name asxc.occ.syshelp.me;
return 404;
}
3.3.4 Emisión del certificado VM EEUU (VPS EEUU)
certbot certonly --dns-route53 -d asxc-us.occ.syshelp.me
3.3.4.1 Configuración NGINX EUROPA
**Esta config será la utilizada por el VPS de EEUU para poder conectarse al servidor de Europa, y poder de esta manera traerse el contenido.
Nos creamos un site ej: asxc-eu.occ.syshelp.me.conf
server {
server_name asxc-eu.occ.syshelp.me;
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/asxc-eu.occ.syshelp.me/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/asxc-eu.occ.syshelp.me/privkey.pem;
gzip on;
gzip_vary on;
gzip_min_length 1000;
gzip_proxied any;
gzip_types text/plain text/css text/xml application/xml text/javascript application/x-javascript image/svg+xml;
gzip_disable "MSIE [1-6]\.";
client_max_body_size 100M;
proxy_set_header X-Real-IP $remote_addr;
# When using ngx_http_realip_module change $proxy_add_x_forwarded_for to '$http_x_forwarded_for,$realip_remote_addr'
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Sec-WebSocket-Extensions $http_sec_websocket_extensions;
proxy_set_header Sec-WebSocket-Key $http_sec_websocket_key;
proxy_set_header Sec-WebSocket-Version $http_sec_websocket_version;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Accept-Encoding "";
proxy_redirect off;
proxy_buffering off;
location / {
proxy_pass https://asxc-eu-origin.occ.syshelp.me;
}
}
3.3.4.2 Configuración NGINX EEUU
server {
server_name asxc.occ.syshelp.me;
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/asxc.occ.syshelp.me/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/asxc.occ.syshelp.me/privkey.pem;
gzip on;
gzip_vary on;
gzip_min_length 1000;
gzip_proxied any;
gzip_types text/plain text/css text/xml application/xml text/javascript application/x-javascript image/svg+xml;
gzip_disable "MSIE [1-6]\.";
client_max_body_size 100M;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Sec-WebSocket-Extensions $http_sec_websocket_extensions;
proxy_set_header Sec-WebSocket-Key $http_sec_websocket_key;
proxy_set_header Sec-WebSocket-Version $http_sec_websocket_version;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Accept-Encoding "";
proxy_redirect off;
proxy_buffering off;
location / {
proxy_pass https://asxc-eu.occ.syshelp.me;
}
}
server {
if ($host = asxc.occ.syshelp.me) {
return 301 https://$host$request_uri;
}
listen 80 ;
server_name asxc.occ.syshelp.me;
return 404;
}
Y con esto a funcionar…