情報科学屋さんを目指す人のメモ

方法・手順・解説を書き残すブログ。私と同じことを繰り返さずに済むように。

WordPressブログ引っ越しメモ(さくらのレンタルサーバ+Apache→さくらのVPS+Nginx)

Apache (5) CentOS (2) Linux (23) Nginx (11) WordPress (76) さくらのVPS (5) さくらのレンタルサーバ (11)

先日さくらのレンタルサーバスタンダード(500円/月)でも月間50万PVを捌けると書いたばかりですが、4月21日にこのブログを、さくらのレンタルサーバから、さくらのVPSへお引っ越ししました。それに伴い、WebサーバもApache 1.xから、Nginxに変更しました。今回は、このサーバ変更についてメモします。

移転理由

最大の理由は、さくらのレンタルサーバやさくらのマネージドサーバでは、Apacheのmod_deflateもしくはmod_gzipが利用できなかったことです。

多くのレンタルサーバでは、CPU負荷のためにgzip圧縮用モジュールを使えてもらえなかったりします。他にも、当然のことですが制限が多いです。そこで自由度が欲しくて、VPSにしました。その自由度に物を言わせて、今回Nginxにしました。自由度を得た引き替えに、自分でサーバを管理しないといけないという手間も増えるのですが、手間と言ってもそこまでではないので、自由度を今回は優先することにした感じです。

WordPressの引っ越し手順

ここからは、引っ越し手順を紹介します。ポイントは、Nginxの設定と、WordPressのデータの移転方法、それに、それらの設定順序です(依存関係があるので)。

VPS起動

VPSコントロールパネルにログインして、「起動」ボタンから CentOS 6 x86_64 を起動します(初期インストールされているOSの環境についてはこちら)。ちなみに、旧サーバ(さくらのレンタルサーバ)では、OSにFreeBSDが利用されていました。

ユーザ作成

VPSにSSHで「root」としてログイン(パスワードはメールで届く初期設定のVPSコントロールパネル用パスワードと同じ)。

#useradd username」で一般ユーザを追加し、「#passwd username」でパスワードを設定。「#usermod -G wheel username」でグループを設定(wheelって?)。

su/sudoの設定

「#vim /etc/pam.d/su」で「#auth required pam_wheel.so use_uid」のコメントアウトを解除して、wheelグループの人(username)がsuを使えるように設定。

suの設定だけだとsudoしたときに「○○はsudoersファイル内にありません。この事象は記録・報告されます。」と表示されてしまうので、suでrootになって「#visudo」で「# %wheel ALL=(ALL) ALL」という行のコメントアウトを解除します(「#」を削除する)。

SSHの設定

「#vim /etc/ssh/sshd_config」で、「#Port 22」のコメントアウトを解除して、ポート番号を変えます。また、「#PermitRootLogin yes」のコメントアウトを解除して、「PermitRootLogin no」に設定する。「# /etc/init.d/sshd restart」でsshdを再起動。指定したポート番号からログインできることを確認します。

WinSCPを使って「~/.ssh」フォルダを、パーミッションを「700」にして作成し、公開鍵として「authorized_keys(600)」を持ってくる。ここで一度公開鍵認証でログインできるかを確認。

もう一度「#vim /etc/ssh/sshd_config」で、sshd_configを開き、「PasswordAuthentication yes」を「PasswordAuthentication no」に変更する。そしてもう一度sshdを再起動。

不安定だったので

VPSに接続したときに、SSHのコネクションが不安定で気が付くと切れてしまった(PuTTYでは「innactive」の表示)ので、「~/.ssh/config」に

Host * ServerAliveInterval 200

と追加しておきました。

必要ソフトウェアのインストール

必要なものをまとめてインストールします(※インストールするだけして、php-pecl-apcとphpMyAdminは設定していません)

# yum install nginx
# yum install php-cli php-mbstring php-mysql
# yum install php-pecl-apc
# yum install php-fpm
# yum install mysql-server
# yum install phpmyadmin

  • Nginx 1.0.15-4.e16 (nginx, GeoIP, gd, libXpm, libxslt)
  • PHP 5.3.3-22.el6 (php-cli, php-mbstring, php-mysql, php-common, php-pdo)
  • Alternative PHP Cache 3.1.9-2.el6 (php-pecl-apc, php-pear)
  • PHP-FPM 5.3.3-22.el6 (php-fpm)
  • MySQL 5.1.67-1.el6_3 (mysql-server, mysql, perl-DBD-MySQL, perl-DBI
  • phpMyAdmin 3.5.7-1.el6 (phpMyAdmin, apr-util-ldap, httpd, httpd-tools, libmcrypt, php, php-gd, php-mcrypt, php-php-gettext)

ちなみに、インストール済みのPHP用モジュールの一覧は、「php -m」コマンドで表示できます(現在:bz2, calendar, Core, ctype, curl, date, ereg, exif, fileinfo, filter, ftp, gettext, gmp, hash, iconv, json, libxml, mbstring, mysql, mysqli, openssl, pcntl, pcre, PDO, pdo_mysql, pdo_sqlite, Phar, readline, Reflection, session, shmop, SimpleXML, sockets, SPL, sqlite3, standard, tokenizer, xml, zip, zlib)。

WordPress本体の配置

BackWPup3でWordPressブログを丸ごとバックアップする方法(復元手順テスト済み・Q&A付き)」を利用してバックアップしたWordPress本体を、「/var/www/did2memo.net/wp」にコピーしました。

次に、 「#unzip backwpup_xxx.zip」で解凍して、「/var/www/did2memo.net/wp」を、「chown -R nginx.nginx ~/var/www/did2memo.net/wp」で所有者とグループを変更し「chmod -R 707 ~/var/www/did2memo.net/wp」にしました(このあたり適当感あるから後でよく考える)。

MySQLの設定

次に、WordPress復元の一環として、MySQLの設定をします。

いろいろ決める

設定するとき、いろいろなところで次の項目を入力します。以前のサーバ上での設定と同じにする必要はないので、考えておきます。

  • データベース名:databasename
  • MySQLのユーザ名:username
  • パスワード:password

初期化

「# service mysqld start」でMySQLを起動し、「# chkconfig mysqld on」で、自動起動するようにしておきます。

次に、「# /usr/bin/mysql_secure_installation」で、MySQLを初期化します。最初の「Enter current password for root (enter for none):」では、まだrootパスワードが未設定なので、何も入力せず「Enter」を押します。次の「Set root password?」では「Y」とし、新しいrootパスワードを設定します。「Remove anonymous users?」や「Disallow root login remotely?」「Remove test database and access to it?」などでも「Y」にします。

「# vim /etc/my.cnf」に次の内容を追加し、UTF-8を使うように設定します(デフォルトでは文字コードがlatin1になってしまった)。指定後、「# service mysqld restart」しました。

データベースの新規作成

まず「# mysql -u root -p」でログインします。次に、「mysql> create database databasename default character set utf8;」でデータベースを作成し、「mysql> grant all privileges on databasename.* to username@localhost identified by 'password'」で、ユーザを作成します。ここで利用したデータベース名・ユーザ名・パスワードは、WordPress(wp-config.php)を設定する際に利用します。「mysql> exit」でログアウトします。

復元

次に、「# mysql -u username -p」で、先ほど作成したユーザでMySQLにログインします。次に、「mysql> use databasename」で利用するデータベースを指定し、「mysql> source /var/www/did2memo.net/wp/backwpup_xxx.sql」で、バックアップ済みのデータベースを復元します。終了したら、「mysql> exit」でログアウトします。

WordPressの設定(wp-config.php)

次に、wp-config.phpを編集するのですが、このままだと文字化けするので、最初に「#vim /etc/sysconfig/i18n」で、「LANG="C"」を「LANG="ja_JP.UTF-8"」にして保存し、「# source /etc/sysconfig/i18n」で再読込します。

このようにして日本語を表示できるようにしてから、「$ vim /var/www/did2memo.net/wp/wp-config.php」で、次のように変更します。

// ** MySQL 設定 - こちらの情報はホスティング先から入手してください。 ** //
/** WordPress のためのデータベース名 */
define('DB_NAME', 'databasename');

/** MySQL データベースのユーザー名 */
define('DB_USER', 'username');

/** MySQL データベースのパスワード */
define('DB_PASSWORD', 'databasepassword');

/** MySQL のホスト名 */
define('DB_HOST', 'localhost');

/** データベースのテーブルを作成する際のデータベースのキャラクターセット */
define('DB_CHARSET', 'utf8');

/** データベースの照合順序 (ほとんどの場合変更する必要はありません) */
define('DB_COLLATE', '');

※もう少し後ろに「$table_prefix」という変数が設定されていると思うのですが、これを変更すると、テーブルの名前が一致しなくなってしまうので、ここについては引っ越し前の値から変更しないでください

Nginxの設定

WordPressの設定が終わったので、それを参考に、Nginx側の設定を書きます。

「# vim /etc/nginx/conf.d/default.conf」で、次のように編集します。

location / {
root /var/www/did2memo.net/wp;
index index.php;

if (!-e $request_filename) {
rewrite ^/(.+)$ /index.php?q=$1 last;
break;
}

}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/did2memo.net/$fastcgi_script_name;
include fastcgi_params;
}

また、「# vim /etc/nginx/nginx.conf」にて、次の部分を追加して、gzipを有効化します(参考)。

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

PHP-FPM の設定

「# vim /etc/php-fpm.d/www.conf」で、「user = apache」という行を「user = nginx」に、「group = apache」という行を「group = nginx」に変更します。

Nginxの起動

# service php-fpm start」「# chkconfig php-fpm on」「# service nginx start」「# chkconfig nginx on」これで、Nginxとphp-fpmが起動し、次回のサーバ起動時にプロセスが自動起動するようになりました。

DNSの設定

独自ドメインをスタードメインで取得して利用していたのですが、ここをそのままにしていては「did2memo.net」で引っ越し先にアクセスできないので、ここのDNSの設定で、「did2memo.net」の「Aレコード」に、VPSに割り当てられたグローバルIPアドレスを設定しました。1時間程度でキャッシュが変わって自分の利用しているISPから、新しいIPアドレスへ名前解決されるようになりました。

引っ越し完了!!!

以上で引っ越し完了です。意外と簡単で、作業時間はとても短かったです。

トラブル対策

以下、トラブルについてです。

トップページが403 Forbidden

トップページにアクセスしたところ、「403 Forbidden」が表示されてしまいました。ログには、「[crit] 26293#0: *2 stat() "/var/www/did2memo.net/wp/" failed (13: Permission denied), client: 123.123.123.123, server: _, request: "GET / HTTP/1.1", host: "did2memo.net"」と書かれており、パーミッションの問題だと分かります。というわけで、パーミッションを変更しました(上記解説では、変更後のパーミッション設定を紹介しています)。

トップページ以外が404 Page Not Found

トップページ以外で404 Page Not Foundが表示されてしまいました。

nginx error!
The page you are looking for is not found.

トップページ以外だったので、rewriteが上手く機能していないのでは?と思い「/etc/nginx/conf.d/default.conf」を確認したところ、「rewrite ^/(.+)$ /index.php?q=$1 last;」の行に入力ミスがあり、ちゃんと置換が間違っていました。そこを修正すると、404エラーは表示されず、正しくページが表示されるようになりました。

nginx: [warn] duplicate MIME type "text/html" in /etc/nginx/nginx.conf エラー

nginxのサービスを起動する際にこの警告が表示されました。gzip_typesに、「text/html」を書くとエラーになってしまうようです。nginxの初期設定で、すでにtext/htmlはgzip圧縮する対象に指定されているようです。gzip_typesに書いた「text/html」を削除すると、解決しました。

参考

コメント(4)

  1. Suguru Hirahara
    2013年6月23日(日) 21:29

    チュートリアルありがとうございます。参考になりました。
    一点だけ、nginxのrewirteの
    「rewrite ^/(.+)# /index.php?q=$1 last;」
    に関して、#ではなく$ではありませんか?当方の環境では、#だとパーマリンクのエラーになってしまいました。

  2. did2
    2013年7月15日(月) 02:32

    >Suguru Hiraharaさん
    ご指摘ありがとうございます。

    「#」は「$」の間違いのようです(実はこの環境を捨ててしまったのですぐ確認できません;)。本文、修正しました。

  3. f50 アディゼロ 激安
    2013年11月11日(月) 18:00

    アディゼロ f50-ジャパン trx hg

  4. かんちゃん。
    2013年11月30日(土) 01:22

    こんにちは。参考になります。
    ちょっとお伺いしたいことがあるのですが、私の所有しているサイトは、今までカゴヤで運営していたのですが、一時期転送量が1日100GBを超えてから、従量制扱いになってしまいました。
    カゴヤは、専用サーバーにもかかわらず、1年間の使用料が4~5万円ほどで気に入っていたのですが、従量制にすると1ヶ月だけでプラス1万円以上になってしまうので、他のレンタルサーバーを探していました。
    で、さくらやXサーバーが転送量制限が緩いと聞いたので、早速無料期間内で公開したところ、さくらの方は昼間のそれほどアクセスがない200~300PV/分でも、503エラーが頻発。
    サポートに問い合わせたところ、お試し期間中は転送量の制限をきつくしている。とのことでした。
    貴サイトを拝見したところ、1700PV/分でもさくらの500円/月のプランでも大丈夫だったのこと。
    私はビジネスプランを考えているのですが、さくらでいくかXサーバーでいくか迷っています。

新しいコメントを投稿