首頁 >後端開發 >php教程 >[nginx]統計檔下載是否完整想法(flask)

[nginx]統計檔下載是否完整想法(flask)

WBOY
WBOY原創
2016-08-08 09:28:191129瀏覽

有一個需求是統計檔案是否被使用者完整下載,因為是web應用,用js沒有找到實作方案,於是搜尋下nginx的實作方案,把簡單的探索過程記錄下來。

實驗一

  • 最原始的思路,查看日誌,下載了一個文件之後我們看日誌的傳輸的文件大小跟文件原始的大小是否一致
  • 測試要下載的文件的大小

測試要下載的文件的大小

測試要下載的文件的大小

一次完整下載的log 跟一次沒下載完成的log,可以透過比較傳輸位元組的大小來判斷


  • 這種方式就是根據日誌來做統計,每隔一段時間分析日誌得到結果,有些麻煩,時效性不好。

  • 實驗二:
  • 找了相關的部落格

  • 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

nginx-x-accel-redirect-php-rails 英文

利用nginx的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教程有興趣的朋友有所幫助。 🎜 🎜 🎜
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn