nginxとWordPress

nginx(エンジンエックス)というWebサーバーがあります。

リクエスト毎に固有のプロセスやスレッドを割り当てずキャッシュ付きのリバースプロキシとしても利用可能な、リソースにやさしい印象のあるサーバーソフトウェアで、最近では各情報サイトやブログの記事などでもよく目にするようになりましたので、使用したことのある方も多いのではないでしょうか。

とか言いつつ私自身は結構最近になってから存在を知ったのですが、とあるサイトで使用してみていい感触だったので、ここでも導入してみることにしました。

nginxのインストール

まずはnginx自体のインストールを行います。

インストールについては、公式のyumリポジトリからビルド済みのバイナリをダウンロードする方法を選択しました。ソースからビルドした方が必要なモジュールのみを組み込む等柔軟な構成が可能かとは思いますが、個人的には出来るだけ容易に最新のアップデートに追従できる方が嬉しかったりするので、今回はこちらでいきます。

nginx: download

リンク先では、リポジトリセットアップ用のパッケージをダウンロードしてインストールする方法と手動でリポジトリの設定ファイルを作成する方法とが紹介されていますが、ここでは手動でリポジトリファイルを作成してみることにしました。

今回はCentOS6の環境にインストールするので、/etc/yum.repos.d/nginx.repoとして下記のようなファイルを作成すればOKです。なお、yum-prioritiesと共にEPELリポジトリを使用している場合は優先順位の指定に注意してください。EPELリポジトリにはバージョンが古めのnginxパッケージが登録されているようです。

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
enabled=1

ファイルを作成したら、yumコマンドを使用してnginxをインストールします。

# yum install nginx

各種設定

今回はとりあえず既存の環境にはあまり手を加えずに済むようにということで、既にApacheで構築されているWordPressの環境をバックエンドとして、nginxをキャッシュ付きのリバースプロキシとして使用しています。リバースプロキシとしてのnginxの使用経験はあるもののApache上のWordPressとの連携は未経験だったので、その辺りの設定については下記リンク先(とさらにそのリンク先の方々の情報含め)を参考にさせていただきました。

WordPress サイトに nginx を導入する : dogmap.jp

リンク先の「proxy cache を有効にする」の辺りからが肝心のApacheとの連携やキャッシュの設定のようですので、そちらを参考にさせて頂きつつパラメーター等を調整して設定を行っています。具体的な設定内容については、しばらく使いながら調整しつつある程度まとまったところで公開できたらなと思っていますが、とりあえず現時点での注意点を何点か挙げておきます。

proxy_cache_key

携帯電話やスマートフォン向けにPCとは別レイアウトのコンテンツを提供しているケースを想定し、$mobileという変数にそれぞれ固有の値を設定し末尾に連結したものをキーとされている箇所がありますが、状況によっては別のコンテンツのキャッシュを読みにいってしまう場合があります。例えば下記のような場合です。

  1. http://hogehoge.com/fugafugaとhttp://hogehoge.com/fugafuga2という2つのコンテンツを配置
  2. fugafuga2にPCでアクセス → “…fugafuga2”のキーでキャッシュされる
  3. キャッシュの有効期間内にiPhoneでfugafugaにアクセス → “…fugafuga”+“2”のキーが生成されるため、fugafuga2のキャッシュが返される

この問題を回避するため、$mobileの前に何らかの記号等を挟んだほうがよいと思われます。また、$request_uriはパラメーター文字列も含むようですので、proxy_cache_keyについては次のように設定しておきました。(そもそもこのサイトではスマートフォンや携帯向けのコンテンツ出力にはまだ対応していないので、意味がないというか無駄な設定になってしまうのですが・・・そのうち対応します(笑))

proxy_cache_key "$scheme://$host$request_uri:$mobile";

なお、$request_uri部分を$uri$is_args$argsと記述することも出来ますが、その場合はrewriteルールなどを適用後のURIがキーとなるようです。$request_uriにはブラウザから送られたオリジナルのURIが格納されているようなので、環境や要件により好ましい方を選択するようにしましょう。その他、各変数の詳細については公式のドキュメントを参照してください。

HttpCoreModule(公式ドキュメント内)

変数の初期化

$mobileや$do_not_cacheの変数について未初期化である旨の警告がerror.logに出力される場合があるようなので、各種判定を行う前(ifの前)に初期化しておきます。文字列をブーリアン値のように扱う場合、空文字列及び“0”はfalseとみなされるようですので、ここではそれぞれ“0”で初期化しています。

:
location / {
  set $mobile "0";
  set $do_not_cache "0";
    if ($http_user_agent…
:

gzip圧縮とJavaScriptコンテンツ

gzip圧縮の対象とするコンテンツのMIMEタイプをgzip_typesで指定します(“text/html”は指定しなくても常に圧縮対象となる)が、バックエンドとしてApacheを使用し特に意識してMIMEタイプの設定を行っていないような場合など、JavaScriptコンテンツに対して出力されるContent-Typeヘッダの値が“text/javascript”となっていることが多いと思いますので、対象に“text/javascript”も追加しておきましょう。

gzip圧縮と“Mozilla/4”

gzip圧縮について調べていた時、UserAgentにNetscape4でのアクセス時に圧縮を行わないよう“Mozilla/4”が含まれるものを除外対象としている設定をちらほら見かけた気がするのですが、その場合比較的最近のブラウザ(例えばIEでは8)まで除外対象となってしまいますので、設定しない方がよいかも知れません。

もし本気で旧世代のブラウザにまで気を使うのであれば、“Mozilla/4”が含まれた上で“compatible”が含まれないこと等条件を工夫すればよいのかも知れませんが、その場合はコンテンツ自体もその世代のブラウザでの閲覧を意識したものを用意する必要がありますので、このサイトではとりあえず設定しないこととしました。

まとめ

今回はとりあえず導入してみただけな感じですが、nginxは設定次第でまだまだ色々なことができますので、自分自身勉強しつつ設定等煮詰めていきたいと思っています。

カテゴリー: システム管理 | タグ: , , | コメントをどうぞ

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です