nginx之如何通知资源是否在 nginx 中完全下载

powertoolsteam 阅读:30 2024-02-27 23:08:18 评论:0

我需要了解从服务器完全下载资源的信息。我的服务器配置了 NginX 网络服务器,当且仅当资源被用户完全下载时,我想做一些事情。

请您参考如下方法:

如果您使用 Nginx 处理文件下载(使用 XSendfile),您应该在 Nginx 配置(在“服务器” block 中)的下载处理 block 中添加特定的 access_log block 。应该是这样的:

location /download_music/ { 
            internal; 
            root /usr/share/nginx/MY_SITE/media/music; 
            access_log /var/log/nginx/download.MY_SITE.log download; 
    } 

access_log 行末尾的“下载”一词实际上是一种日志格式,您应该将其添加到“http” block 中的 nginx 主配置文件(/etc/nginx/nginx.conf)中。可能是这样的:

http { 
    ... 
 
    log_format download '{ "remote_addr" : "$remote_addr", "time":"$time_local", "request":"$request", ' 
                  '"traffic":$body_bytes_sent, "x_forwarded_for":"$http_x_forwarded_for" }'; 
 
    ... 
} 

您可以将此格式更改为您想要的格式(稍后您将在脚本中使用它)。如果您监视此日志文件(使用“tail -f/var/log/nginx/download.MY_SITE.log”),您将看到任何时候暂停或完成下载,都会在此文件中添加一行日志。 下一步是使用 rsyslog 以及“imfile”和“omprog”模块。您应该在 rsyslog 的配置文件(/etc/rsyslog.conf)的末尾添加这些配置:

$ModLoad imfile 
$InputFileName /var/log/nginx/download.MY_SITE.log 
$InputFileTag nginx-access 
$InputFileStateFile state-nginx-access 
$InputFileSeverity info 
$InputFileFacility local3 
$InputFilePollInterval 1 
$InputRunFileMonitor 
 
$ModLoad omprog 
$actionomprogbinary /usr/share/nginx/MY_SITE/scripts/download.py 
$template LogZillaDbInsert,"%hostname:::lowercase%\9%pri%\9%programname%\9%msg%\n" 
local3.* :omprog:;RSYSLOG_TraditionalFileFormat 

注意这一行:

/usr/share/nginx/MY_SITE/scripts/download.py 

这是每次将日志条目添加到日志文件时都会调用的脚本的地址,并且整个日志条目将在此脚本中可用(在 Python 代码中):

line = sys.stdin.readline() 

然后您可以解析该行并找到您记录的任何内容,包括下载的文件大小(在每个暂停/完成事件上)。现在,您可以简单地在下载 URL 中包含文件大小并在此脚本中检索它,并将其与下载的字节进行比较。如果这两个数字相等,则表示下载已成功完成。此外,您可以在此脚本中执行任何其他操作(例如,使下载链接失效、增加 DB 上的下载次数……)


标签:nginx
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号