🌐 Как настроить NGINX в качестве CDN

by itisgood
Знаете ли вы, что с помощью NGINX можно создать собственную CDN?
В NGINX встроена возможность кэширования, которая может быть использована для кэширования статических файлов, включая видеофайлы.
Таким образом, если у вас есть сервер потокового вещания, вы можете использовать этот NGINX в качестве CDN для доступа некоторым клиентам, которые находятся далеко от вашего сервера потокового вещания.

Привилегии Sudo

Перед началом работы мы убедимся, что у нас не будет проблем с правами на установку и настройку.
Перейдите на свою виртуальную машину и введите следующую команду
sudo su

Установка NGINX из исходного кода

Чтобы установить NGINX в качестве CDN:

Конфигурация NGINX

Сначала создадим резервную копию конфигурации nginx

mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup
Создайте новый файл конфигурации NGINX
nano nginx.conf

Скопируйте и вставьте эту конфигурацию

user www-data;
worker_processes auto;
worker_rlimit_nofile 4096;
pid /run/nginx.pid;

events {
    worker_connections  4096;
    # multi_accept on;
}

http {
    # Basic Setings
    include mime.types;
    default_type application/octet-stream;
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    server_tokens off;
    keepalive_timeout 65;

    # Log Settings
    log_format video_log '$remote_addr - $remote_user [$time_local] "$request" '
                         '$status $body_bytes_sent "$http_referer" '
                         '"$http_user_agent" "$http_x_forwarded_for" '
                         'rt=$request_time '
                         'ua="$upstream_addr" us="$upstream_status" '
                         'ut="$upstream_response_time" ul="$upstream_response_length" '
                         'cs=$upstream_cache_status';
    access_log /var/log/nginx/access.log video_log;

    # SSL Settings if needed
    # ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
    # ssl_prefer_server_ciphers on;
    # ssl_ciphers 'kEECDH+ECDSA+AES128 kEECDH+ECDSA+AES256 kEECDH+AES128 kEECDH+AES256 kEDH+AES128 kEDH+AES256 DES-CBC3-SHA +SHA !aNULL !eNULL !LOW !kECDH !DSS !MD5 !RC4 !EXP !PSK !SRP !CAMELLIA !SEED';
    # add_header Strict-Transport-Security "max-age=31536000; preload" always;
    # ssl_session_cache shared:SSL:10m;
    # ssl_session_timeout 20m;
    # ssl_certificate /etc/ssl/cert_file.crt;
    # ssl_certificate_key /etc/ssl/key_file.key;
    # ssl_dhparam /etc/ssl/dhparam_file.pem;

    # Core Cache Setting
    proxy_cache_key $uri;
    proxy_cache_path /etc/nginx/cache levels=1:2 keys_zone=video_cache:10m max_size=10g
                     inactive=30d use_temp_path=off;

    # Server For VoD Caching
    server {
        listen 80; # or use 443 if you use SSL
        server_name your.domain.com;

        location / {
            # cache path
            proxy_cache video_cache;

            # server resends file only if the file changed
            proxy_cache_revalidate on;

            # use stale cache when updating on background
            proxy_cache_background_update on;
            proxy_cache_use_stale updating;

            # Only 1 request gets to the origin at a time
            proxy_cache_lock on;

            # Set caching time to any HTTP response
            proxy_cache_valid 200 7d;

            # ignore request header
            proxy_ignore_headers Cache-Control;
            proxy_ignore_headers Set-Cookie;
            proxy_ignore_headers Expires;

            # addcache status header
            add_header X-Cache-Status $upstream_cache_status;

            # Using HTTP 1.1 protocol
            proxy_http_version 1.1;
            proxy_set_header Conenction "";

            proxy_set_header Host $host;
            proxy_pass http://upstreamserver;
        }
    }
    
}

Обратите внимание, что я отметил несколько директив в конфигурации, они напрямую влияют на функциональность CDN. Давайте обсудим их по порядку.

1. Первая – это, конечно же, server_name. Она используется для задания вашего домена. Измените их так, чтобы они соответствовали вашему домену.

2. proxy_cache_key, эта директива задает ключ файла кэша, или просто имя файла кэша. Имя файла кэша является результатом применения шифрования MD5 к ключу кэша. Например, если мы зададим $uri в качестве ключа, а затем от пользователя поступит запрос с uri: /images/my-sweet-cat.jpg, имя файла кэша будет c223cd4fbcf6ae9c78ab4f6dabd0beab.

3. proxy_cache_path, эта директива задает путь, где хранятся файлы кэша, и несколько важных параметров кэша. уровни определяют систему папок. Например, мы задаем директиву следующим образом

proxy_cache_path /etc/nginx/cache levels=1:2

система папок кэша будет выглядеть следующим образом:

/etc/nginx/cache/b/ea/c223cd4fbcf6ae9c78ab4f6dabd0beab

Обратите внимание, что в папке будет 1 цифра (b), а затем 2 цифры (ea). keys_zone – это размер общей памяти, используемой для хранения кэш-ключа и его метаданных в определенной зоне.

1 м key_zone достаточно для хранения 8 тыс. ключей. max_size контролирует максимальный объем данных кэша, который может быть сохранен на сервере, поэтому всегда устанавливайте max_size меньше, чем объем хранилища вашей виртуальной машины.

параметр inactive устанавливает, через какое время кэш будет удален, если к нему не обращался пользователь.

Например, если мы установим inactive=30d, то кэш будет автоматически удален с сервера, если к файлу кэша не обращались в течение 30 дней.

4.  proxy_cache используется для присвоения идентификатора/имени и активации системы кэширования в определенном месте в конфигурации NGINX, чтобы соответствовать keys_zone в конфигурации proxy_cache_path. Обратите внимание, что proxy_cache video_cache соответствует keys_zone=video_cache:10m.

5. proxy_cache_revalidate включает повторную проверку элементов кэша с истекшим сроком хранения с помощью условных запросов с полями заголовков «If-Modified-Since» и «If-None-Match». Если кэш с истекшим сроком хранения все еще совпадает с версией upstream (на основе заголовка), CDN не будет загружать файл с сервера upstream, что повышает производительность CDN.

6. proxy_cache_background_update и proxy_cache_use_stale создадут фоновое задание в NGINX, чтобы обновить элемент кэша с истекшим сроком хранения, в то время как неактуальный кэшированный ответ будет возвращен клиенту, когда кэш все еще находится в состоянии обновления. Таким образом, клиенту не нужно ждать от вышестоящего сервера.

7. proxy_cache_lock минимизирует количество обращений к восходящему потоку за один раз. Только один запрос за раз будет допущен к заполнению нового кэша в соответствии с директивой proxy_cache_key.

8. proxy_cache_valid задает, сколько времени мы будем считать кэш действительным после запроса с сервера upstream. proxy_cache_valid 200 7d; означает, что мы будем кэшировать успешный запрос upstream (успех определяется HTTP-кодом 200) в течение 7 дней.

9. Последний, но не менее важный параметр proxy_pass определяет местоположение восходящего сервера или сервера, который мы хотим кэшировать. Вы можете изменить местоположение, чтобы оно соответствовало домену вашего сервера.

см. также:

Loading

You may also like

Leave a Comment