昨夜、私はnginx httpサーバーをapacheのフロントエンドとして大騒ぎしました。 ご存知のように、
nginxは
Igor Sysoev (
Ramblerの従業員)によって書かれた軽量で信頼性の高いHTTPサーバーです。 特に負荷がかかっている静的ページの生成に最適です。 通常、nginx + apacheの束が構成されます。nginxは、サーバーに入るすべての要求を処理し、静的ファイルを独自に提供し、動的コンテンツのプロキシをApacheのプロキシに渡します。
したがって、インターネット上でこのペアの作業を設定する際には、ロシア語を含む多くの記事があり、これについて書くことは意味がありません。 そして、昨日、nginxを適切なモードで動作するように構成するときに遭遇した微妙な違いについて詳しく説明し、同時にこのサーバーの構成を表示してコメントします。
私の設定
手始めに、実際に何をする必要がありましたか? サーバーは
Habrometer用に構成されました。 静的(ロゴとcss)と動的(実際のサイトページとpngハブ)を生成することになっていた。 同時に、habrometerがキャッシュにない場合は、その場で作成されることを考慮する必要がありました(新しいデータを要求する場合、キャッシュは2時間ごとに消去されます)。 サイトページもキャッシュする必要があります。 それはそのような仕事でした。
実装は次のように決定されました。 nginxは、リクエストを処理する際に次のルールに従う必要があります。
- 静的が要求された場合は、それを返すだけです(スタッフパパのすべての静的)。
- サイトページが要求された場合は、キャッシュを確認してください。 ファイルがキャッシュに見つからない場合、リクエストをApacheバックエンドに渡します。 ページキャッシュは、特定の頻度で消去する必要があります(ページが異なると、頻度も異なります)。
- 情報提供者が要求された場合、ファイルの存在についてキャッシュをチェックする必要があります。 ファイルが存在しない場合、リクエストをバックエンドに送信します。
habrometersのキャッシュには、ファイルシステムが選択されます。 生成されたすべてのインフォーマは/ image_cache /ディレクトリに追加され、ソースデータの更新時に2時間ごとにクリーンアップされます。 インフォーマーは、要求に応じてPHPスクリプトによって描画され、このディレクトリに配置されます。
Memcacheは、サイトページをキャッシュするために選択されました。 (nginxとPHPの両方から)作業するのは簡単で便利です。また、指定された時間間隔でキャッシュされたページを消去できます。FSは追加のスクリプトなしでは実行できません。 はい。memcacheはより高速に動作します。 すべての良いものはRAMに保存されます。
次のサーバー構成が取得されました。
#cat /etc/nginx/nginx.conf
ユーザーwww-data;
worker_processes 4;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
イベント{
worker_connections 1024;
}
http {
/etc/nginx/mime.typesを含めます。
default_type application / octet-stream;
access_log /var/log/nginx/access.log;
sendfile on;
keepalive_timeout 65;
tcp_nodelay on;
gzip on;
add_header Habrometr "hacker_mode_enabled;)";
サーバー{
80を聞きます。
server_name habrometr.server.valera.ws habrometr.ru www.habrometr.ru;
access_log /var/log/nginx/habrometr.access.log;
場所/ {
ルート/ホーム/ habrometr / public_html;
index index.html index.htm;
if(-f $ document_root / image_cache $ {uri}){
書き直し^。* $ / image_cache / $ uri last;
休憩;
}
set memcached_key "habrometr $ uri";
memcached_pass localhost:11211;
#memcachedでリソースが見つからない場合は、Apacheにリクエストを送信します
error_page 404 502 504 = @backend;
add_header Content-Type "text / html; charset = UTF-8";
gzip on;
gzip_proxied any;
gzip_types application / octet-stream;
}
場所@backend {
set $ proxy_uri http://habrometr.ru:99999$request_uri;
proxy_pass $ proxy_uri;
proxy_redirect off;
proxy_set_header X-Real-IP $ remote_addr;
proxy_set_header X_Forwarded-For $ proxy_add_x_forwarded_for;
proxy_connect_timeout 20;
}
location / image_cache / {
ルート/ホーム/ habrometr / public_html;
変更された有効期限+ 2時間。 #ファイルの変更後2時間でキャッシュの有効期限が切れる
}
場所/スタッフ/ {
ルート/ホーム/ habrometr / public_html;
有効期限は30日です。
}
場所〜/\.ht {
すべてを拒否します。
}
}
上記のシナリオを考えると、構成全体が明確になります。
habrometr.ru:99999はリクエストがリダイレクトされるApacheであることに注意してください。 もちろん、ポートを変更しましたが、実際には通常8080などを使用します。
手品
そして今、それはこの構成では自明ではありません(いずれにしても、この分野の初心者にとって)。
バージョン
まず、私のサーバーはDebian 4.0で動作します。 自然に標準リポジトリからすべてのソフトウェアをインストールしました。 そこから配信され、nginx。 インストールされたnginxは、重要な
変更点を含む最新バージョン0.7を備えたバージョン0.4であることが判明しました。
バージョン0.4では、必要な機能の多くを実行できないことが判明しました。 特に:
- expireディレクティブの変更フラグは存在しませんが、インフォーマーキャッシュの有効期限を指定する必要がありました(作成後2時間:expire modified + 2h)。
- proxy_passは変数の使用方法を知りませんでしたが、この機能が必要でした。
- memcachedは$ memcached_key変数を使用してキーを決定しませんでした。 必要な形式のキーを設定することは不可能でした。
原則として、これらの問題はすべて逆の方法で解決できますが、私はこれをまったくしたくありませんでしたので、原材料から最新バージョンのnginxをインストールしました。 幸いなことに、これは非常に簡単に行われます。
インストールプロセスを説明する前に、ソースからビルドする場合、デフォルトですべてのnginxファイルが/ usr / local / nginxディレクトリに追加されることに注意してください。 もちろん変更できます(--prefix =)。 しかし、パッケージからインストールされたnginxは、対応するシステムディレクトリ(/ etc、/ var / log、/ var / runなど)にファイルを分散させることに注意してください、私は個人的に/ usr / local / nginxよりも間違いなく好きです/ *。 したがって、システムディレクトリの設定を使用して生のソースからnginxをコンパイルし、make installの代わりに、/ usr / sbinディレクトリの古いサーバーバイナリを新しいディレクトリ(/ usr / sbin / nginx)に手動で置き換えました。 サーバーのビルド後に重要なファイルはなくなりました。 もちろん、設定は同じままです。
そのため、ソースから古いバージョンのインストール済みパッケージを介してDebianエッチングにnginxをインストールします。
#wget http://sysoev.ru/nginx/nginx-0.7.31.tar.gz
#tar xzf nginx-0.7.31.tar.gz
#cd nginx-0.7.31
#apt-get install libpcre3 libpcre3-dev libpcrecpp0
#/etc/init.d/nginx stop;
#./configure --sbin-path = / usr / local / sbin --with-http_ssl_module
--without-mail_pop3_module --without-mail_imap_module
--without-mail_smtp_module --prefix = / var / lib / nginx
--sbin-path = / usr / sbin --conf-path = / etc / nginx /
--error-log-path = / var / log / nginx --http-log-path = / var / log / nginx
--pid-path = / var / run --lock-path = / var / lock
#cd objs
#cp -f ./nginx / usr / sbin
#/etc/init.d/nginx start;
その後、新しいnginxサーバーを起動してリクエストを処理する必要があります。これにより、必要なすべてのことを実行できます。
memcachedからのドキュメント
nginxがファイルを直接提供する場合、指定されたファイルのタイプに従ってContent-typeヘッダーを渡します。 nginxがApacheをプロキシする場合、Content-typeはApacheに由来します。 ただし、nginxがmemcachedからドキュメントを取得する場合、Content-typeは設定されません。 そのため、デフォルトのものが使用されます。 そして、設定のデフォルトはdefault_type application / octet-stream;であり、これは正しいです。 この場合、ドキュメントがキャッシュから送信されると、タイプが誤って転送され、一部のブラウザーはHTMLページを開く代わりにバイナリファイルを保存することを提案します。 状況を修正するために、memcachedからの反動の場合、ヘッダー(および、ちなみに圧縮も)を追加で設定します。
set memcached_key "habrometr $ uri";
memcached_pass localhost:11211;
error_page 404 502 504 = @backend;
add_header Content-Type "text / html; charset = UTF-8";
gzip on;
gzip_proxied any;
gzip_types application / octet-stream;
同時に、memcachedからUTF-8のHTMLのみを取得します。
個別に飛んで、カツレツを個別に。
別の魔法として、ファイル名でhabrometerを選択し、特別な方法でそれらを提供するまさにその方法を強調したいと思います。 場所/セクションで、次のファイルを選択します。
if(-f $ document_root / image_cache $ {uri}){
書き直し^。* $ / image_cache / $ uri last;
休憩;
}
キャッシュ内にファイルが見つかった場合は、次の更新(ファイル変更+ 2時間)の前にファイルをキャッシュできると言って、ユーザーにそれを返すだけです。
location / image_cache / {
ルート/ホーム/ habrometr / public_html;
変更された有効期限+ 2時間。
}
rewrite lastフラグとbreakディレクティブに注意してください。 彼女の後。 これらの2つのディレクティブを使用しないと、nginx 0.4を取得できませんでした(0.7をチェックしませんでした)すぐに場所/ image_cache /セクション、つまり ファイルを検出した後、彼はスキャンに進みましたが、これは正しくありません。