ホームページ >バックエンド開発 >PHPチュートリアル >【nginx】統計ファイルのダウンロードが完了したかどうか(flask)

【nginx】統計ファイルのダウンロードが完了したかどうか(flask)

WBOY
WBOYオリジナル
2016-08-08 09:28:191129ブラウズ

Webアプリケーションなので、jsを使った実装ソリューションが見つからなかったので、nginxの実装ソリューションを探して、簡単な探索プロセスを記録しました。

実験1

  • 最も独創的なアイデアは、ファイルをダウンロードした後、ログ転送のファイルサイズがファイルの元のサイズと一致しているかどうかを確認することです
  • ファイルのサイズをテストします。ダウンロードされるログ

  • ダウンロードが完了したログとダウンロードが不完全なログは、転送されたバイト数を比較することで判断できます

この方法は、ログをもとに統計をとり、分析する方法です。定期的にログを取得して結果を取得するのは少し面倒で、タイムリーではありません。

実験 2:

関連するブログを見つける

  • ダウンロード数 100 件完了
    post_action (以下で使用する方法) の使用で発生した問題

  • Nginx-post-action-to-trigger-sucedly-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>

次に、統計リクエストを受け取るためのフラスコを作成します

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

フラスコ内で処理が行われている限り、ユーザーのダウンロードをカウントできます。
上記の記事では、ユーザーがダウンロードに複数の接続を使用すると、統計が繰り返され、結果が不正確になる可能性があるため、まだ改善の余地があると述べられています。 この記事は「orangleliu Notebook」ブログからのものです。このソースは転載用に必ず保管してください。http://blog.csdn.net/orangleliu/article/details/44219213

著者 orangleliu は表示-非営利-継承ライセンスを採用しています



上記では、[nginx] 統計ファイルのダウンロード (flask) の完全なアイデアを、関連するコンテンツも含めて紹介しています。PHP チュートリアルに興味のある友人に役立つことを願っています。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。