Utilizaremos BackBlaze y explicaremos cómo configurar Nginx como un Proxy Caché, optimizando así la latencia y reduciendo los costos asociados.


Tras migrar el nodo de Mastodon, fue necesario reconfigurar Nginx Proxy para que respondiera con un dominio propio en lugar de la URL predeterminada del dominio proporcionado por el servicio S3. En este caso, utilizaremos BackBlaze y explicaremos cómo configurar Nginx como un Proxy Caché, optimizando así la latencia y reduciendo los costos asociados.

Configuración de Nginx

Como se menciona en la documentación oficial de Mastodon, se recomienda encarecidamente configurar un proxy local en el servidor para almacenar en caché los medios solicitados desde el bucket en tu servidor. Si cada solicitud se dirigiera directamente al bucket, el medidor de tráfico podría aumentar rápidamente, generando más costes de los necesarios.

A continuación, nuestro la configuración del archivo /etc/nginx/sites-available/media.conf:

proxy_cache_path /cache levels=1:2 keys_zone=MEDIA_CACHE:10m max_size=10g inactive=36h use_temp_path=off;

server {
    listen 443 ssl;
    server_name [DOMAIN];

    access_log /var/log/nginx/mstdn-media-access.log;
    error_log /var/log/nginx/mstdn-media-error.log;

    ssl_certificate /etc/letsencrypt/live/[DOMAIN]/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/[DOMAIN]/privkey.pem;

    keepalive_timeout 30;
    client_max_body_size 100M;
    location = / {
        index index.html;
    }

    location ~ /.well-known {
        allow all;
    }

    location / {
        try_files $uri @s3;
    }

    set $s3_hostname "s3.us-west-004.backblazeb2.com";
    set $s3_backend 'https://$s3_hostname';
    set $s3_bucket "[BUCKET]";
  
    location @s3 {
        limit_except GET {
           deny all;
        }

        resolver 8.8.8.8 ipv6=off;
    
        proxy_set_header Connection '';
        proxy_set_header Authorization '';

        proxy_hide_header Set-Cookie;
        proxy_hide_header 'Access-Control-Allow-Origin';
        proxy_hide_header 'Access-Control-Allow-Methods';
        proxy_hide_header 'Access-Control-Allow-Headers';
        proxy_hide_header x-amz-id-2;
        proxy_hide_header x-amz-request-id;
        proxy_hide_header x-amz-meta-server-side-encryption;
        proxy_hide_header x-amz-server-side-encryption;
        proxy_hide_header x-amz-bucket-region;
        proxy_hide_header x-amzn-requestid;
        proxy_ignore_headers Set-Cookie;
        proxy_ssl_server_name on;
        proxy_pass $s3_backend/$s3_bucket$uri;
        proxy_intercept_errors off;

        proxy_cache MEDIA_CACHE;
        proxy_cache_valid 200 5d;
        proxy_cache_valid 403 15m;
        proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
        proxy_cache_lock on;

        expires 1y;
        add_header Cache-Control public;
        add_header 'Access-Control-Allow-Origin'  '*';
        add_header 'Access-Control-Allow-Methods' 'GET';
        add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
        add_header X-Cache-Status $upstream_cache_status;
    }
}

server {
    if ($host = [DOMAIN]) {
        return 301 https://$host$request_uri;
    }

    listen 80;
    server_name [DOMAIN];
    return 404;
}
💡
En el fichero de configuración deberemos de cambiar [DOMAIN] con el subdominio que hemos seleccionaro (que puede ser media. o files.).

En el fichero de configuración también hay tres variables importantes que modificar:

    set $s3_hostname "s3.us-west-004.backblazeb2.com";
    set $s3_backend 'https://$s3_hostname';
    set $s3_bucket "[BUCKET]";
  • s3_hostname: Aquí tendremos que poner el hostname que hemos configurado en la variable S3_HOSTNAME de .env.production de Mastodon y que nos lo ofrece en la web de BackBlaze.
  • s3_backend: esta variable no la deberemos de modificar.
  • s3_bucket: Tendremos que poner el nombre del bucket en BackBlaze.

Deberemos de guardar la configuración y si es necesario, generar el certificado SSL, para ello puedes seguir estas instrucciones:

Cómo utilizar Certbot para configurar un SSL de Let’s Encrypt en GNU/Linux
Certbot es una maravillosa herramienta que puedes utilizar para generar un certificado SSL con Let’s Encrypt e instalarlo y configurar automáticamente en tu servidor web.

Recargamos la configuración de Nginx:

systemctl reload nginx

Aquí podemos probar que funciona correctamente, si cogemos una URL completa de algún avatar o header y cambiamos la URL de BackBlaze por la del proxy que hemos configurado.

Finalmente, para activar el Proxy en la configuración de Mastodon, tendremos que editar .env.production y añadir la variable S3_ALIAS_HOST. A continuación la configuración completa para el S3 (ofuscando información sensible):

# File storage (optional)
# -----------------------
S3_ENABLED=true
S3_PROTOCOL=https
S3_ENDPOINT=https://s3.us-west-004.backblazeb2.com
S3_HOSTNAME=s3.us-west-004.backblazeb2.com
S3_ALIAS_HOST=[dominio]
S3_BUCKET=[bucket]
AWS_ACCESS_KEY_ID=*****************
AWS_SECRET_ACCESS_KEY=*****************
S3_OPEN_TIMEOUT=15
S3_READ_TIMEOUT=15
S3_DISABLE_CHECKSUM_MODE=true

Tras este cambio, tendremos que reiniciar los servicios de Mastodon:

systemctl restart mastodon-*.service

Y con esto, deberemos de revisar que las imágenes de nuestra instancia carga correctamente con el subdominio que hemos configurado.


Más sobre ./voidNull

Haz que cada palabra cuente: tu donación nos inspira a seguir creando contenido. Accede al apartado de Donación para hacer tu aportación