「さくらのVPS 2G」+ Ubuntuで”WordPress on nginx with FastCGI”環境を構築する

nginx,WordPress,さくらのVPS

これだけは知っておきたい サーバの常識

さくらのVPS 1.5Gから、さくらのVPS 2Gへ移行した時の作業メモです。基本的に上から下に向かって作業しています。

OSをUbuntuに入れ換え、Webサーバとしてnginxを使用し、WordPressを高速に、且つ安定して稼働させるのが目標です。

あくまで自分用メモですので、内容の正当性は保証しません。特にnginxは初めてのチャレンジなので「正しくない」設定の可能性があります。

このメモは随時更新されます。参照する場合は参考までにどうぞ。

申し込み

VPS(仮想専用サーバ)のさくらインターネット」から、「さくらのVPS 2G」の利用申請。

申し込み再開初日(2012年4月2日)だったこともあり、VPS稼働を告げるメールが届くまで1時間ほど掛かった。

OS再インストール

初期OSであるCente OSをUbuntuに差し替える。

VPSコントロールパネル → OS再インストール → カスタムOSインストールへ → Ubuntu 10.04 i386

OSインストールは「SAKURA Internet // サポート – オンラインマニュアル – カスタムOSインストールガイド : Ubuntu 10.04」を見ながらやれば間違いない。

SSHセットアップ

SSH接続用の鍵ペアを作成し、秘密鍵をローカルにコピーする。

$ cd ~
$ ssh-keygen
$ touch .ssh/authorized_keys
$ cat .ssh/id_rsa.pub >> .ssh/authorized_keys
$ cat .ssh/id_rsa
 # id_rsaをコピペ後、id_rsa.pubとid_rsaを処分
$ chmod 700 .ssh
$ chmod 600 .ssh/*

sshの設定を変更する。

$ sudo vi /etc/ssh/sshd_config

file: sshd_config
    Port xxxx   #任意の番号に変更する
    PasswordAuthentication no

ssh再起動。

$ sudo service ssh restart

nginxのインストール

aptのリストに最新版のnginxを追加する。

$ sudo vi /etc/apt/sources.list

file: /etc/apt/sources.list
    deb http://ppa.launchpad.net/nginx/stable/ubuntu lucid main

公開鍵を登録する。

$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys C300EE8C

リストが最新版に更新されたか確認する。

$ sudo aptitude update
$ sudo aptitude show nginx
Package: nginx
State: not installed
Version: 1.0.14-0ppa1~lucid

nginxのインストール。

$ sudo aptitude install nginx

nginx設定ファイルの編集。

$ sudo vi /etc/nginx/sites-available/default

file: /etc/nginx/sites-available/default
server {
        listen   80; ## listen for ipv4; this line is default and implied
        #listen   [::]:80 default ipv6only=on; ## listen for ipv6

        #root /usr/share/nginx/www;
        root /home/hide10/www;
        index index.php index.html index.htm;

        # Make site accessible from http://localhost/
        server_name www.hide10.com;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to index.html
                try_files $uri $uri/ /index.php$args;
        }

        #error_page 404 /404.html;

        # redirect server error pages to the static page /50x.html
        #
        #error_page 500 502 503 504 /50x.html;
        #location = /50x.html {
        #       root /usr/share/nginx/www;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
        #       # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
        #
        #       # With php5-cgi alone:
                fastcgi_pass 127.0.0.1:9000;
        #       # With php5-fpm:
        #       fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }

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

変更後に設定再読み込み。

$ sudo service nginx reload

エラーが出る場合は下記を参考に「/etc/nginx/fastcgi_params」を修正。

+ set $https off;
+ if ($scheme = https) {
+ set $https on;
+ }

php + fastCGIのインストール

必要なPHP関連パッケージをインストール。

$ sudo aptitude install python-software-properties
$ sudo add-apt-repository ppa:nginx/stable
$ sudo add-apt-repository ppa:brianmercer/php5
$ sudo service php5-fpm start
$ sudo aptitude install php5 php5-fpm php5-mysql php5-memcached php5-memcache php5-curl php-apc php-pear php5-mcrypt phpmyadmin memcached mysql-server mysql-client 

WordPress用データベースの作成

“DB_NAME", “USER-NAME", “PASSWORD-USER"は、wp-config.phpに設定する値。

$ mysql -u root -p
    # パスワード入力
mysql> create database DB_NAME;
mysql> create user USER-NAME@localhost identified by 'PASSWORD-USER';
mysql> grant all on DB_NAME.* TO USER-NAME@localhost;
mysql> exit

phpMyAdminのインストール

phpMyAdminのインストール。

$ sudo aptitude install phpmyadmin
    #Apache2 → Yes → パスワードx2

nginxの設定を変更して、/phpmyadminでアクセスできるようにする。

$ sudo vi /etc/nginx/sites-available/default

    file: /etc/nginx/sites-available/default
    server {

+        location /phpmyadmin {
+            root /usr/share;
+            index index.php index.html index.htm;
+            location ~ ^/phpmyadmin/(.+\.php)$ {
+                try_files $uri =404;
+                root /usr/share/;
+                fastcgi_pass 127.0.0.1:9000;
+                fastcgi_index index.php;
+                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
+                include /etc/nginx/fastcgi_params;
+            }
+            location ~* ^/phpmyadmin/(.+\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$ {
+                root /usr/share/;
+            }
+        }
+        location /phpMyAdmin {
+                rewrite ^/* /phpmyadmin last;
+        }
    }

$ sudo service nginx restart

本当は /phpmyadmin に認証を掛けたかったけど、良く分からなかったのでスルー。必要がなくなったらアクセス出来ないようにする。

WordPress用データベースのインポート

うちはDBファイルが28MBもあるので、upload_max_filesizeの設定を変更する。

$ sudo vi /etc/nginx/sites-available/default

    [ file: /etc/nginx/sites-available/default ]
            location ~ \.php$ {
                    fastcgi_split_path_info ^(.+\.php)(/.+)$;
            #       # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
            #
            #       # With php5-cgi alone:
                    fastcgi_pass 127.0.0.1:9000;
            #       # With php5-fpm:
            #       fastcgi_pass unix:/var/run/php5-fpm.sock;
                    fastcgi_index index.php;
+                    fastcgi_param PHP_VALUE "
+    upload_max_filesize = 100M
+    post_max_size = 100M
+    ";
                    include fastcgi_params;
            }

(なにかもう1個所設定を変えた気がするが忘れた…)

設定変更後、phpMyAdminを利用して、データベースファイルをインポートする。

インポート作業終了後は /etc/nginx/sites-available/defaultを再編集して、/phpmyadmin にアクセスできないようにする。

WordPressのインストール

ゴミを減らすため、新たにインストールし直し、必要なファイルのみ旧サーバからコピーする。

$ wget http://ja.wordpress.org/latest-ja.tar.gz
$ tar zxf latest-ja.tar.gz
$ mv wordpress /home/user01/www

wp-config.phpを旧サーバから上書きコピー。

https://api.wordpress.org/secret-key/1.1/salt/ にアクセスして取得したキーに書き換える。

ドメイン移行中は、wp-config.phpに下記設定を追加すると、DBの設定にかかわらず任意のURLで動作する。

    define('WP_SITEURL', 'http://example2.com');
    define('WP_HOME', 'http://example2.com');

その他、必要と思われるファイルをコピー。

WordPressのSSH2接続

WordPress: SSH2の暗号鍵を使った自動アップデートを有効にした – Hinemosu」を参考に、SSH2を使ったWordPressアップデートをセットアップする。

$ sudo aptitude install libssh2-ph
$ sudo service php5-fpm restart

wp-config.phpを編集し、WordPressのアップデート情報入力を省略する。

$ vi /home/user01/public_html/wp-config.php
    #file: wp-config.php
    define('FTP_PUBKEY','/home/user01/.ssh/id_rsa.pub');
    define('FTP_PRIKEY','/home/user01/.ssh/id_rsa');
    define('FTP_USER','user01');
    define('FTP_PASS','');
    define('FTP_HOST','localhost:xxxx');

ロケールを ja_JP.UTF-8 にする

$ sudo apt-get install language-pack-ja
$ sudo locale-gen ja_JP.UTF-8
$ sudo update-locale LANG=ja_JP.UTF-8
$ export LANG=ja_JP.UTF-8

WP Super Cacheのインストール

WP Super Cache」をインストールし、適切に設定する。

WP Super Cache設定

ntpセットアップ

ntpインストール後、ntpサーバを変更する。

$ sudo aptitude install ntp
$ sudo vi /etc/ntp.conf
    #file: ntp.conf
    server ntp.jst.mfeed.ad.jp
$ sudo service ntp restart
# ntpが実行されるまで、しばらく待つ
$ ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*ntp2.jst.mfeed. 210.173.176.4    2 u    1   64   77    8.787    1.360   0.296
#行頭が * だったら接続成功

muninインストール

サーバの状態監視ツール munin のインストール。「[Linux][Ubuntu][サーバ] サーバの状態監視ツール munin のインストール – Secondary Storage」を参考にしました。

$ sudo aptitude install munin munin-node
$ sudo vi /etc/munin/munin.conf
    #file: munin.conf
    htmldir /home/hide10/www/munin/
    [hide10.com]
$ cd ~/www
$ mkdir munin
$ sudo chown munin:munin munin
$ sudo -u munin vi /home/user01/public_html/munin/.htpasswd
    # http://www.luft.co.jp/cgi/htpasswd.php で作成したパスワードを貼り付ける
    munin:******
$ sudo service munin-node restart

muninにmysql監視を追加

MuninでMySQLも監視 – Hinemosu」を参照のこと。

mysqlのWordPress用チューニング

WordPress用のMySQLチューニングにチャレンジしてみた – Hinemosu」も併せて参照のこと。

$sudo vi /etc/mysql/my.cnf

    # file: my.cnf

-   key_buffer              = 16M
-   #max_connections        = 100
-   #table_cache            = 64
+   key_buffer              = 256M
+   max_connections        = 200
+   table_cache            = 256

MO Cacheインストール

WordPress › APC Object Cache Backend « WordPress Plugins」をダウンロードし、"object-cache.php"を"wp-content/"フォルダに設置する。

その後、「WordPress › MO Cache « WordPress Plugins」をインストールし、プラグインを有効化する。

特定ディレクトリにBasic認証を掛ける

.htpasswdの生成。

$ sudo vi /etc/nginx/.htpasswd
    # http://www.luft.co.jp/cgi/htpasswd.php で作成したパスワードを貼り付ける
    munin:******

basic認証の設定。

$ sudo vi /etc/nginx/sites-available/default

    [file:/etc/nginx/sites-available/default]

    server {

+        location ^~ /munin/ {
+            auth_basic  "basic authentication";
+            auth_basic_user_file /etc/nginx/.htpasswd;
+        }

    }

nginx再起動。

$ sudo service nginx restart

ApacheBenchで性能テスト

現状の性能確認のため、ApacheBenchでテストする。

詳細は「さくらのVPS 2G、”WordPress on nginx with FastCGI”でApache Bench – Hinemosu」参照のこと。

worker_processesの設定

CPUコアの数によってnginx.confのworker_processesを調整する必要があるらしい。

$ sudo vi /etc/nginx/nginx.conf

    user www-data;
-   worker_processes 4;
+   worker_processes 3;
+   worker_cpu_affinity 001 010 100;
    pid /var/run/nginx.pid;

変更後にabテストしてみたけど、特に変わりはないみたい?

アクセスログ解析ツールのインストール

Visitorsでアクセスログを解析する。

詳細は「nginxでvisitorsを使う | Hinemosu」を参照。

ToDo

  • nginxのプロキシキャッシュ設定
  • 毎日18時にサーバ負荷が増加する原因を確認する