「まだApache使ってます?」さくらVPSでnginx + mysql + php-fastcgi(サーバ構築 2/3)

Movable Type Web制作 開発環境

こんにちは、及川です。

ブルーカラーを遮って眼精疲労を軽減してくれるJ!NSのモイスチャーメガネを愛用しています。
実はレンズの横に水を入れるポケットがあってドライアイを防いでくれるというすぐれもの!
すっかりコンタクトからメガネに逆戻りしちゃいました。

前回「お金がない!?さくらVPSなら月額980円でYahoo砲にも耐えちゃうよ!(サーバ構築 1/3)」につづいて、さくらVPSの環境構築を行います。
ファイアーウォールやユーザーの追加などを行ったので、次はWebページを公開できるようにWebサーバと、Movable Typeが推奨するデータベースとしてMySQL、PHPを動かせるようにfast-phpというPHPサーバをインストールする手順をまとめました。

弊社のWeb制作でもよくつかうMovable Type 5.2を、PSGI/Plack環境で動かすことを目的としています。
OSはさくらVPSのデフォルトであるCentOS 6系です。

nginxをインストール

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

# nginxの実行ユーザーを追加
$ useradd -s /sbin/nologin nginx

# 関連するライブラリを同時にインストール
yum install nginx gd openssl openssl-devel curl curl-devel

nginxをインストールができたら、php-fastcgiの設定も追加しなければならないので設定ファイルを変更する前に先にMySQLとphpをインストールします。

MySQLのインストール

今回はお手軽インストールを目指しているのでyumでインストールします。
CentOS 6ではyumでMySQLをインストールすると、バージョンが5.1になってしまうので、最新バージョンを利用したいときは、OSのディストリビューションにあうrpmをOracleのサイトから探してきてインストールします。

最近話題のMariaDBなども取り上げたいところですが、まずは基本的なところからおさえていきます。

$ yum -y install mysql mysql-server mysql-client mysql-devel

設定ファイル、my.cnfを編集します。文字コードはUTF-8、データベースエンジンは主にInnoDBを利用することが多いという前提です。
もし、MySQL 5.5以上をご利用の場合は、default-character-setの代わりにcharacter-set-serverに変更しないとエラーになるので注意が必要です。

今回は5.1の場合の例です。

$ vi /etc/my.cnf

[mysqld]
max_connections = 200
key_buffer = 128M
max_allowed_packet = 1M
table_cache = 256
sort_buffer_size = 512K
read_buffer_size = 512K
read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
user=mysql

default-character-set = utf8
# 5.5以上の場合は以下をアンコメント
#character-set-server = utf8

innodb_data_home_dir = /var/lib/mysql/ibdata
innodb_data_file_path = ibdata1:10M:autoextend
innodb_file_per_table
innodb_log_group_home_dir = /var/lib/mysql/iblogs
innodb_buffer_pool_size = 64M
innodb_additional_mem_pool_size = 20M

innodb_log_file_size = 64M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50

socket=/var/lib/mysql/mysql.sock

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

log-bin


[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[mysqldump]
default-character-set = utf8

[mysql]
default-character-set = utf8

次はPHPをインストールします。

PHPとphp-fastcgiをインストール

ここでもかんたんにyumでインストールします。phpのアプリケーションを想定しているわけではないので、あまり多くはインストールしません。
必要に応じて、利用するphp関連のライブラリを追加してください。

$ yum install php php-mysql php-mbstring php-pear php-gd php-cgi spawn-fcgi

ここで、必要があればphp.iniを修正します。

デーモンの実行ファイルを作成して、実行権限を付与します。 デフォルトのポート番号は9000番ですが、環境に合わせて変更することもできます。

$ vi /usr/bin/php-fastcgi
#!/bin/sh
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 6 -u nginx -f /usr/bin/php-cgi

$ chmod 755 /usr/bin/php-fastcgi

サービス実行のため、スクリプトを作成します。

$ vi /etc/init.d/php-fastcgi
#!/bin/sh
#
# chkconfig: 2345 85 15
# description: php-cgi - php-fastcgi swaping via  spawn-fcgi
#
. /etc/rc.d/init.d/functions
. /etc/sysconfig/network
[ "$NETWORKING" = "no" ] && exit 0
spawnfcgi="/usr/bin/spawn-fcgi"
php_cgi="/usr/bin/php-cgi"
prog=$(basename $php_cgi)
server_ip=127.0.0.1
server_port=9000
server_user=nginx
server_group=nginx
server_childs=5
pidfile="/var/run/php_cgi.pid"
[ -f /etc/sysconfig/phpfastcgi ] && . /etc/sysconfig/phpfastcgi
start() {
    [ -x $php_cgi ] || exit 1
    [ -x $spawnfcgi ] || exit 2
    echo -n $"Starting $prog: "
    daemon $spawnfcgi -a ${server_ip} -p ${server_port} -u ${server_user} -g ${server_group} -P ${pidfile} -C ${server_childs} -f ${php_cgi}
    retval=$?
    echo
    return $retval
}
stop() {
    echo -n $"Stopping $prog: "
    #killproc -p ${pidfile} $prog -QUIT
    killproc $prog
    retval=$?
    echo
    [ -f ${pidfile} ] && /bin/rm -f ${pidfile}
    return $retval
}
restart(){
    stop
    sleep 2
    start
}
rh_status(){
    status -p ${pidfile} $prog}
case "$1" in
    start)
        start;;
    stop)
        stop;;
    restart)
        restart;;
    status)
        rh_status;;
    *)
        echo $"Usage: $0 {start|stop|restart|status}"
        exit 3
esac

実行権限を付与して起動してみます。

$ chmod 755 /etc/init.d/php-fastcgi
$ /etc/init.d/php-fastcgi start 

以下のコマンドで、/usr/bin/php-cgiのプロセスが複数起動していれば成功です。

$ ps aux | grep "/usr/bin/php-cgi"

公開するドメインをVirtualHostで設定する

Webサイトを公開するドメインやDocumentRootを決めて、設定ファイルを作成します。
以下はWebサイトを公開するときの基本設定です。

ポイントは、次の4つです。

(1) PSGI/PlackサーバのstarmanにMovable Typeへのリクエストを転送
(2) gzipでレスポンスを高速化
(3) 拡張子phpファイルのリク絵うsとをphp-fastcgiへ転送
(4) .で始まるファイルやディレクトリへのアクセスを拒否

$ vim /etc/nginx/conf.d/blog.sr-engine.com.conf

#
# A virtual host using mix of IP-, name-, and port-based configuration
#

upstream example_com_starman {
  server unix:/tmp/example.com_starman.sock;
}
server {
    listen       80;
    server_name example.com;
    access_log /var/log/nginx/example.com/access.log main;
    error_log /var/log/nginx/example.com/error.log;

    root /var/www/example.com/html;
    client_max_body_size 20M;

    gzip on;
    gzip_http_version 1.0;
    gzip_types text/plain
               text/xml
               text/css
               application/xml
               application/xhtml+xml
               application/rss+xml
               application/javascript
               application/x-javascript
               application/x-httpd-php;
    gzip_disable "MSIE [1-6]\.";
    gzip_disable "Mozilla/4";
    gzip_proxied any;
    gzip_vary on;
    gzip_buffers 4 8k;
    gzip_min_length 1100;

    location / {
      index  index.php index.html index.htm;
    }
    location ~ .*\.(jpg|JPG|gif|GIF|png|PNG|swf|SWF|css|CSS|js|JS|inc|INC|ico|ICO) {
        expires 7d;
        break;
    }
    location ~ \.php$ {
        include        fastcgi_params;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/example.com/html/$fastcgi_script_name;
        fastcgi_param  PHP_VALUE "include_path=.:/usr/local/lib/php:/var/www/example.com/html:/var/www/example.com/html/includes";
    }
    location ~ /mt/ {
        proxy_pass http://example_com_starman;
    }
    location /favicon.ico {
        log_not_found off;
    }
    location ~ ^(\.ht|\.git|\.svn) {
        deny  all;
    }
}

SSLを設定したい、CGIをPSGI/Plackでなく動かしたい、など要望に応じてnginxの設定は変更してください。機会があればまたまとめたいと思います。

基本的な準備はできたので、次回はMovable Typeを動かすためにPSGI/Plackの代名詞と言っていいmiyagawaさんが開発したStarmanの導入と、Movable Typeの管理画面の表示速度についてかいていきます。

商品・サービスへのお問い合わせ

ご相談、お見積もりのご依頼など

お問い合せはこちら