暇人じゃない

さくら VPS の Ubuntu 10.04 に nginx + PHP(FastCGI) な Web サーバーを構築する

追記: nginx + php-fpm で構築するほうがおすすめです。
Debian Squeeze に nginx + php-fpm な Web サーバーを構築する


さくらの VPS を借りたものの、Tiarra を入れるぐらいしかいじくっていなかったので、Coreserver で運用しているこのブログを VPS に移行する事にしました。
@key3 さんが nginx 良いよーと言っていたので定番の Apache ではなく結構軽くて流行っているらしい nginx + PHP(FastCGI) で Web サーバーを構築しました。
「nginx」名前がかっこいいですね!「えんじんえっくす」と呼ぶらしいです。

環境:

nginx のインストール

Ubuntu に登録されている標準のリポジトリではバージョンが以下のように結構古いので、 nginx のリポジトリを追加します。

$ sudo aptitude show nginx
パッケージ: nginx
状態: インストールされていません
バージョン: 0.7.65-1ubuntu2

リポジトリの追加

以下のように su で root になって echo でも良いですが、なんかやだ!って人は sudo vim などで source.list を開いて書き加えると良いと思います。

$ sudo su -
# echo "deb http://ppa.launchpad.net/nginx/stable/ubuntu lucid main" >> /etc/apt/sources.list
# exit
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys C300EE8C
$ sudo aptitude update
$ sudo aptitude show nginx
パッケージ: nginx
状態: インストールされていません
バージョン: 0.8.53-0ppa2

aptitude update で nginx の最新バージョンが反映されたので、aptitude install します。

$ sudo aptitude install nginx
$ nginx -v
nginx version: nginx/0.8.52

これで 2010/10/24 時点の最新バージョン 0.8.53 がインストールされまし…
…あ、あれ、0.8.52 になってますね… 変更し忘れたのかな?
とりあえず nginx インストールは完了したという事にしましょう。

PHP + spawn-fcgi

PHP と spawn-fcgi のインストール

まっさらなサーバーなので、PHP と FastCGI を動作させるための spawn-fcgi をインストールします。

$ sudo aptitude install php5-cli php5-cgi php5-gd spawn-fcgi

spawn-fcgi のラッパースクリプトを作成

/usr/bin/ 以下に php-fastcgi というファイル名で作成します。

#!/bin/sh
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 6 -u www-data -f /usr/bin/php5-cgi

作成したら、スクリプトに実行権を与えます。

$ sudo chmod a+x /usr/bin/php-fastcgi

fast-cgi の起動スクリプトを作成

/etc/init.d/ 以下に php-fastcgi というファイル名で作成します。

#!/bin/bash
PHP_SCRIPT=/usr/bin/php-fastcgi
FASTCGI_USER=www-data
RETVAL=0
case "$1" in
    start)
        su - $FASTCGI_USER -c $PHP_SCRIPT
        RETVAL=$?
    ;;
    stop)
        killall -9 php5-cgi
        RETVAL=$?
    ;;
    restart)
        killall -9 php5-cgi
        su - $FASTCGI_USER -c $PHP_SCRIPT
        RETVAL=$?
    ;;
    *)
        echo "Usage: php-fastcgi {start|stop|restart}"
        exit 1
    ;;
esac
exit $RETVAL
console output

作成したら、スクリプトに実行権を与え、システム起動時に自動起動させるようにして、FastCGI を起動します。

$ sudo chmod a+x /etc/init.d/php-fastcgi
$ sudo update-rc.d php-fastcgi defaults
$ sudo /etc/init.d/php-fastcgi start

nginx の設定

サイトのファイルを置くディレクトリを作成

バーチャルホストを設定したいので、/var/www/ 以下にドメイン名ごとにディレクトリを置くようにしました。

$ sudo mkdir -p /var/www/hoge.com/{logs,public_html}
$ sudo chown -R www-data:www-data /var/www/hoge.com/

サイト用の設定ファイルを作成

/etc/nginx/sites-available/ 以下にサイト用の設定ファイルを作成します。
sites-available や sites-enabled は Ubuntu の Apache に似ていますね。
hoge.com は適宜読み替えてください。

初期状態で有効になっている default は sites-enabled から削除しておきます。

$ sudo rm /etc/nginx/sites-enabled/default

hoge.com 用の設定ファイルを作成

$ sudo vim /etc/nginx/sites-available/hoge.com

設定ファイルの内容はこんな感じ。

server {
    listen  80;
    server_name hoge.com;
    access_log  /var/www/hoge.com/logs/access.log;
    error_log   /var/www/hoge.com/logs/error.log;

    location / {
        root /var/www/hoge.com/public_html;
        index index.html index.htm index.php;
    }

    location ~ \.php$ {
        include /etc/nginx/fastcgi_params;
        fastcgi_pass    127.0.0.1:9000;
        fastcgi_index   index.php;
        fastcgi_param   SCRIPT_FILENAME /var/www/hoge.com/public_html$fastcgi_script_name;
    }

    location ~ /\.ht {
        deny  all;
    }
}

内容自体はとてもシンプルなので、Apache を設定した事があれば説明は必要ないかと思います。

サイトの有効化
Ubuntu の a2ensite や a2dissite のように、名前を指定するとsites-enabled にシンボリックリンクを張ってくれるコマンドは用意されていないので、手動でシンボリックリンクを張る必要があります。

sudo ln -s /etc/nginx/sites-available/hoge.com /etc/nginx/sites-enabled/

nginx の起動

今回は nginx.conf については手を加えませんでした。 worker_processes なんか面白そうですね。 その辺りは追々見ていきたいなと思います。

aptitude で nginx をインストールした場合は

$ sudo update-rc.d nginx defaults

して自動起動するように設定する必要はありません。

では、nginx を起動してみましょう。

$ sudo /etc/init.d/nginx start

とコマンドを叩くと、エラーが無ければ起動します。

ちなみに、設定ファイルをリロードするには

$ sudo nginx -s reload

文法をチェックするには

$sudo nginx -t

とコマンドを叩きます。

動作確認

public_html ディレクトリに適当な index.html や、phpinfo() を記述した index.php を作成し、サーバーにアクセスしてみましょう。 無事に内容が表示されたら成功です!

ちなみに…

さくら VPS は www1234u.sakura.ne.jp というドメインも標準で割り当てられているのですが、sites-enabled で有効にしているドメインにアクセスされてきた時のみ、そのサイトを表示させたいので、標準のドメインや IP アドレスでアクセスされた時にはエラーを表示するように、sites-available の default ファイルを新しく作りなおしました。 もっと良いやり方があれば教えていただきたいです。

server {
    listen  80;
    server_name www1234u.sakura.ne.jp 123.456.789.12;
    deny all;
}     

ついでに WordPress を動かしてみた

ついでに WordPress を動かしてみました。 データベースを作成し、/wp-admin/install.php にアクセス。 インストールが終了し、管理画面とトップページについては問題は起きず WordPress が動いてくれました。

まあ、この後、色々とハマりまくった訳ですが、それはまた今度…

比較的簡単に nginx をセットアップする事ができました! Apache と使い勝手が違う部分はありますが、これはこれで新鮮で良いですね。

参考サイト

Install(nginx Wiki)
http://wiki.nginx.org/Install

Configuration(nginx Wiki)
http://wiki.nginx.org/Configuration

PHP-FastCGI with Nginx - Nginx and PHP-FastCGI on Ubuntu 10.04 LTS (Lucid) - Linode Library
http://library.linode.com/web-servers/nginx/php-fastcgi/ubuntu-10.04-lucid