Настройка nginx для отдачи больших файлов.

iccup
На сайте с 01.05.2016
Offline
171
163
Есть файлы размером до 200Мб на сервере которые скачиваются юзерами незатейливым скриптом
<?php
 
$dir=$_SERVER['DOCUMENT_ROOT'];
$_GET['f'] = isset($_GET['f']) ? trim(preg_replace("/[^0-9A-Za-z\.\-\_]/","",$_GET['f'])) : die('404');
$file=$dir.'/papka/videos/'.urldecode($_GET['f']);

download($file);
 
function download($file){
 if (file_exists($file)) {
 
 if (ob_get_level()) {
 ob_end_clean();
 }

$extension = pathinfo($file, PATHINFO_EXTENSION);

$new_name = uniqid().'.'.$extension;

 header('Content-Description: File Transfer');
 header('Content-Type: application/octet-stream');
 header('Content-Disposition: attachment; filename=' .$new_name);
 header('Content-Transfer-Encoding: binary');
 header('Expires: 0');
 header('Cache-Control: must-revalidate');
 header('Pragma: public');
 header('Content-Length: ' . filesize($file));
 readfile($file);
 exit;
 }
 else{
 
 echo 'Can\'t find the file: '.$file;
 }
}

?>

Но есть проблема, некоторые юзеры жалуются что у них не получается скачать (или докачать) файлы. Вероятно идет обрыв из-за плохого интернет соединения. Как бы так настроить nginx, чтобы он учитывал такие нюансы?

user  apache;
worker_processes  4;
worker_rlimit_nofile 16384;
error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  2048;
}


http {
map_hash_bucket_size 10000;
map_hash_max_size 10000;
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

log_format  main  '"$http_x_gt_clientip" - $remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;
sendfile        on;
keepalive_timeout               120;
        keepalive_requests              1000;
        reset_timedout_connection       on;
                client_body_timeout 120;
        tcp_nodelay                     on;
        tcp_nopush                      on;
        send_timeout                    2;
        server_tokens                   off;
        client_body_buffer_size         128k;
      server_names_hash_bucket_size  128;
        types_hash_max_size             2048;
        proxy_buffering                 on; 
        #proxy_buffer_size              512k;
        #proxy_buffers                  32 512k;
                
                proxy_buffers 8 2m;
proxy_buffer_size 10m;
proxy_busy_buffers_size 10m;
        proxy_max_temp_file_size        0;

        proxy_read_timeout              800;
        proxy_connect_timeout           800;
        proxy_send_timeout              800;
        fastcgi_send_timeout           1200;
        fastcgi_read_timeout           1200;

        proxy_cache_valid               10m;
        proxy_cache_key $scheme$proxy_host$request_uri$cookie_US;
        proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=cache:128m inactive=60m max_size=3048m;

        open_file_cache max=200000 inactive=20s;
        open_file_cache_valid           60s;
        open_file_cache_min_uses        2;
        open_file_cache_errors          on;

        gzip                            on;
        gzip_comp_level                 9;
        gzip_min_length                 1000;
        gzip_proxied                    any;
        gzip_vary                       on;
        gzip_static                     on;
        gzip_types
    text/xml application/xml application/atom+xml application/rss+xml application/ xhtml+xml image/svg+xml
    text/javascript application/javascript application/x-javascript
    text/x-json application/json application/x-web-app-manifest+json
    text/css text/plain text/x-component image/jpeg image/gif image/png video/mp4
    video/x-flv application/x-shockwave-flash image/jpg
    font/opentype application/x-font-ttf application/vnd.ms-fontobject
    image/x-icon;
        gzip_disable                    "msie6";
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 104.16.0.0/13;
set_real_ip_from 104.24.0.0/14;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 131.0.72.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2c0f:f248::/32;
set_real_ip_from 2a06:98c0::/29;

    include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/vhosts/*/*.conf;
server {
        server_name localhost;
 disable_symlinks if_not_owner;
        listen 80;
        listen [::]:80;
        include /etc/nginx/vhosts-includes/*.conf;
        location @fallback {
                error_log /dev/null crit;
                proxy_pass http://127.0.0.1:8080;
                proxy_redirect http://127.0.0.1:8080 /;
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                access_log off ;
        }
        proxy_connect_timeout       1000;
    proxy_send_timeout          1000;
    proxy_read_timeout          1000;
    send_timeout                1000;
    }
        client_max_body_size 256m;
...


kimsufi.com ( https://www.kimsufi.com ) очень дешевые и качественные дедики https://clck.ru/gvF9p - антибот, использую уже 3 года.
W1
На сайте с 22.01.2021
Offline
191
#1
iccup :
скачиваются юзерами незатейливым скриптом

А у файлов какие-то специфические расширения что ли? Зачем эти пляски с чтением файла php-скриптом?

iccup :
Вероятно идет обрыв из-за плохого интернет соединения.

Время работы php-скрипта ограничено?

Мой форум - https://webinfo.guru –Там я всегда на связи
iccup
На сайте с 01.05.2016
Offline
171
#2
webinfo #:

А у файлов какие-то специфические расширения что ли? Зачем эти пляски с чтением файла php-скриптом?

Время работы php-скрипта ограничено?

max_execution_time 300

lutskboy
На сайте с 22.11.2013
Offline
141
#3
nginx и сам может отдавать файлы. и докачка будет
LEOnidUKG
На сайте с 25.11.2006
Offline
1685
#4

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

ИЛИ

Создавать ярлыки системные на эти файлы и через них делать скачивание.

Сейчас же каждый файл проходит перегонку в память через PHP. Для раздачи больших файлов это просто не подходит т.к. память может закончится при большом количестве скачиваний. Или PHP просто умрёт т.к. люди могут и час качать, тут 300 секунд маловато будет.

Ещё можно сделать просто тупо редирект на скачивания файла, некая мини-защита, чтобы не тянули сразу прямые ссылки.

✅ Трастовых площадок под размещение статей и ссылок. Опыт 15 лет! ( https://searchengines.guru/ru/forum/675690 ) ⭐ Купить вечные трастовые ссылки для сайта ( https://getmanylinks.ru/?srh ) ⭐ Новый аналог AllSubbmitter (заполнение форм) https://getmanylinks.ru/getmanysubmits.html (Бесплатное демо)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий