有一個需求是統計檔案是否被使用者完整下載,因為是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: orangleliu@gmail.com#Created Time: 2015-03-11 16:41:05#License: MIT############################''' nginx統計使用者下載檔案位元組 '''from flask import Flask, request app = Flask(__name__) @app.route("/counting")defcounting(): 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)
訪問的日誌
lzz@ubuntu:code$ python counting_file.py * Running on http://127.0.0.1:8888/ * Restarting with reloaderrequest /index.htmlip 10.0.1.16size 0status OK127.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.zipip 10.0.1.16size 225280status127.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 採用署名-非商業性使用-相同方式共用協議
以上就介紹了[nginx]統計檔案下載是否完整思路(flask),包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。