[nginx]统计文件下载是否完整思路(flask)

有一个需求是统计文件是否被用户完整下载,因为是web应用,用js没有找到实现方案,于是搜索下nginx的实现方案,把简单的探索过程记录下。

实验一

  • 最原始的思路,查看日志,下载了一个文件之后我们看日志的传输的文件大小跟文件原始的大小是否一致
  • 测试要下载的文件的大小

  • 一次完整下载的log 跟一次没下载完成的log,可以通过对比传输字节的大小来判断

这种方式就是根据日志来做统计,每隔一段时间分析日志得到结果,有些麻烦,时效性不好。

实验二:

找了相关的博客

大概的流程:

主要的工作就是2个

1 修改nginx的配置,把下载文件的信息转发到统计服务或者url

2 统计服务记录和判断文件下载状态

这里的重点是使用nginx 的post_action参数, 在下载请求结束之后把下载的情况发送给另一个统计服务,由统计服务来判断文件下载的情况

配置类似

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;
}

然后写个一个flask 来接收统计请求

    #!/usr/bin/python
    #-*- coding:utf-8 -*-
    ############################
    #File Name: counting_file.py
    #Author: orangleliu
    #Mail: [email protected]
    #Created Time: 2015-03-11 16:41:05
    #License: MIT
    ############################
    ‘‘‘
    nginx统计用户下载文件字节

    ‘‘‘

    from flask import Flask, request
    app = Flask(__name__)

    @app.route("/counting")
    def counting():
        req = request.args.get("FileName")
        clientip = request.args.get("ClientIP")
        size = request.args.get("body_bytes_sent")
        status = request.args.get("status")
        print "request  ", req
        print "ip  ", clientip
        print "size  ", size
        print "status  ", status
        return "ok"

    if __name__ == "__main__":
        app.run(port=8888, debug=True)

访问的日志

[email protected]: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 -

只要在flask中做处理就可以统计用户下载的情况了。

上面的文章也说了,当用户使用多个连接下载的时候可能就有问题了,会重复统计,结果也会不准确,所以还有很多改进空间.

声明:

本文出自 “orangleliu笔记本” 博客,转载请务必保留此出处http://blog.csdn.net/orangleliu/article/details/44219213

作者orangleliu 采用署名-非商业性使用-相同方式共享协议

时间: 2024-08-01 00:05:23

[nginx]统计文件下载是否完整思路(flask)的相关文章

nginx统计响应的http状态码信息

一.介绍 ngx-http-status-code-counter是一个用来记录nginx响应状态码的统计信息,作者将这个模块与munin结合来分析网站的http状态,我们也可以将这个与nagios.zabbix或者其他监控系统想结合,有这个模块运维可以不再使用脚本去分析日志了. 二.安装 nginx的安装方式不再多说,请参考运维生存时间早期的<nginx安装>,我这边使用nginx-1.4.2做的测试.作者仅在0.8.50版本上使用,模块比较简单,新版本一般都会兼容,不过大家使用之前最好做一

ASP.NET 大文件下载的实现思路及代码

文件下载是一个网站最基本的功能,ASP.NET网站的文件下载功能实现也很简单,但是如果遇到大文件的下载而不做特殊处理的话,那将会出现不可预料的后果.本文就基于ASP.NET提供大文件下载的实现思路及代码. 当我们的网站需要支持下载大文件时,如果不做控制可能会导致用户在访问下载页面时发生无响应,使得浏览器崩溃.可以参考如下代码来避免这个问题. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

HAProxy、Nginx 配置 HTTP/2 完整指南

HAProxy.Nginx 配置 HTTP/2 完整指南 基于最近对HTTP/2的争论和它的优势,是时候升级底层架构了.这篇文章将会介绍如何在安装和配置HAProxy和Ngnix(使用ssl终端).为了简化流程,我建议你准备好使用Docker镜像. 如果你想跳过安装环节或你只对配置环节感兴趣,可以跳至配置部分. 我为什么需要关注HTTP/2? 这里有一些介绍HTTP/2益处的文章-而且我鼓励你去读一读.下面我将重点介绍我认为比较重要的几点. HTTP/2的主要优势: 使用二进制数据(不像HTTP

nginx.conf 集群完整配置

###############################nginx.conf 集群完整配置############################### #user nobody; # user 主模块指令,指令nginx worker 运行用户和用户组(user xxxuser xxxgroup) ,默认由nobody运行 worker_processes 1; # worker_processes 主模块指令,指令nginx运行进程数,每个进程平均耗10m-12m内存,单核为1,多核为

PHP+Mysql统计文件下载次数实例

PHP+Mysql统计文件下载次数实例,实现的原理也很简单,是通过前台点击链接download.php传参id,来更新点击次数. 获取文件列表: <?php require 'conn.php'; $query = mysql_query("SELECT * FROM downloads"); $lists = array(); while ($row = mysql_fetch_assoc($query)) { $lists[] = $row; } ?> 读取文件列表,并

[Python] 用python做一个游戏辅助脚本,完整思路

一.说明 简述:本文将以4399小游戏<宠物连连看经典版2>作为测试案例,通过识别小图标,模拟鼠标点击,快速完成配对.对于有兴趣学习游戏脚本的同学有一定的帮助. 运行环境:Win10/Python3.5. 主要模块:win32gui(识别窗口.窗口置顶等操作).PIL(屏幕截图).numpy(创建矩阵).operator(比较值).pymouse(模拟鼠标点击). 注意点: 1.如果安装pymouse不成功或者运行报错,可以考虑先通过whl 安装pyHook.然后再通过pip安装pyuseri

NGINX: 统计网站的PV、UV、独立IP

Nginx: PV.UV.独立IP 做网站的都知道,平常经常要查询下网站PV.UV等网站的访问数据,当然如果网站做了CDN的话,nginx本地的日志就没什么意义了,下面就对nginx网站的日志访问数据做下统计: 概念: UV(Unique Visitor):独立访客,将每个独立上网电脑(以cookie为依据)视为一位访客,一天之内(00:00-24:00),访问您网站的访客数量.一天之内相同cookie的访问只被计算1次 PV(Page View):访问量,即页面浏览量或者点击量,用户每次对网站

使用nginx实现的灰度发布思路研究(待实践)

灰度发布也叫 A/B 测试,原理是一套系统在实现了负载均衡,全国节点都部署了系统之后,可以在新功能上线后,让一小部分用户先使用,从中收集使用信息来做对比和发现bug,及时调整,最终分发到全国的节点. 实现灰度发布的几个思路: 1.以nginx为例的分流,IP是最终的关键,从而以IP围绕中心,可以衍生出很多定义,比如用户标识.用户分组.设备ID及分组等,但是最终还是离不开IP去分流. 2.nginx支持模块开发,如果在一套成熟的系统中,可以开发自己的模块,从而脱离IP为分流导向,指定自己的精确分流

使用nginx解决跨域问题(flask为例)

背景 我们单位的架构是在api和js之间架构一个中间层(python编写),以实现后端渲染,登录状态判定,跨域转发api等功能.但是这样一个中间会使前端工程师的工作量乘上两倍,原本js可以直接ajax请求api,但是我们不得不ajax请求中间层,中间层再请求api.如图: 为了少敲代码,提高工作效率,我们当然希望将python中间层砍掉,但是如何解决以下三个问题,成为关键: 后端渲染 登录状态判定 跨域转发api 关于1,2我会在另外两篇博客中详细叙述,这篇文章主要解决3,也就是跨域问题.解决跨