• 利用神器Nginx + X-Accel,实现PHP大文件下载统计、权限判断、速度限制


    效果图

     

    本地域名 http://suibian.com
    项目目录 /var/www/suibian.com/

    下载地址 http://suibian.com/download.php?path=/apk/shop.apk
    指向文件 /var/www/myfiles/apk/shop.apk (项目目录以外)
    Nginx的X-Accel别名路径  /var/www/myfiles/

    实现功能 下载次数统计、IP记录、IP过滤、下载文件

     

    多种方案对比

    PHP提供大文件下载控制、统计的办法有以下几个:

    1)直连型
    例如https://xxx.com/file/shop.apk 
    缺点:任何人都可以下载,无法直接统计(除非PHP去读nginx的access日志,捡垃圾一样)和过滤
    优点:无脑操作

    2)苦力型
    后端PHP统计、过滤以后,直接file_get_contents读取文件内容,设置header后疯狂输出
    缺点:遇到大文件时就歇菜,半天传不完,还占着nginx服务器的连接池,后面堵车严重
    优点:控制一流

    3)智取型 (本文重点)
    后端PHP判断与过滤,再发出指令给web服务器来传输静态文件
    PHP + nginx(配合X-Accel-Redirect机制) 
    缺点:需要nginx配置权限,另外PHP无法知道传完了没有,没有后续操作空间
    优点:传输快,服务器IO低,PHP不会崩溃

    主要步骤

    1. 启用nginx的x-accel
    2. 用户访问php脚本
    3. 各种过滤、统计
    4. php使用header("X-Accel-Redirect:  /file/$fileName");唤起nginx
    5. nginx接力提供文件传输

    详细步骤

    1. Nginx配置某个站点
    在server {}里面添加:

    location /xyz {
        internal;
        alias /var/www/myfiles;
    }

    其中别名xyz可以自定义,到时php脚本需要用一样的别名;
    alias是这个别名指向的本地文件夹

    2.重启nginx
    3.创建php下载脚本 http://suibian.com/download.php

    1. // 机制配置(仅限当前站点)
    2. $nginx_x_accel_key = 'xyz';
    3. // 获取下载文件的相对路径
    4. if (!isset($_GET['path'])) {
    5. die('缺少参数path');
    6. }
    7. $file_path = $_GET['path']; // 相对路径,从nginx的internal的自定义别名xyz的路径开始
    8. $file_name = $file_path; // 文件名
    9. if (stripos($file_path, '\\') !== false) {
    10. $parts = explode('\\', $file_path);
    11. $file_name = array_pop($parts);
    12. }
    13. if (stripos($file_path, '/') !== false) {
    14. $parts = explode('/', $file_path);
    15. $file_name = array_pop($parts);
    16. }
    17. // 下载统计
    18. $theData = array(
    19. 'access_time' => time(), // 时间戳
    20. 'access_date' => date("Y-m-d H:i:s", time()), // 日期
    21. 'access_url' => $_SERVER['REQUEST_URI'], // 当前访问网址
    22. 'referer_url' => $_SERVER['HTTP_REFERER'], // HTTP来源地址(可伪造)
    23. 'ip_address' => $_SERVER['REMOTE_ADDR'] // 客户IP地址
    24. );
    25. //print_r($theData);die();
    26. // Array
    27. // (
    28. // [access_time] => 1659420862
    29. // [access_date] => 2022-08-02 06:16:50
    30. // [access_url] => /download.php?path=/onedir/shop.apk
    31. // [referer_url] => http://suibian.com/
    32. // [ip_address] => 180.149.130.16
    33. // )
    34. // 各种过滤
    35. // ... ip黑名单
    36. // ... referer域名限制
    37. // ... 同IP一小时以内的下载次数 ...
    38. // ...
    39. // 各种统计操作
    40. // ...
    41. // ...
    42. // 是否使用Nginx缓存,默认yes
    43. header("X-Accel-Buffering", "yes");
    44. // 下载限速 - 字节 - 1024 字节 = 1 千字节(KB)
    45. header("X-Accel-Limit-Rate", 1024*1024);
    46. // 逻辑处理完毕,允许下载 --- 记得header前不要有任何的输出!
    47. header('Content-type: application/octet-stream');
    48. header("Content-Disposition: attachment; filename=" . $file_name);
    49. header("X-Accel-Redirect: " . "/{$nginx_x_accel_key}/" . $file_path);

    4.ok!访问一下即可下载,可以修改php脚本进行下载统计、各种过滤,限速等限制

     


    X-accel官网介绍

    https://www.nginx.com/resources/wiki/start/topics/examples/x-accel/

    P.s.

    PHP的统计访问自己补充吧


    相关:

    PHP如何实现静态文件下载的权限控制
    php控制文件下载速度的方法
    php – 控制对可供下载的文件的访问
    PHP 利用nginx的X-sendfile控制下载,提高下载效率

    推荐

    无广告的绿色版百度首页,手机效果棒棒滴~ 

    baidu.rudon.cn

     

     


     

  • 相关阅读:
    【K8S系列】深入解析k8s 网络插件—Antrea
    HTTPS 协议的加密
    阿里国际、ebay测评自养号,如何看待自己产品的销量?
    为什么建议游戏工作室使用海外住宅IP防封?
    【业务功能篇92】微服务-springcloud-多线程-异步处理-异步编排-CompletableFutrue
    Kubernetes之kubectl命令详解
    vue3 项目搭建教程整理
    代码随想录笔记_动态规划_474一和零
    QtC++与QCheckBox详解
    [X3m]ros交叉编译
  • 原文地址:https://blog.csdn.net/qq285744011/article/details/126122565