Drupalの高速化:Pressflow + Nginx + Varnish

この記事では、深刻なストレス耐性と大量のトラフィックを処理する能力を備えたDrupalサイトの開発方法について詳しく説明します。



これはこのようなセットアップの私の最初の経験ですが、統計からわかるように、それはその主要なタスク-サイトの高速化-にうまく対処します。 RuNetでは、Drupalシステムに関するこのトピックに関する無料で高品質の情報がまだほとんどないため、設定、同様のタスクに直面したすべての人からの追加資料を聞いて見るのは興味深いでしょう。



開発のためにかなり長い間、デフォルトのサーバー設定でDrupal + Nginxの束を使用しました:



server {

listen 62.xxx.xx.xx:80;

server_name mysite.com www.mysite.com;

rewrite>^(/manager/.*)$>https://$host$1>permanent;

location ~* ^/(webstat/|awstats|webmail/|myadmin/|manimg/) {

proxy_pass 62.xxx.xx.xx:8080;

proxy_redirect mysite.com:8080/ /;

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header X-Real-IP $remote_addr;

}

location / {

proxy_pass mysite.com:8080;

proxy_redirect mysite.com:8080/ /;

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header X-Real-IP $remote_addr;

}

location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar)$ {

root /home/pathto/drupal613;

access_log /home/httpd-logs/mysite.com.access.log;

error_page 404 = @fallback;

}

location @fallback {

proxy_pass 62.xxx.xx.xx:8080;

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header X-Real-IP $remote_addr;

}

}












これらの設定の本質は簡単です。Apacheをアンロードし、phpプロセスのみを残し、すべての静的(画像、ファイル)をNginxにスローします。 Apacheはポート8080、Nginxは80に設定されています。フロントエンドのNginxは、要求を分析し、静的データ自体をスローするか、すべてをApacheにスローします。 このアプローチにより、サーバーの負荷が軽減され、パフォーマンスがわずかに向上します。



Drupalのサイトを分析するために、優れたサービスLoadImpact.comを使用して、このレポートを投げました。



画像



サイトのトラフィックが多いほど、サーバーからの応答を待たなければならないことを理解するために分析するのに時間がかかりません。 これは悪いです。 次のバンドルで解決策を見つけました。



プレスフロー+ Nginx +ワニス





Pressflowは、パフォーマンス、拡張性、効率、およびテストに対する統合された拡張機能を備えたDrupalディストリビューションです。


Pressflowの各バージョンは、Drupalの同じバージョンに相当するAPIです。 たとえば、Pressflow 6はすべてのDrupal 6モジュールと互換性があります。 Pressflow 6には、Drupal 7のSimpleTestシステムとCDNサポート用のパッチも統合されています。





Pressflowのダウンロードリンクは次のとおりです。

fourkitchens.com/pressflow-makes-drupal-scale/downloads

launchpad.net/pressflow/+download



ニスは、サイトを高速化するための重要なソフトウェアです。


Varnishは、標準化されたリソースをほとんど必要としないオープンソースソフトウェアです。




ニスのダウンロードリンク:

www.varnish-cache.org/releases



このバンドルのアイデアはそれほど複雑ではありません:Nginxを介してサーバーリクエストを介してstaticをスローします。そうでない場合は、キャッシュデータをVarnish + Pressflowに、PHPから何かが必要な場合はApacheに移動します。



ステップ1:Pressflowをインストールする


Pressflowのインストールは、実際にはDrupalのインストールと同じです:)

fourkitchens.com/pressflow-makes-drupal-scale/installation



ステップ2:Pressflowを構成する


mysite.com/admin/settings/performanceにアクセスして、キャッシュを有効にします。 それだけです。



ステップ3:ニスをインストールする


SSHやLinuxの概念からかけ離れている場合は、ホストへのVarnishのインストール要求を作成してみてください。 このマニュアルは、FreeBSD www.varnish-cache.org/installation/freebsdで使用しました 。 すべてが非常に簡単です。



ステップ4:ワニスを構成する


これは、システム全体を構成する上で最も難しいポイントの1つです。



1.ニスのデーモンとニスのログの起動を構成ファイル/etc/rc.confに追加します。

varnishd_enable = "YES"

varnishlog_enable = "YES"

2.ワニスデーモンのデフォルト設定を変更します。

${varnishd_enable:="NO"}

${varnishd_pidfile:="/var/run/${name}.pid"}

${varnishd_listen:=":8081"}

${varnishd_admin:="localhost:8090"}

${varnishd_backend:="localhost:8080"}

${varnishd_config:="/usr/local/etc/varnish/default.vcl"}

${varnishd_storage:="file,/usr/local/varnish.cache,1G"}

${varnishd_hash:="classic,16383"}

${varnishd_user:="www"}

${varnishd_group:="www"}






前述のように、私のサーバーでは、Nginxはポート80とApache 8080でリッスンします。ポート8081で盗聴するようにVarnishを設定し、再びApacheに転送します。つまり、ポート8080です。



ここに:

-varnishd_config-デフォルトのニスの動作設定ファイルへのパス

-varnishd_storage-キャッシュファイルのサイズとパス



3.ニスをPressflowで動作するように設定します。

backend default {

.host = "127.0.0.1";

.port = "8080";

.connect_timeout = 600s;

.first_byte_timeout = 600s;

.between_bytes_timeout = 600s;

}



sub vcl_recv {

if (req.request != "GET" &&

req.request != "HEAD" &&

req.request != "PUT" &&

req.request != "POST" &&

req.request != "TRACE" &&

req.request != "OPTIONS" &&

req.request != "DELETE") {

/* Non-RFC2616 or CONNECT which is weird. */

return (pipe);

}



if (req.request != "GET" && req.request != "HEAD") {

/* We only deal with GET and HEAD by default */

return (pass);

}



// Remove has_js and Google Analytics cookies.

set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(__[az]+)=[^;]*", "");



// To users: if you have additional cookies being set by your system (eg

// from a javascript analytics file or similar) you will need to add VCL

// at this point to strip these cookies from the req object, otherwise

// Varnish will not cache the response. This is safe for cookies that your

// backed (Drupal) doesn't process.

//

// Again, the common example is an analytics or other Javascript add-on.

// You should do this here, before the other cookie stuff, or by adding

// to the regular-expression above.



// Remove a ";" prefix, if present.

set req.http.Cookie = regsub(req.http.Cookie, "^;\s*", "");

// Remove empty cookies.

if (req.http.Cookie ~ "^\s*$") {

unset req.http.Cookie;

}



if (req.http.Authorization || req.http.Cookie) {

/* Not cacheable by default */

return (pass);

}



// Skip the Varnish cache for install, update, and cron

if (req.url ~ "install\.php|update\.php|cron\.php") {

return (pass);

}



// Normalize the Accept-Encoding header

// as per: varnish-cache.org/wiki/FAQ/Compression

if (req.http.Accept-Encoding) {

if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|tbz|mp3|ogg)$") {

# No point in compressing these

remove req.http.Accept-Encoding;

}

elsif (req.http.Accept-Encoding ~ "gzip") {

set req.http.Accept-Encoding = "gzip";

}

else {

# Unknown or deflate algorithm

remove req.http.Accept-Encoding;

}

}



// Let's have a little grace

set req.grace = 30s;



return (lookup);

}



sub vcl_hash {

if (req.http.Cookie) {

set req.hash += req.http.Cookie;

}

}



// Strip any cookies before an image/js/css is inserted into cache.

sub vcl_fetch {

if (req.url ~ "\.(png|gif|jpg|swf|css|js)$") {

// This is for Varnish 2.0; replace obj with beresp if you're running

// Varnish 2.1 or later.

unset beresp.http.set-cookie;

}

}



sub vcl_error {

// Let's deliver a friendlier error page.

// You can customize this as you wish.

set obj.http.Content-Type = "text/html; charset=utf-8";

synthetic {"

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

"} obj.status " " obj.response {"

< type="text/css">

#page {width: 400px; padding: 10px; margin: 20px auto; border: 1px solid black; background-color: #FFF;}

p {margin-left:20px;}

body {background-color: #DDD; margin: auto;}

</>



<1>Page Could Not Be Loaded</1>

We're very sorry, but the page could not be loaded properly. This should be fixed very soon, and we apologize for any inconvenience.

< /> <4>Debug Info:</4>

<>

Status: "} obj.status {"

Response: "} obj.response {"

XID: "} req.xid {"

</>

<>< href="http://www.varnish-cache.org/">Varnish</></>







"};

return (deliver);

}






3. NgnixをVarnishで動作するように構成します。

server {

listen 62.xxx.xx.xx:80;

server_name mysite.com www.mysite.com;

rewrite ^(/manager/.*)$>https://$host$1>permanent;

rewrite>^(/manager/.*)$>https://$host$1>permanent;

location ~* ^/(webstat/|awstats|webmail/|myadmin/|manimg/) {

proxy_pass 62.xxx.xx.xx:8080;

proxy_redirect mysite.com:8080/ /;

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header X-Real-IP $remote_addr;

}

location / {

proxy_pass 62.xxx.xx.xx:8081;

proxy_redirect mysite.com:8081/ /;

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header X-Real-IP $remote_addr;

}

location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar)$ {

root /home/cross/data/www/mysite.com;

access_log /home/httpd-logs/mysite.com.access.log;

error_page 404 = @fallback;

}

location @fallback {

proxy_pass 62.xxx.xx.xx:8080;

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header X-Real-IP $remote_addr;

}

}






ステップ5:サーバーの再起動



ここで、Varnishが実行されていることを確認する必要があります。ターミナルで「top」コマンドを実行し、ニス処理が実行されていることを確認してください。

Varnish + Pressflowが機能することを確認します-SSHでvarnishlogコマンドを実行し、サイトmysite.comを開こうとすると、varnishlogがHTTPヘッダーを表示します。これはすべてが正常に機能することを意味します。



これらすべての設定の後、私はもう一度loadimpactテストを実行し、次の結果を得ました。



画像



これで状況は大幅に改善され、サーバーからの遅延は安定し、トラフィックが増加してもサーバーはクラッシュしません。



これらの簡単な設定により、サーバーでPressflow + Nginx + Varnishが起動し、Drupalが高速化されます。



また、NginxにはDrupal-wiki.nginx.org/Drupal用の特別な設定があることがわかりました



追加リンク:






All Articles