nginxでプロキシを使用し、言語ごとにキャッシュを分割する場合のSSIのマッピング

Ubuntuを実行しているサーバー上のnginx + apacheの束でキャッシュを構成しました。 仕事の過程で出会ったいくつかのニュアンスを共有したいと思います。 また、nginxのssi命令を表示し、言語Cookieに基づいてキャッシュを共有するという問題があります。

nginxでプロキシを使用するときにSSIを表示する際の問題


ssiを使用して動的ブロックを表示することにしました。 ローカルマシンではすべて正常に機能しましたが、ssiサーバーへのアップロード後にブロックは処理されませんでした。
プロキシWebサーバーとして、Apacheが使用されます。 一連の実験の後、fastcgiを使用すると、ssiブロックが完全に処理されることがわかりました。 つまり、問題はApacheプロキシサーバーにあります。
彼は、ローカルマシンおよびサーバー上のApacheヘッダーの分析を開始しました。
$curl -I http://apache_host:port 

興味深い見出しに気づいた
 Vary: Accept-Encoding 

ここで説明を見つけました。 つまり、ヘッダーを送信して圧縮を設定できます。
 $curl -I -H 'Accept-Encoding: gzip,deflate' http://apache_host:port ... Content-Encoding: gzip ... 

つまり、プロキシサーバーはコンテンツを圧縮形式で提供し、nginxはssi命令を解析できませんでした。
Apacheでの圧縮には、mod_deflateが責任を負います。 これはすべて、このモジュールを無効にすることで処理できます。
 $a2dismod deflate Module deflate disabled. Run '/etc/init.d/apache2 restart' to activate new configuration! $/etc/init.d/apache2 restart 


言語キャッシュ分離の設定


私が設定したサイトでは、言語はCookieを使用して設定されています。つまり、一意のURLはありません(これは既にSEO用です:))。
異なる言語のキャッシュを分割するために、キーを使用しました:
 proxy_cache_key "$request_method|$http_if_modified_since|$http_if_none_match|$host|$request_uri|$lang"; 

最後のパラメーター$ langに注意してください。 それをインストールするには、ngx_http_map_moduleを使用しました。
 map $http_accept_language $browser_lang { default en; ~ru ru; ~da da; ~de de; } map $cookie_name_of_language_cookie $lang { default $browser_lang; ~en en; ~de de; ~ru ru; ~da da; } server { ........... } 

最初のディレクティブはブラウザの言語を定義し、言語Cookieがない場合はデフォルトで2番目に使用されます。 modはhttpコンテキストに追加する必要があることに注意してください。私の場合は、サーバーの前に追加しました。
これで、ユーザーが知らない言語のページをキャッシュから受け取らないことが保証されます。


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


All Articles