Maison >développement back-end >tutoriel php >[nginx]统计文件下载是否完整思路(flask)
有一个需求是统计文件是否被用户完整下载,因为是web应用,用js没有找到实现方案,于是搜索下nginx的实现方案,把简单的探索过程记录下。
实验一
这种方式就是根据日志来做统计,每隔一段时间分析日志得到结果,有些麻烦,时效性不好。
实验二:
找了相关的博客
Counting-100-completed-downloads
使用post_action(下面使用的方式)
Nginx-post-action-to-trigger-successfully-download-file 遇到的问题 nginx-post-action-proxy-pass-track-downloading-file
使用 x-accel-redirect
大概的流程:
主要的工作就是2个
1 修改nginx的配置,把下载文件的信息转发到统计服务或者url
2 统计服务记录和判断文件下载状态
这里的重点是使用nginx 的post_action参数, 在下载请求结束之后把下载的情况发送给另一个统计服务,由统计服务来判断文件下载的情况
配置类似
<code>location / { limit_rate 20k; post_action @afterdownload; } location @afterdownload { proxy_pass http://127.0.0.1:8888/counting?FileName=$uri&ClientIP=$remote_addr&body_bytes_sent=$body_bytes_sent&status=$request_completion; internal; } </code>
然后写个一个flask 来接收统计请求
<code><span>#!/usr/bin/python</span><span>#-*- coding:utf-8 -*-</span><span>############################</span><span>#File Name: counting_file.py</span><span>#Author: orangleliu</span><span>#Mail: orangleliu@gmail.com</span><span>#Created Time: 2015-03-11 16:41:05</span><span>#License: MIT</span><span>############################</span><span>''' nginx统计用户下载文件字节 '''</span><span>from</span> flask <span>import</span> Flask, request app = Flask(__name__) <span>@app.route("/counting")</span><span><span>def</span><span>counting</span><span>()</span>:</span> req = request.args.get(<span>"FileName"</span>) clientip = request.args.get(<span>"ClientIP"</span>) size = request.args.get(<span>"body_bytes_sent"</span>) status = request.args.get(<span>"status"</span>) <span>print</span><span>"request "</span>, req <span>print</span><span>"ip "</span>, clientip <span>print</span><span>"size "</span>, size <span>print</span><span>"status "</span>, status <span>return</span><span>"ok"</span><span>if</span> __name__ == <span>"__main__"</span>: app.run(port=<span>8888</span>, debug=<span>True</span>)</code>
访问的日志
<code>lzz@ubuntu:code$ python counting_file.py * Running on http://127.0.0.1:8888/ * Restarting with reloader request /index.html ip 10.0.1.16 size 0 status OK 127.0.0.1 - - [12/Mar/2015 10:42:59] "GET /counting?FileName=/index.html&ClientIP=10.0.1.16&body_bytes_sent=0&status=OK HTTP/1.0" 200 - request /Pillow-2.3.0.zip ip 10.0.1.16 size 225280 status 127.0.0.1 - - [12/Mar/2015 10:43:14] "GET /counting?FileName=/Pillow-2.3.0.zip&ClientIP=10.0.1.16&body_bytes_sent=225280&status= HTTP/1.0" 200 - </code>
只要在flask中做处理就可以统计用户下载的情况了。
上面的文章也说了,当用户使用多个连接下载的时候可能就有问题了,会重复统计,结果也会不准确,所以还有很多改进空间.
声明:
本文出自 “orangleliu笔记本” 博客,转载请务必保留此出处http://blog.csdn.net/orangleliu/article/details/44219213
作者orangleliu 采用署名-非商业性使用-相同方式共享协议
以上就介绍了[nginx]统计文件下载是否完整思路(flask),包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。