如果资源完全下载到 nginx 中,如何通知
How to notify if a resource completely download in nginx
我需要了解如何从服务器完全下载资源。我的服务器配置了 NginX
网络服务器,当且仅当资源完全由用户下载时,我想做一些事情。
如果您使用 Nginx 来处理文件下载(使用 XSendfile),您应该在 Nginx 配置中(在您的 "server" 块中)向您的下载处理块添加一个特定的 access_log 块.它会是这样的:
location /download_music/ {
internal;
root /usr/share/nginx/MY_SITE/media/music;
access_log /var/log/nginx/download.MY_SITE.log download;
}
access_log行末尾的"download"实际上是一种日志格式,您应该将其添加到nginx主配置文件(/etc/nginx/nginx.conf)中"http" 块。可能是这样的:
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%%pri%%programname%%msg%\n"
local3.* :omprog:;RSYSLOG_TraditionalFileFormat
注意这一行:
/usr/share/nginx/MY_SITE/scripts/download.py
这是每次将日志条目添加到日志文件时调用的脚本地址,整个日志条目将在此脚本中可用(在 Python 代码中):
line = sys.stdin.readline()
然后您可以解析该行并找到您记录的任何内容,包括下载的文件大小(在每个 pause/finish 事件中)。现在,您可以简单地将文件大小包含在下载 URL 中并在此脚本中检索它并将其与下载的字节数进行比较。如果这两个数字相等,则表示下载已成功完成。此外,您可以在此脚本中执行任何其他操作(例如,使下载过期 link、增加 DB 的下载次数,...)
我需要了解如何从服务器完全下载资源。我的服务器配置了 NginX
网络服务器,当且仅当资源完全由用户下载时,我想做一些事情。
如果您使用 Nginx 来处理文件下载(使用 XSendfile),您应该在 Nginx 配置中(在您的 "server" 块中)向您的下载处理块添加一个特定的 access_log 块.它会是这样的:
location /download_music/ {
internal;
root /usr/share/nginx/MY_SITE/media/music;
access_log /var/log/nginx/download.MY_SITE.log download;
}
access_log行末尾的"download"实际上是一种日志格式,您应该将其添加到nginx主配置文件(/etc/nginx/nginx.conf)中"http" 块。可能是这样的:
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%%pri%%programname%%msg%\n"
local3.* :omprog:;RSYSLOG_TraditionalFileFormat
注意这一行:
/usr/share/nginx/MY_SITE/scripts/download.py
这是每次将日志条目添加到日志文件时调用的脚本地址,整个日志条目将在此脚本中可用(在 Python 代码中):
line = sys.stdin.readline()
然后您可以解析该行并找到您记录的任何内容,包括下载的文件大小(在每个 pause/finish 事件中)。现在,您可以简单地将文件大小包含在下载 URL 中并在此脚本中检索它并将其与下载的字节数进行比较。如果这两个数字相等,则表示下载已成功完成。此外,您可以在此脚本中执行任何其他操作(例如,使下载过期 link、增加 DB 的下载次数,...)