Назад | Перейти на главную страницу

Скорость загрузки дроссельной заслонки Nginx на основе файлов

Я использую nginx/1.11.11 скомпилирован из источника с модулем mp4, и я обслуживаю видеофайлы размером от 300 МБ до 8 ГБ.

Я подумываю реализовать систему дроссельной заслонки, похожую на привод Google. Если размер файла большой, установите больше limit_rate а если размер файла небольшой, установите меньший limit_rate. Проблема в том, что я не могу найти способ узнать размер обслуживаемого файла.

Мой default.conf файл выглядит так:

server {
    listen       80;
    server_name  _; # change this for your server
    root /var/www;
    index index.php;
    client_max_body_size 5G;
    proxy_read_timeout 60000000;

    # handle requests to the API
    location ~ /api/v2/(.+)$ {
        if (!-e $request_filename) { rewrite ^/api/v2/(.*) /api/v2/index.php?_page_url=$1 last; }
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param MOD_X_ACCEL_REDIRECT_ENABLED on;
        fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    location ~ \.php$ {
        if (!-e $request_filename) { rewrite ^/(.*) /index.php?_page_url=$1 last; }
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_read_timeout 180000000;
        fastcgi_param MOD_X_ACCEL_REDIRECT_ENABLED on;
        fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

    location / {
        if (!-e $request_filename) {
                rewrite ^/(.*) /index.php?_page_url=$1 last;
        }
    }
    location /files/ {
        root /var/www;
        aio threads;
        internal;
        mp4;
        limit_rate_after 5m;
        limit_rate 400k;
    }

    # these locations would be hidden by .htaccess normally
    location /core/logs/ {
        deny all;
    }

Nginx также имеет limit_rate_after размер: "Устанавливает начальную сумму, после которой дальнейшая передача ответа клиенту будет ограничена по скорости."

Проблема в том, что я не могу найти способ узнать размер обслуживаемого файла.

Вы можете попробовать использовать скрипт LUA, чтобы узнать размер файла.

Взгляни на открытость проект.

Документы: https://github.com/openresty/lua-nginx-module

Есть связанный модуль openresty для настройки nginx через lua: https://github.com/fanhattan/lua-resty-rate-limit

Вы можете попробовать реализовать аналогичный модуль для вашего случая.