序章


Drupal は、PHPで記述されたオープンソースのコンテンツ管理フレームワークおよびプラットフォームです。 あらゆるサイズのWebサイトおよびWebアプリケーション向けのリッチなバックエンドベースのソリューションを構築するために使用され、採用率の非常に高い統計で非常に人気があります。 GNU General Public Licenseの下での配布は、誰でも自由にソフトウェアを使用し、さまざまな方法でプロジェクトに貢献し、他の人と共有できることを意味します。 Drupalの主なディストリビューションはDrupalCoreと呼ばれ、2013年10月の時点で、2万を超えるモジュールと約2千のテーマで拡張可能です。

Drupalのようなプラットフォームを利用して、アプリケーションのプロトタイプをすばやく作成して開発するのは素晴らしいことです。 しかし、同じようにすぐに、製品の成長への取り組みなどの問題が発生し始めます。 これには、顧客の製品への関心を維持し、顧客の幸せを維持するために、顧客に迅速にサービスを提供し続けるために、迅速に拡張する必要があります。

このDigitalOceanの記事では、開発者のスケーリングを支援するシリーズの一部として、Drupalを使用したVarnishの構成について説明します。 これにより、ユーザーがDrupalベースのWebサイトをロードするのにかかる時間が大幅に短縮され、最初にVarnish Cacheソフトウェアを介してリクエストを渡すことで、DigitalOceanVPSの同時配信容量が増加します。

スケーリング


ソフトウェアの観点からスケーリングについて話すとき、人々が通常意味するのは、(処理される)作業量とデータ(リアルタイムまたはそれ以降に保持および使用されます)。 ネットワークに関しては、問題の定義と特定が簡単になりますが、完全なソリューションは、システムにハードウェアをさらに組み込む必要があるため、通常は実装にコストがかかります。

Webページ(またはWebアプリケーション)をスケーリングする最も一般的な2つのアプローチは、Verticalおよび/またはHorizontalスケーリングです。

垂直スケーリング(スケールアップ!)


簡単に言うと、 Vertical Scaling は、サーバーである1台のコンピューター、またはシステム全体を垂直に構成するコンピューターのリソースを追加するか、容量を増やすことによって、それらのコンピューターのリソースを増やすことを意味します。 より多くのメモリを追加し、CPUをより高速なものに交換し、より大容量でより高速なドライブを優れた読み取り/書き込み速度で取得します(例: DigitalOcean DropletsのSSD)は、すべて垂直スケーリングと見なすことができます。 これは、スケールアップとも呼ばれます。

水平スケーリング(スケールアウト!)


今日のプライベートサーバーの優れた低価格を利用して、それらをシステムに組み込むことにした場合、それは水平スケーリングまたは「スケールアウト」と呼ばれます。 これは、アプリケーションスタックの各ソフトウェアを独自のマシンで実行したり、Webサーバーのクローンを作成して同じものをいくつか作成したり、リバースプロキシを使用してクライアントからの着信要求をクライアント全体に分散したりするなど、さまざまな方法で発生する可能性があります。 NGINXなど。 リバースプロキシの詳細については、http://en.wikipedia.org/wiki/Reverse_Proxyにアクセスしてください。

ワニス


Varnish Cache は、Webサイトの前に座って、要求をWebサーバーに戻さずに、静的または準静的コンテンツを直接提供します(つまり、 Apache)何度も何度も処理します。 多くのコンテンツ(アクセスされる時間に関係なく)は一度だけ計算および生成する必要があるため、高速アクセスメモリからコンテンツを保存して提供することで、Webサーバーの負荷が大幅に軽減され、リクエストの量が増加します。これは、システム全体で同時に処理できます。

ワニスはどのように役立ちますか?


(ほぼ)すべてのWebサイトでVarnishを使用するということは、(もちろん、アーキテクチャによっては)多数の力によってより高速なWebサイトを意味します。 また、Varnish Cacheの拡張機能のおかげで、(構成中に表示される理由により)より信頼性の高い製品を意味します。 これはすべて、あなたの製品をより多く使用することを楽しんでいるより幸せな顧客と、あなたがより信頼できるシステムを提供することを意味します。

注: Varnish用に別のアプリケーションサーバーインスタンスを使用しない限り(多くの良いの理由で!)、これは技術的にはスケーリングではありません(アップでもアウトでもありません)。優れたシステムアーキテクチャを持ち、基本的にスマートです。 ただし、単一のサーバーで処理できる負荷が増加するため、システム全体のパフォーマンスが大幅に向上するため、これはある意味でスケーリングと呼ばれる可能性があります。 これは実際にはスケーリングから期待される結果であり、必要に応じて真にスケーリングする準備ができているシステムアーキテクチャになります。 ただし、パフォーマンスの向上だけではスケーリングを意味しないことに注意する必要があります。

1. ワニス用のWebサーバーの準備


この記事では、メモリから直接ページをすばやく提供するようにVarnishを設定することを目標としています。 これはcachingと呼ばれ、これが機能するためには、Varnishが最初に着信要求を処理できる必要があります。 あなたのウェブサーバーを考えると(例: Apache)は、まったく同じこと(着信要求の処理)を実行するように設定されています。Varnishを使用するには、いくつかの変更を加える必要があります。 これを実現する方法は、リッスンするポートを変更することです(つまり、 ポート80)。

Apacheの変更


デフォルトでは、Apacheはポート80で実行(リッスン)しており、これを変更する必要があります。

ports.confでのApacheの設定の変更

変更する必要のあるポート設定は、/etc/apache2/フォルダーにあるports.confというファイルで定義されています。

テキストエディタを使用してそれを変更しましょう。 ここではnanoを使用します。これは、他の製品と比較して使いやすさで知られています。

次のコマンドを実行してエディターを開き、Ports.confファイルの内容を編集します。

sudo nano /etc/apache2/ports.conf

このファイル内(デフォルト)には、次のようなものが表示されます。

NameVirtualHost *:80
Listen 80

<IfModule mod_ssl.c>
    # If you add NameVirtualHost *:443 here, you will also have to change
    # the VirtualHost statement in /etc/apache2/sites-available/default-ssl
    # to <VirtualHost *:443>
    # Server Name Indication for SSL named virtual hosts is currently not
    # supported by MSIE on Windows XP.
    Listen 443
</IfModule>

<IfModule mod_gnutls.c>
    Listen 443
</IfModule>

したがって、先に進んで、ポート番号が指定されている最初の2行を、元の行から 8000 に変更します(この番号を覚えておいてください)。

NameVirtualHost *:8000
Listen 8000

保存して閉じるには、 CTRL + X を押し、プロンプトが表示されたら Y と入力し、Enterキーを押します。これでファイルが保存されます。

仮想ホスト(vhost)構成もある場合

複数のウェブサイトをホストしている場合(またはドメイン固有のオプションが設定されている場合)、仮想ホスト構成も更新する必要がある可能性があります。

次のコマンドを実行してエディターを開き、サイトの設定を編集します。

sudo nano /etc/apache2/sites-availbable/my-domain-dot-com

!! my-domain-dot-comを適切な名前に置き換えることを忘れないでください。

!! カスタムの名前付き仮想ホスト構成がない場合は、/etc/apache2/sites-available/defaultにデフォルト設定があります。

現在の設定に応じて、次のようなもので始まる(または含まれている)ドキュメントが表示されます。

<VirtualHost *:80>

これをports.conf同じポートに置き換える必要があります。

<VirtualHost *:8000>

CTRL + X を押してから、 Y と入力し、同じ方法でEnterキーを押して、ファイルを閉じて保存します。

変更を有効にするには、Apacheを再起動する必要があります。

sudo service apache2 reload

現在のところ、Apacheは8000の新しいセットポートで着信要求を受け入れます。 そして、次のステップに進む準備ができました!

2. VarnishCacheのインストール


DebianおよびUbuntuの場合:


DebianとUbuntuでのVarnishのセットアップは、デフォルトのシステムパッケージマネージャー apt で配布されるため、非常に簡単です。 ただし、最新バージョンを確実に入手するための推奨される方法は次のとおりです(参照。 https://www.varnish-cache.org/installation/debian ):

VarnishのダウンロードURLをaptitudeパッケージマネージャーのソースリストに追加する必要があります。 ソースを確認するには、最初にhttp://repo.varnish-cache.orgによって提供されるセキュリティキーを追加する必要があります。

セキュリティキーの追加から始めましょう[DebianとUbuntu]:

wget http://repo.varnish-cache.org/debian/GPG-key.txt
apt-key add GPG-key.txt

次に、パッケージURLをapt-getリポジトリソースリストに追加します。

Debian:

echo "deb http://repo.varnish-cache.org/debian/ wheezy varnish-3.0" >> /etc/apt/sources.list

Ubuntu:

echo "deb http://repo.varnish-cache.org/ubuntu/ precise varnish-3.0" | sudo tee -a /etc/apt/sources.list

最後に、パッケージマネージャーを更新し、VarnishCacheをダウンロード/インストールしましょう[DebianとUbuntu]

apt-get update
apt-get install varnish

3. ワニスの設定の変更


Apacheのポートを変更し、Varnishをインストールしたら、Varnishの設定を変更して、必要な動作をする準備が整います。

ワニスをプロダクションモッドに入れる


管理者がインストール時にVarnishをテストできるようにする理由の1つとして、デフォルト設定はではなくが前面ポート80で実行されるように設定されており、これを変更する必要があります。

DebianとUbuntuの設定ファイルは/etc/default/varnishにあります。

エディターを開いてファイルを編集します。

nano /etc/default/varnish

このコマンドを実行すると、かなり長いが自明のドキュメントに直面します。 下にスクロールすると、次のようなテキストDAEMON_OPTSで始まるワニスデーモンオプションを定義するテキストのブロックが表示されます。

DAEMON_OPTS="-a :6081 \
             -T localhost:6082 \
             -f /etc/varnish/default.vcl \
             -S /etc/varnish/secret \
             -s malloc,256m"

ポートを6081から80に変更するように変更してみましょう。

DAEMON_OPTS="-a :80 \
             -T localhost:6082 \
             -f /etc/varnish/default.vcl \
             -S /etc/varnish/secret \
             -s malloc,256m"

VCLの言語とファイル


Varnishは、プログラムを実行するために、VCL言語で記述された命令を含む .vcl ファイル(デフォルトは/etc/varnish/default.vclとしてあります)を使用します。 これは、Varnishがリクエストを処理する方法と、ドキュメントcachingシステムがどのように機能するかを定義するために使用されます。 ( .vcl ファイルを介した)新しい命令セットがロードされると、Varnishによってスピンされた(マネージャー)プロセスがそれらを Cコードに変換し、コンパイルします。仕事をする。

/etc/varnish/の下のデフォルトVCLファイルの変更


Varnishが実行するために定義できるタスクの範囲が広いため、VCL言語とファイルは最初は複雑に見える場合があります。 幸いなことに、 https://www.varnish-cache.org/trac/wiki/VCLExamples には、スキーマ(一部の場合)を伴う、かなりの数の優れた例が提供されています。 Varnishに何をさせたいかについて質問やアイデアがある場合は、これらの例のいくつかを読むことで、必要な方法で簡単に回避できるようになります。

そうは言っても、Drupal(およびほとんどのWebサイト)の多かれ少なかれデフォルトの構成の組み合わせについては、以下にある設定を使用します。 各コードブロックのすべてのコードをコピーして貼り付け、.vclファイルを作成します。

もう一度エディターを開いて、default.vcl / etc / varnish / の下にあります)の内容をDrupalに変更してみましょう。

エディターを開くには、次のコマンドを実行します。

nano /etc/varnish/default.vcl

デフォルト設定を含む長いドキュメントが表示されます。

まず、Webサーバーを定義し、Varnishに連絡方法を指示する必要があります。 それでは、backend defaultセクションを変更しましょう。

backend default {
    .host = "127.0.0.1";
    .port = "8000";
    .max_connections = 250;
    .connect_timeout = 300s;
    .first_byte_timeout = 300s;
    .between_bytes_timeout = 300s;
}

注:その下に、コメントアウトされたデフォルトのVCL構成コードの大きなブロックが表示されます。 誤ってコメントを外さない限り、自由に保持できます。コメントを外すと、エラーが発生します。

ここで、許可されたパージクライアントアドレスを設定します(パージの詳細については、以下の質問を参照してください)。

acl purge {
    "localhost";
    "127.0.0.1";
}

cron.phpまたはinstall.phpにアクセスできる許可されたアドレスを定義するには、以下を追加します。

acl internal {
  "192.10.0.0"/24;
  # For remote access, add your IP address here.
  # Ex: 162.xxx.xx.xx
}

ここでは、クライアントからの(受信した)要求を処理するプログラムを作成します。 次のコードブロックの追加を続行します。

sub vcl_recv {

    # A great functionality of Varnish is to check
    # your web server's health and serve stale pages
    # if necessary. 
    # In case of web server lag, let's return the 
    # request with stale content.
    
    if (req.backend.healthy)
    {
        set req.grace = 60s;
    }
    else
    {
        set req.grace = 30m;
    }
    
    # Modify (remove) progress.js request parameters.
    
    if (req.url ~ "^/misc/progress\.js\?[0-9]+$")
    {
        set req.url = "/misc/progress.js";
    }

    # Modify HTTP X-Forwarded-For header.
    # This will replace Varnish's IP with actual client's.
    
    remove req.http.X-Forwarded-For;
    set    req.http.X-Forwarded-For = client.ip;
    
    # Check if request is allowed to invoke cache purge.
    
    if (req.request == "PURGE")
    {
        if (!client.ip ~ purge)
        {
            # Return Error 405 if not allowed.
            error 405 "Forbidden - Not allowed.";
        }
        return (lookup);
    }
                    
    # Verify HTTP request methods.
    
    if (req.request != "GET"    && req.request != "HEAD" &&
        req.request != "PUT"    && req.request != "POST" &&
        req.request != "TRACE"  && req.request != "OPTIONS" &&
        req.request != "DELETE" && req.request != "PURGE")
    {
            return (pipe);
    }
    
    # Handling of different encoding types.
    
    if (req.http.Accept-Encoding)
    {
        if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|tbz|mp3|ogg)$")
        {
            remove req.http.Accept-Encoding;
        }
        elsif (req.http.Accept-Encoding ~ "gzip")
        {
            set req.http.Accept-Encoding = "gzip";
        }
        elsif (req.http.Accept-Encoding ~ "deflate")
        {
            set req.http.Accept-Encoding = "deflate";
        }
        else
        {
            remove req.http.Accept-Encoding;
        }
    }
     
    # Force look-up if request is a no-cache request.     
    if (req.http.Cache-Control ~ "no-cache")
    {
        return (pass);
    }
    
    # Do not allow outside access to cron.php or install.php. Depending on your access to the server, you might want to comment-out this block of code for development.
    if (req.url ~ "^/(cron|install)\.php$" && !client.ip ~ internal)
    {        
        # Throw error directly: 
        error 404 "Page not found.";
        # Or;
        # Use a custom error page on path /error-404. 
        # set req.url = "/error-404";
    } 

    # Remove certain cookies.
    set req.http.Cookie = regsuball(req.http.Cookie, "has_js=[^;]+(; )?", "");
    set req.http.Cookie = regsuball(req.http.Cookie, "Drupal.toolbar.collapsed=[^;]+(; )?", "");
    set req.http.Cookie = regsuball(req.http.Cookie, "__utm.=[^;]+(; )?", "");
    if (req.http.cookie ~ "^ *$")
    {
        unset req.http.cookie;
    }
    
    # Cache static content of themes.        
    if (req.url ~ "^/themes/" && req.url ~ ".(css|js|png|gif|jp(e)?g)")
    {
        unset req.http.cookie;
    }
    
    # Do not cache these URL paths.
    if (req.url ~ "^/status\.php$" ||
        req.url ~ "^/update\.php$" ||
        req.url ~ "^/ooyala/ping$" ||
        req.url ~ "^/admin"        ||
        req.url ~ "^/admin/.*$"    ||
        req.url ~ "^/user"         ||
        req.url ~ "^/user/.*$"     ||
        req.url ~ "^/users/.*$"    ||
        req.url ~ "^/info/.*$"     ||
        req.url ~ "^/flag/.*$"     ||
        req.url ~ "^.*/ajax/.*$"   ||
        req.url ~ "^.*/ahah/.*$")
    {
        return (pass);
    }        

    # Cache the following file types.
    if (req.url ~ "(?i)\.(png|gif|jpeg|jpg|ico|swf|css|js|html|htm)(\?[a-z0-9]+)?$")
    {
        unset req.http.Cookie;
    }

    # !! Do not cache application area
    if (req.url ~ "(^/app.php|^/app_dev.php|^)/([a-z]{2})/(payment|order|booking|media|autocomplete|monitor).*")
    {
        return (pass);
    }

    # !! Do not cache admin area
    if (req.url ~ "(^/app.php|^/app_dev.php|^)/admin" || req.url ~ "(^/app.php|^/app_dev.php|^)/(([a-z]{2})/admin)")
    {
        return (pass);
    }

    # !! Do not cache security area
    if (req.url ~ "(^/app.php|^/app_dev.php|^)/(([a-z]{2}/|)(login|logout|login_check).*)")
    {
        return (pass);
    }

    # Do not cache editor logged-in user sessions
    if (req.http.Cookie ~ "(sonata_page_is_editor)")
    {
        return (pass);
    }

    return (lookup);
}

sub vcl_hit {
    if (req.request == "PURGE")
    {
        purge;
        error 200 "Purged.";
    }
}

sub vcl_miss {
    if (req.request == "PURGE")
    {
        purge;
        error 200 "Purged.";
    }
}

ワニスの実行


これで、Varnishデーモンを再起動する準備が整いました。

次のコマンドを実行して、Varnishを実行します。

/etc/init.d/varnish restart

アプリケーションの状態の確認


次の2つのコマンドを実行して、ApacheとVarnishの両方が正しいポートにバインドされていることを確認しましょう。

Apache:

netstat -lp | grep apache2

ワニス:

netstat -lp | grep varnish

結果は次のようになります。

tcp    0    0    localhost:8000    *:*     LISTEN   xxxx/apache2
-- or --
tcp6   0    0    [::]:8000         [::]:*  LISTEN   xxxx/apache2

-- and --
tcp    0    0    localhost:6082    *:*     LISTEN   xxxx/varnishd   
tcp    0    0    *:http            *:*     LISTEN   xxxx/varnishd   
tcp6   0    0    [::]:http         [::]:*  LISTEN   xxxx/varnishd   

ついに


Drupalインストールで動作するようにApacheとVarnishをセットアップしました。 ワニスに関してDrupalバックエンドからさらに多くのことを知りたい場合は、https://drupal.org/project/varnishにあるDrupalワニスモジュールを試してみてください。

2013年10月の時点で、このモジュールの機能は次のように記載されています。

  • このモジュールは、Drupalがキャッシュエントリを動的に無効化できるようにする管理ソケット統合を提供し、Varnish管理インターフェースにステータスなどを照会することもできます。

注:バージョン7より古いDrupalシステムを使用している場合は、訪問者にCookieを処理するDrupalの方法のため、このモジュールも使用する必要があります。

トラブルシューティング、メモ、およびヒント


Linuxディストリビューションとそのバージョンを確認するにはどうすればよいですか?

この記事では複数のディストリビューションとバージョンについて説明しているので、正しいものを目指していることを確認することをお勧めします。 幸いなことに、解決策はかなり単純です。 次のコマンドを実行するだけです。

cat /etc/*-release

これにより、ディストリビューションの名前とバージョンがわかります。

Apache仮想ホスト( vhosts )の詳細はどこで確認できますか?

仮想ホストファイルの詳細については、http://httpd.apache.org/docs/2.2/vhosts/examples.htmlおよびhttps://www.digitalocean.com/communityにアクセスしてください。それぞれ/articles/how-to-set-up-apache-virtual-hosts-on-ubuntu-12-04-lts

使用するポートをどのように決定できますか? ポートについて詳しくはどこで確認できますか?

必要なポートを選択することはほぼ可能ですが、将来の問題や他のアプリケーションとの衝突を防ぐために、特定のポートは避ける方がよいでしょう。 これらのポートのいくつかは次のとおりです。

  • ポート上の簡易メール転送プロトコル(SMTP) 25
  • ネットワークニュース転送プロトコル(NNTP)同期ポート119
  • HTTP over TLS / SSL(HTTPS) on port 443
  • MySQLデータベースシステムポート3306

完全なリストについては、以下を参照してください。
http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers

ワニスの機能に関して、パージとはどういう意味ですか?

パージとは、キャッシュされたファイルの無効化です。 このテーマの詳細については、https://www.varnish-cache.org/docs/3.0/tutorial/purging.htmlを参照してください。

デーモンとは何ですか?

コンピューティングでは、デーモンは、ユーザーと直接対話するのではなく、単独で実行されるバックグラウンドプロセスです。 Varnishの場合、そのデーモンは、VCL構成ファイルをコンパイルすると、継続的に実行され、Webサーバーと同じように事前設定およびコンパイルされた命令を実行します。

投稿者: https ://twitter.com/ostezer