StaticGenerator Pro

Jared Kuoltは、Django用の小さなキャッシュスクリプトを作成しました。 誰もが注目すべき:シンプルさとサイズの両方。

ただし、Jaredが提供するStaticGeneratorスクリプトとnginx構成には次のような欠点があります。
1)登録のないサイトにのみ関連。
2)単純な形式のリンクのみを使用します。
3)コンテンツおよび/またはコメントを変更/追加する場合のみ生成。

これらの欠点を修正し、スクリプトに興味深いものを追加し、 StaticGenerator Proを入手しました

追加機能:
  1. 匿名訪問者のみのキャッシュ
    ページが異なる可能性がある登録ユーザーのリクエストは、キャッシュせずに常にDjangoに直接リダイレクトされますが、この場合は意味がありません。 したがって、StaticGenerator Proは主に匿名ユーザーに役立ちます(通常、99%以上あります)。

    ユーザー定義は、スクリプト内だけでなく、nginx-eでも発生します(Cookie内のsessionidの存在に基づきます)。
    これを行うには、ジェネレーターのスクリプトとnginxの設定を変更する必要がありました。

    匿名ユーザーと匿名ユーザーを区別するために変更されたnginx設定の一部(Apacheバックエンドの代わりに、Djangoはfcgiを介して動作します): http {
    # [here must be all standard parameters]
    server {
    server_name example.com;
    listen 80;
    root /home/mydjangoproject/www;

    # django
    set $django 1;

    # ,
    #
    if ($is_args = "?") {
    set $args_old ?$args;
    }
    if ($is_args = "") {
    set $args_old "";
    }

    # ,
    #
    default_type text/html;

    location / {
    if (-f $request_filename/index.html$args_old) {
    set $django 0;
    }

    #
    if ($http_cookie ~* "sessionid=([^;]+)(?:;|$)" ) {
    set $django 1;
    }

    #
    if ($django = 0) {
    rewrite (.*) $1/index.html$args_old break;
    }

    # django
    if ($django) {
    fastcgi_pass unix:/home/mydjangoproject/dj.sock;
    break;
    }

    index index.html;
    include conf/fastcgi.conf;
    access_log logs/project.log main;
    }
    }
    }
    http {
    # [here must be all standard parameters]
    server {
    server_name example.com;
    listen 80;
    root /home/mydjangoproject/www;

    # django
    set $django 1;

    # ,
    #
    if ($is_args = "?") {
    set $args_old ?$args;
    }
    if ($is_args = "") {
    set $args_old "";
    }

    # ,
    #
    default_type text/html;

    location / {
    if (-f $request_filename/index.html$args_old) {
    set $django 0;
    }

    #
    if ($http_cookie ~* "sessionid=([^;]+)(?:;|$)" ) {
    set $django 1;
    }

    #
    if ($django = 0) {
    rewrite (.*) $1/index.html$args_old break;
    }

    # django
    if ($django) {
    fastcgi_pass unix:/home/mydjangoproject/dj.sock;
    break;
    }

    index index.html;
    include conf/fastcgi.conf;
    access_log logs/project.log main;
    }
    }
    }

    別の素晴らしい機能:
    nginxログでは、ページがキャッシュから提供されたのか、django経由で提供されたのかを確認できます。 ログ形式に$ djangoを追加するのに十分です。
    たとえば、次のように:
    log_format main '$remote_addr [$time_local] "$request" '
    '$status $bytes_sent $body_bytes_sent $gzip_ratio '
    '$django "$http_referer" "$http_user_agent"';

    ログに
    0-ファイルからのページ(キャッシュ)
    1-djangoからfcgi経由のページ
  2. ミドルウェアは 、最初のアクセスで静的ファイルを生成し、後続のファイルはすべてキャッシュから取得されます。
    静的ファイルは、肯定応答(コード200)とタイプGETの要求でのみ作成されます。

    インストールするには、generatorpro.pyをプロジェクトフォルダーに配置します
    そして、settings.py 'generator.ResponseStaticGenerator'のMIDDLEWARE_CLASSESに追加します。
    そこにwwwフォルダーへのパスを登録することを忘れないでください。
    from os import path
    WEB_ROOT = path.realpath("www")

    したがって、プロジェクトディレクトリにキャッシュを配置できます。
  3. www.alrond.com/?test=1のような、 引数を1行に含むリンクの 操作
    一意の各オプションは個別にキャッシュされます。
  4. settings.pyでは、キャッシュから除外されるパスの先頭を設定できます:
    STATIC_GENERATOR_EXCLUDED = (
    '/comments/postfree',
    '/rating',
    '/rss',
    '/admin',
    )

    したがって、たとえば、/ comments / postfree、/ rating、/ rss、/ adminで始まるすべてのパスは除外されます。

    もちろん、アプリケーションでは、一意のデータを匿名ユーザーに表示することもできることに留意する必要があります。この場合、これらのパスも単純に除外できます。
  5. 巧妙なキャッシュ削除
    特定のパスを削除すると、引数を持つすべてのオプションが削除されます(当然、最初の呼び出しの前)。

    たとえば、 http://www.alrond.com/en/index.htmlを削除すると、 http://www.alrond.com/en/index.html? test = 1http://www.alrond.com/が削除されますja / index.html?tag = django&sort = desc
  6. ビューコントローラーのキャッシュから除外する機能
    どのハンドラでも、 応答を返す前に応答['DisableStaticGenerator'] = 1を挿入するだけで十分です。
このスクリプトはうまく機能します。たとえば、自宅のコンピューターで14.2 ppmを生成できる私のブログは、スクリプトで7500 ppmを生成します。 530倍高速です!

StaticGenerator Proはこちらからダウンロードしてください 。 違いは、追加されたResponseStaticGeneratorクラスと若干変更されたdelete_from_path関数にあります。

もとの記事: www.alrond.com/en/2008/feb/23/static-generator-pro

Source: https://habr.com/ru/post/J20922/


All Articles