WordPress高速化: Debian 6.0 (squeeze)にnginxを導入する その1

LINEで送る
Pocket

前回はWebサイトを高速化しようとしてApache用のmod_pagespeedを導入したものの効果がでず無効にしたことを紹介しました。

今回は根本から解決するために、高速といううわさのWebサーバnginxを導入してみたいと思います。

必要なパッケージ

ゴールは当然Wordpressを動かすことなので、nginxでWordpressを動かす方法を調べてみると、nginx以外にphp-fpm(php5-fpm)というソフトウェアが必要なことがわかりました。

しかし、Debian 6.0(Squeeze)にはphp-fpmあるいはphp5-fpmというパッケージはありません。

# apt-cache search php5-fpm
(何も表示されない)
# apt-cache search php-fpm
(何も表示されない)

そこでまずは、Debian 6.0(Squeeze)にnginxとphp-fpmを導入するところからはじめます。

nginxとphp-fpmの導入

Google検索してみると、いくつか参考になるサイトがありました。

どうも公式のパッケージではなくdotdeb.orgというところで配布されているパッケージを使うようです。

それでは導入していきます。

まずはapt-lineを追加します。

# echo deb http://packages.dotdeb.org stable all > /etc/apt/sources.list.d/dotdeb.list

dotdeb.orgのPGPキーを追加します。

# wget http://www.dotdeb.org/dotdeb.gpg
# cat dotdeb.gpg | apt-key add -

パッケージリストをアップデートします。

# apt-get update

php関係のパッケージインストールします。

# apt-get install php5 php5-fpm php-pear php5-common php5-mcrypt php5-mysql php5-cli php5-gd

念のためphpのバージョンを確認してみます。

# php -v
PHP 5.3.21-1~dotdeb.0 with Suhosin-Patch (cli) (built: Jan 27 2013 11:25:03)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2013 Zend Technologies
with Suhosin v0.9.32.1, Copyright (c) 2007-2010, by SektionEins GmbH

nginxをインストールします。

# apt-get install nginx

php-fpmを起動します。

# /etc/init.d/php5-fpm restart

php-fpmの動作状況を確認します。

# netstat -plunt | grep php
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      7685/php-fpm.conf)

とりあえずインストールはこれで完了です。しかしこの状態ではまだnginxは動いていません。

というのもApacheがまだ動いていてnginxと競合しているからです。

まずApacheによるWebサイトを維持したまま、nginxでのWebサイトを構築していきます。具体的にはポート8080をnginxに割り当てるようにします。うまくいったらApacheを停止し、nginxにポート80(通常のWebサイト)を任せるようにします。

nginxへのWebサイトの移行

まずApacheで運用している通常の(WordPressでない)Webサイトをnginxで見れるようにします。

私は2つのドメインを持っていてちょっと変則的な運用をしています。ApacheでWebサイトを構築したときの記録から抜粋すると

  • 2つのドメインでそれぞれWebサイトを構築
  • scratchpad.jpドメインではscratchpad.jp以外にcolinux.scratchpad.jp, debian.scratchpad.jp, books.scratchpad.jpのサブドメインでもWebサイトを構築
    ただし、http://colinux.scratchpad.jp/はhttp://scratchpad.jp/colinux/としてもアクセスできるようにしておく。debianと booksのサブドメインについても一緒。
  • Webサイトのデータは「/www/ドメイン名/サブドメイン名」に置く。
    なので、http://scratchpad.jp/のデータは/www/scratchpad/に、http://colinux.scratchpad.jp/のデータは/www/scratchpad/colinux/に置く。

という形で運用しています。

以下に個別のサイトの設定方法を記します。

http://scratchpad.jp/の設定

/etc/nginx/sites-available/に下記内容のscratchpadというファイルを作成します

server {
        listen 8080;
        server_name scratchpad.jp;
        root /www/scratchpad;
        index index.html index.htm;

        if ($http_host != "scratchpad.jp") {
             rewrite ^ http://scratchpad.jp$request_uri permanent;
        }

        error_log /var/log/nginx/scratchpad-error.log notice;
        access_log /var/log/nginx/scratchpad-access.log combined;

        rewrite_log on;
        rewrite ^/colinux/(.*) http://colinux.scratchpad.jp:8080/$1 last;
        rewrite ^/debian/(.*) http://debian.scratchpad.jp:8080/$1 last;
        rewrite ^/books/(.*) http://books.scratchpad.jp:8080/$1 last;

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        location ~ /\.ht {
                deny all;
        }
}

2行目のlistenで監視するポート番号8080を指定します。

3行目のserver_nameでこの設定がscratchpad.jpいうホスト名でアクセスされた場合に適用されることを指定。

4行目のDocumentRootで、この設定で/www/scratchpad以下のファイルをコンテンツとして取り扱うことを指定。

5行目ではディレクトリを直接指定されたときに表示するファイルをindex.htmlかindex.htmとする指定

7,8行目はfoo.scratchpad.jpなど想定していないホスト名でアクセスしてきた場合は、強制的にscratchpad.jpへのアクセスに書き換える設定。

10,11行目はログファイルの指定。エラーログのレベルは最初はnoticeにしておく(後述のURL書き換え情報を表示するため)。
動作確認して問題なければnoticeの部分はwarn等に変えるとよい。

13~16行目はURLの書き換え(リダイレクト)の設定。まず10行目で書き換えログをONにしたあと、11行目から13行目で書き換えルールを指定。
14行目はhttp://scratchpad.jp/colinux/・・・でアクセスされた場合に、http://colinux.scratchpad.jp/・・・に書き換え。
15行目はhttp://scratchpad.jp/debian/・・・でアクセスされた場合に、http://debian.scratchpad.jp/・・・に書き換え。
16行目はhttp://scratchpad.jp/books/・・・でアクセスされた場合に、http://books.scratchpad.jp/に書き換え。

18~23行目は.htaccessファイルへの不正なアクセスを防ぐため。/etc/nginx/sites-available/defaultからのパクリ。

http://colinux.scratchpad.jp/の設定

/etc/nginx/sites-available/に下記内容のscratchpad-colinuxというファイルを作成します。

server {
        listen 8080;
        server_name colinux.scratchpad.jp;
        root /www/scratchpad/colinux;
        index index.html index.htm;

        error_log /var/log/nginx/scratchpad-error.log warn;
        access_log /var/log/nginx/scratchpad-access.log combined;

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        location ~ /\.ht {
                deny all;
        }
}

これは書き換えルールとかはなく、server_nameとrootの設定ぐらいで、シンプルになります。

http://debian.scratchpad.jp/の設定

/etc/nginx/sites-available/に下記内容のscratchpad-debianというファイルを作成します。

server {
        listen 8080;
        server_name debian.scratchpad.jp;
        root /www/scratchpad/debian;
        index index.html index.htm;

        error_log /var/log/nginx/scratchpad-error.log warn;
        access_log /var/log/nginx/scratchpad-access.log combined;

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        location ~ /\.ht {
                deny all;
        }
}

http://books.scratchpad.jp/の設定

/etc/nginx/sites-available/に下記内容のscratchpad-colinuxというファイルを作成します。

server {
        listen 8080;
        server_name books.scratchpad.jp;
        root /www/scratchpad/books;
        index index.html index.htm;

        error_log /var/log/nginx/scratchpad-error.log warn;
        access_log /var/log/nginx/scratchpad-access.log combined;

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        location ~ /\.ht {
                deny all;
        }
}

もう一つのドメイン用の設定

ドメイン名をexample.comとすると、/etc/nginx/sites-available/に下記内容のexampleというファイルを作成します。

server {
        listen 8080;
        server_name example.com;
        root /www/example
        index index.html index.htm;

        error_log /var/log/nginx/example-error.log warn;
        access_log /var/log/nginx/example-access.log combined;

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        location ~ /\.ht {
                deny all;
        }
}

設定の有効化

Debianではngxensiteというコマンドで、/etc/nginx/sites-availableにある設定を有効にします。今回は、scratchpad, scratchpad-colinux, scratchpad-debian, scratchpad-books, exampleを作成したので、これらの引数にしてngxensiteを実行します。

# ngxensite scratchpad
# ngxensite scratchpad-colinux
# ngxensite scratchpad-debian
# ngxensite scratchpad-books
# ngxensite example

デフォルトの設定の無効化

デフォルトで/etc/nginx/sites-availableのdefaultという設定が有効になっているので無効化しておきます。

# ngxdissite default

設定の確認

nginxでは設定ファイルが正しいかどうかをチェックする機能を持っています。この機能を使って作成した設定が問題ないかどうかを確認します。

# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

設定の読み込み

OSを再起動せずにnginxに設定ファイルを読み込ませるには以下の機能を設定します。

# /etc/init.d/nginx reload

まとめ

これでnginxで静的なWebサイトを構築することができました。
従来のURLのホスト名の部分に「:8080」でアクセスすると、nginxで生成されたWebサイトが表示されるはずです。

なお、ここで行ったnginxの設定は以前のApacheの設定と対応しています。
興味がある方はApacheの設定と比べてみると良いと思います。

次回はnginxでphpを動作させます。