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

如何通知资源是否已在nginx中完全下载,nginx,webserver,rsyslog,Nginx,Webserver,Rsyslog,我需要知道如何从服务器下载资源。我的服务器配置了NginXweb服务器,当且仅当资源完全由用户下载时,我才想做一些事情。如果您使用NginX处理文件下载(使用XSendfile),您应该在NginX配置中的下载处理块(在“服务器”块中)添加特定的访问日志块. 应该是这样的: location /download_music/ { internal; root /usr/share/nginx/MY_SITE/media/music;

我需要知道如何从服务器下载资源。我的服务器配置了
NginX
web服务器,当且仅当资源完全由用户下载时,我才想做一些事情。

如果您使用NginX处理文件下载(使用XSendfile),您应该在NginX配置中的下载处理块(在“服务器”块中)添加特定的访问日志块. 应该是这样的:

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

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

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

location /download_music/ {
            internal;
            root /usr/share/nginx/MY_SITE/media/music;
            access_log /var/log/nginx/download.MY_SITE.log download;
    }
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)的配置文件末尾添加这些配置:

请注意这一行:

/usr/share/nginx/MY_SITE/scripts/download.py
这是脚本的地址,每次将日志条目添加到日志文件时都会调用该脚本,并且整个日志条目将在此脚本中可用(在Python代码中):


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

非常好的解决方案,谢谢。但是,由于Nginx可以直接将日志发送到syslog,因此不需要使用imfile。示例:access\u log syslog:server=unix:/dev/log,nohostname,facility=local3,tag=nginx\u download,severity=info download;