work.log

元エンジニアの備忘録的ブログ

WordPressをNginx 1.10とPHP 7の環境で動かしてみる

投稿:2016-06-16 02:13  更新:

Nginx 1.10 と PHP 7 をインストールして WordPress が動作する環境を作ってみるメモ書きです。

下記の記事を書いてから暫く経つし、NginxもPHPもそろそろ新しくしておきたいと思いちょっとやってみました。

NginxでWordPressを使う時の設定をまとめてみた

簡単なテストだけで実環境での運用テストはまだですが、結論から言うと Nginx 1.6, PHP 5.5 からは簡単にアップグレード出来ましたので手順を書いておきます。

テストした環境

まず初めに、今回アップグレードのテストをした環境は下記の通りです。

  • OS: CentOS 6.7 (6.2 からアップグレード)
  • Nginx: 1.6.2
  • PHP (php-fpm): 5.5.28

Nginx はソースから、PHP は yum の外部リポジトリからインストールをした物を使っています。

CentOS 7 を未だに試してすらいないので CentOS 6 を使ってますが、この手順は CentOS 7 でもそんなに変わらないと思います。

必要な外部リポジトリを利用する為の事前準備はこんな感じです。もし入ってなければインストールしてください。

# rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

CentOS 7 の場合はこちら。

# rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

PHP 7のインストール

PHP 7 のインストールは remi リポジトリを指定してこの様にインストールします。

# yum install --enablerepo=remi,remi-php70 php php-fpm php-mbstring php-mysql php-devel php-gd php-pecl-zendopcache php-pear

もし、既に PHP がインストールされていてアップグレードする場合は、一度アンインストールした後にやった方が良いかも知れない。PHP 5.5.28 がインストールされた状態でやったらエラーが出たので下記で一度 PHP を消しました。

# yum remove php-*

終わったらバージョンを確認します。

# php -v
PHP 7.0.10 (cli) (built: Aug 31 2016 18:17:07) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
    with Zend OPcache v7.0.10, Copyright (c) 1999-2016, by Zend Technologies

あとは必要なコンフィグを整え PHP-FPM デーモンを起動して PHP 7 のインストールは完了です。

Nginx 1.10のインストール

Nginx はサードパーティ製のモジュールを組み込んだりしたいのでソースからインストールします。また、コンパイルオプションは当環境および冒頭にリンクを記載した記事に合わせて設定しているので注意!

まずは必要なファイルを取ってきます。

# wget https://nginx.org/download/nginx-1.10.1.tar.gz
# tar xfz nginx-1.10.1.tar.gz

# wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
# tar xfz ngx_cache_purge-2.3.tar.gz

# cd nginx-1.10.1

続いて、コンパイルです。

./configure \
--prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--error-log-path=/var/log/nginx-error.log \
--user=www --group=www \
--http-client-body-temp-path=/home/www/tmp/client_body_temp \
--http-fastcgi-temp-path=/home/www/tmp/fastcgi_temp \
--http-proxy-temp-path=/home/www/tmp/proxy_temp \
--http-scgi-temp-path=/home/www/tmp/scgi_temp \
--http-uwsgi-temp-path=/home/www/tmp/uwsgi_temp \
--http-log-path=/var/log/nginx-access.log \
--add-module=../ngx_cache_purge-2.3 \
--with-http_gzip_static_module \
--with-http_image_filter_module \
--with-http_stub_status_module \
--with-http_sub_module \
--with-pcre \
--with-http_ssl_module

もし、既に Nginx がインストールされている場合は念のためバックアップしておきます。

これは新規インストールの場合は不要な手順です。

# cp -p /usr/sbin/nginx /usr/sbin/nginx.orig

次に、Nginx の make とインストールです。

# make
# make install

終わったらコンフィグを整えて Nginx を起動すれば OK です。

今回はアップグレードだったので既存のコンフィグを念のためチェックしてみました。

# nginx -t
nginx: [warn] no "fastcgi_cache_key" for "fastcgi_cache" in /etc/nginx/nginx.conf:104

何か警告が出ました・・・

どうも、”fastcgi_cache“で Nginx キャッシュのキーを指定していたパラメータ名が “fastcgi_cache_key” に変わった?ようです。コンフィグを下記のように修正してあげます。

これまでこの記事で記述していたような fastcgi_cache の設定だけを別ファイルに書くのはダメになったらしい・・・

しょうがないので WordPress 用の設定をまとめたインクルード用ファイル wordpress.conf を少々修正します。

index  index.php;
error_page  404 /index.php?error=404;

set $is_mobile '';

# キャッシュを作成する場合のスマートフォンの判定処理
if ($http_user_agent ~* '(iPhone|iPod|Android.*Mobile|Windows.*Phone|dream|CUPCAKE|blackberry9500|blackberry9530|blackberry9520|blackberry9550|blackberry9800|webOS|incognito|webmate|Googlebot-Mobile)') {
	set $is_mobile 'mobile.';
}

# GET メソッド以外はキャッシュを作成しない
if ($request_method != GET) {
	set $do_not_cache 1;
}

# キャッシュされたらまずそうな物を適当に除外 (念の為に書いているのもある)
if ($request_uri ~* '/(wp-admin/|wp-login.php|wp-cron.php|xmlrpc.php|\??feed|sitemap.xml)') {
	set $do_not_cache 1;
}

# Cookie を持っていたらキャッシュを渡さない
if ($http_cookie ~* 'comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in') {
	set $do_not_cache 1;
}

# アクセスされたら嫌なファイルを WordPress 内に置くときに
location ~ \.(txt|dat)$ {
	return 404;
}

# wp-config.php へはアクセスさせない
# ただ、Web からここへアクセスする必要がある時は設定しない方が良いと思う
location ~ /wp-config.php$ {
	return 404;
}

# リクエストは index.php に投げる
location / {
	try_files  $uri $uri/ /index.php?$args;
}

# 画像等はブラウザキャッシュを効かせる (6 ヵ月)
location ~ \.(jpe?g|png|gif|ico|css|js)$ {
	access_log  off;
	expires  6M;
}

# PHP は php-fpm で処理する。php-fpm へはソケットで渡すようにしてみた
# 各キャッシュの有効期限はこんな感じに
location ~ \.php {

	try_files  $uri /index.php;

	include  fastcgi_params;
	fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
	fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

	fastcgi_no_cache      $do_not_cache;
	fastcgi_cache_bypass  $do_not_cache;
	fastcgi_cache         $keys_zone;
	fastcgi_cache_key     $is_mobile$scheme://$host$request_uri;
	fastcgi_cache_valid   200 2h;
	fastcgi_cache_valid   301 302 1h;
	fastcgi_cache_valid   404 1m;
	fastcgi_cache_valid   500 1s;
	fastcgi_cache_valid   any 5m;

}
 

keys_zone の名前は変数に入れて渡す事にしました。

バーチャルドメインを設定する側ではこのように変更すればいけます。

set $do_not_cache 0;

## これまで設定していたもの
#fastcgi_cache  hoge;

## 修正したもの
set $keys_zone  hoge;

## keys_zone を設定しない場合はコレ (これが無いと警告が出てしまう・・・)
set $keys_zone  '';

他は特に問題ないようだったのでデーモンを起動し Nginx のアップグレードは無事完了しました。

おまけ: Nginx 1.10とPHP 7にしてどれ位速くなったか?

簡単ですがアップグレードしてどれ位 WordPress が速くなったかをテストしてみました。

WordPress はインストール直後に Twenty Twelve のテーマを適用した状態での測定です。これを「Windows 10 + Firefox 47.0」な環境から Firebug を使って5回レスポンスを測ってみます。

リロードはキャッシュを無視するスーパーリロードを使います。

Nginx 1.6 + PHP 5.5

まずはアップグレード前の状態はこんな感じです。

  1. 248 ms
  2. 298 ms
  3. 248 ms
  4. 253 ms
  5. 247 ms

平均は 258.8 ms でした。

Nginx 1.6 + PHP 7

PHP のみアップグレードした状態です。

  1. 172 ms
  2. 195 ms
  3. 184 ms
  4. 163 ms
  5. 185 ms

平均は 179.8 ms でした。アップグレード前と比べ 1.44 倍速くなったようです。

Nginx 1.10 + PHP 7

Nginx と PHP を共にアップグレードした状態です。

  1. 184 ms
  2. 147 ms
  3. 169 ms
  4. 199 ms
  5. 138 ms

平均は 167.4 ms でした。アップグレード前と比べ 1.55 倍速くなり、PHP だけをアップグレードした時よりも更に良い結果になりました。

簡易テストなので数値の精度等はアレですが、アップグレードするだけで結構変わるものですね・・・

特に PHP 7 は「速くなる!」という噂をだいぶ前から聞かされていたのでようやく試せて良かったです。

おすすめのVPSサーバ

  • OSが選べる
  • VPS同士でLANが組める
  • 複数台構成向き

このブログで使っています。

  • 転送量が多いサービスに
  • 借りてるのは3年間一度もdown無し!

よく見られている記事

  • 本日
  • 週間
  • 月間