nginx + Apache。 キャッシング

Hi%username%

ここで、1台のサーバーまたはVDSでキャッシュを設定する方法について説明します。 サーバー機能:2000MHz、2GB RAM、80Gb HDD、仮想化テクノロジー-OpenVZ。

Nginxバージョン0.7.64を使用することが決定されました 。 サーバーには約200のサイトがありました。 そして、いくつかの高負荷のプロジェクト。 これらのプロジェクトは、具体的なブレーキとサーバー負荷を提供しました。 この例ではDLEを検討します。

したがって、キャッシングの主なポイント:





0.「テクノロジー」を発明する



urls: index.php?Action = logout and admin.phpに行がある場合、これらのリクエストを直接Apacheに送信します。 次に、ログインしたユーザーとゲストを分離するようにnginxに教える必要があります。 クッキーを使用してそれらを共有します。 私の場合、cookie dle_user_iddle_passwordは、ユーザーがログインしていることを意味し、5分前にページを表示したくありません。 さらに、承認のためにPOSTキャストをキャッシュ外に送信する必要があります。理由と理由は明らかです(:。



1.行きましょう。 設定を書いています



実際には、完全な構成については説明しません。キャッシュに必要なポイントのみを説明します。 私は自分の決定の正確性と最適性を装ってはいませんが、ここに示されていることは戦闘状態でうまく機能します。 あまりキックしないでください、そう遠くない前に私はnginxのジャングルに登りましたが、ドキュメントとそれらの例はひどく欠けていると感じています!

構成の主なディレクティブはクリック可能であり、ドキュメントにつながります。



1.1構成自体





http {

proxy_cache_path /var/cache/nginx/cache levels=1:2 keys_zone=one:16m inactive=7d max_size=1024m;

proxy_temp_path /var/cache/nginx/temp; # http , .



server {

listen 127.0.0.1:80;

server_name example.com www.example.com;

proxy_temp_path /var/cache/nginx/example.com;



location @nocached {

proxy_pass 127.0.0.1:8080;

proxy_redirect example.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 127.0.0.1:8080;

proxy_redirect example.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;

#

if ($cookie_dle_user_id) { return 412; }

if ($cookie_dle_password) { return 412; }

if ($request_method = POST ) {

return 412;

}

error_page 412 = @nocached;

proxy_cache one;

proxy_cache_key "$request_method|$is_args|$host|$request_uri";

proxy_hide_header "Set-Cookie";

proxy_ignore_headers "Cache-Control" "Expires";

proxy_cache_valid 200 302 304 5m;

proxy_cache_valid 301 1h;

proxy_cache_valid 503 4s;

proxy_cache_valid any 1m;

proxy_cache_use_stale http_502 http_503 http_504;

}



location ~ (admin.php|index.php?action=logout) {

proxy_pass 127.0.0.1:8080;

proxy_redirect example.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|htm|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar)$ {

root /var/www/example/data/www/example.com;

expires 1y;

access_log /var/www/httpd-logs/example.com.access.log;

error_page 404 = @fallback;

}

location @fallback {

proxy_pass 127.0.0.1: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;

}

}

}









$ cookie_name、この変数はcookie名と同じです。



実際、ここで話してきたことをさらに分析します。 改善や編集の提案を歓迎します!



2.デブリーフィング





そのため、ユーザーを2つのタイプに区別し、タイプに応じて、ユーザーにキャッシュを提供するかどうかを決定する必要がありました。

ロケーション@nocachedでは、 2つのCookieを所有するユーザー( dle_user_iddle_password )を許可します 。したがって、これらのユーザーはキャッシュせずに直接アクセスします。 POSTリクエストは認証と登録に使用されることを既に書いています;)。したがって、それらをキャッシュする必要はありません。 この場合、$ request_methodにチェックを追加するだけです。

error_page 412 = @nocachedは実際にCookieの所有者、またはログインを試みる人を直接Apacheに送信します。

proxy_cache_keyディレクティブに注意してください。 その中で、キーについては、ページの「一意性」のみを示します。つまり、誰かが「ゲスト」として私たちのページのいずれかを訪れた場合、nginxは最初の回答をプロキシし、すぐにキャッシュに入れます。 その後、割り当てられたページライフタイム(proxy_cache_valid 200 ... 5m)を満たした他のユーザーは、Apacheが前のユーザー用に生成したのと同じページを受け取ります。これは、その寿命が終わるまで続きます。 5分 その後、すべてが同じシナリオに従って続行されます。

さらに、2行に注意してください: proxy_hide_header、proxy_ignore_headersはキャッシュ時に必要です 。 Vasya PupkinがPetya VasechkinのCookieを取得できるようにしたくないため、彼に代わってPetya VasechkinのCookieを取得できます... ??? 2行目、 proxy_ignore_headers キャッシュされていないなどのマークが付けられたApache応答を保存できます。 確かに、そのような場合でも、一度キャッシュすることができたら遅いApacheをヤンクし、速いnginxでそれを返す必要があります。

proxy_cache_validパラメーターには特別な注意を払うつもりはありません。 すべてはドキュメントで既に詳しく説明されています。

proxy_cache_use_staleは非常に正しいディレクティブです。これにより、 Apacheがハングしたとき、または自分自身がハングしたとき、または死亡したときなど、それぞれ502、504エラーが発生したときにクライアントにキャッシュされた「通常」ページを与えることができます。

次の場所〜(admin.php | index.php?Action = logout)では 、文字列を含むリクエストを直接Apacheに送信したいと言います。

次の2つの場所は、静的(スタイルシートの画像など)を自分自身に与える必要があることをnginxに伝えます。 そして、nginxがそのようなファイルをディスク上で見つけられなかった場合、多分それは.htaccessにあり、Apacheはそれを私たちに与えます。



さて、これですべてです。 私のHabraトピックがあなたを助けてくれること、または将来の不快な瞬間を避ける助けになることを本当に願っています。

ご清聴ありがとうございました。



PSパーサーはhttp://を食べましたが、nginxはそれらを必要とします。どうすればそれらを復元できますか? そうしないと、configの一部をコピーするときにnginxがあなたをoldる場合があり、そうでない場合は何が起こるかわかりません。

クロスポスト



All Articles