利用神器Nginx + X-Accel,实现PHP大文件下载统计权限判断速度限制
Posted Rudon滨海渔村
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用神器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不会崩溃
主要步骤
- 启用nginx的x-accel
- 用户访问php脚本
- 各种过滤、统计
- php使用header("X-Accel-Redirect: /file/$fileName");唤起nginx
- nginx接力提供文件传输
详细步骤
1. Nginx配置某个站点
在server 里面添加:
location /xyz
internal;
alias /var/www/myfiles;
其中别名xyz可以自定义,到时php脚本需要用一样的别名;
alias是这个别名指向的本地文件夹
2.重启nginx
3.创建php下载脚本 http://suibian.com/download.php
<?php
// 机制配置(仅限当前站点)
$nginx_x_accel_key = 'xyz';
// 获取下载文件的相对路径
if (!isset($_GET['path']))
die('缺少参数path');
$file_path = $_GET['path']; // 相对路径,从nginx的internal的自定义别名xyz的路径开始
$file_name = $file_path; // 文件名
if (stripos($file_path, '\\\\') !== false)
$parts = explode('\\\\', $file_path);
$file_name = array_pop($parts);
if (stripos($file_path, '/') !== false)
$parts = explode('/', $file_path);
$file_name = array_pop($parts);
// 下载统计
$theData = array(
'access_time' => time(), // 时间戳
'access_date' => date("Y-m-d H:i:s", time()), // 日期
'access_url' => $_SERVER['REQUEST_URI'], // 当前访问网址
'referer_url' => $_SERVER['HTTP_REFERER'], // HTTP来源地址(可伪造)
'ip_address' => $_SERVER['REMOTE_ADDR'] // 客户IP地址
);
//print_r($theData);die();
// Array
// (
// [access_time] => 1659420862
// [access_date] => 2022-08-02 06:16:50
// [access_url] => /download.php?path=/onedir/shop.apk
// [referer_url] => http://suibian.com/
// [ip_address] => 180.149.130.16
// )
// 各种过滤
// ... ip黑名单
// ... referer域名限制
// ... 同IP一小时以内的下载次数 ...
// ...
// 各种统计操作
// ...
// ...
// 是否使用Nginx缓存,默认yes
header("X-Accel-Buffering", "yes");
// 下载限速 - 字节 - 1024 字节 = 1 千字节(KB)
header("X-Accel-Limit-Rate", 1024*1024);
// 逻辑处理完毕,允许下载 --- 记得header前不要有任何的输出!
header('Content-type: application/octet-stream');
header("Content-Disposition: attachment; filename=" . $file_name);
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控制下载,提高下载效率
推荐
无广告的绿色版百度首页,手机效果棒棒滴~
以上是关于利用神器Nginx + X-Accel,实现PHP大文件下载统计权限判断速度限制的主要内容,如果未能解决你的问题,请参考以下文章