サーバの構成をCentOS7+H2O+php-fpm(PHP7)にしてみた

最近H2Oというnginxよりも早いと言われているらしいWebサーバを知ったので、取り敢えず入れてみました。

またコレを機に、HHVMよりも早くなったらしいPHP7も気になっていたので、そちらも入れてみました。今のところWordPressは動いているみたいです。

ちなみにCentOS7です。

目次

H2Oの用意

H2Oのインストール

「Development Tools」をインストールしておけば、わりとサクッとインストール出来るようです。後は依存パッケージをインストール。

yum groupinstall "Development Tools"
yum install cmake
yum --enablerepo=rpmforge install libyaml-devel

H2OのソースはGitHubに公開されているので、Gitで取得。cmake, make, make installでインストールします。

git clone https://github.com/kazuho/h2o.git
cd h2o
git submodule update --init --recursive
cmake .
make h2o
make install

まだ、足りないパッケージがありました。

yum install libssl-dev
yum install openssl-devel

make installで完了です。

make install

H2Oの設定

適当な場所にH2Oの設定ファイルを記述します。

vi /path/to/h2o.conf

WordPress向けに書いた記述はこんな感じ。HTTP/2の仕様的にはSSL通信じゃなくなっても良くなったそうなのですが、まだブラウザ側で制限があるようなので、SSL向けの設定になっています。

pid-file: /path/to/h2o.pid
user: nobody
error-log: /path/to/error.log

listen: 80
listen:
  port: 443
  ssl:
    certificate-file: /path/to/ssl.pem # SSLのサーバ証明書+中間証明書
    key-file: /path/to/ssl.key # SSLの秘密鍵

# PHPの設定
file.custom-handler:
  extension: .php
  fastcgi.connect:
    host: 127.0.0.1
    port: 9000
    type: tcp

# ディレクトリインデックス
file.index: [ 'index.php', 'index.html' ]

# ドメイン設定
hosts:
  # HTTP/2を使いたかったのでHTTPSにリダイレクトしてSSL通信に統一
  "example.net:80":
    paths:
      /:
        redirect:
          status: 301
          url: https://example.net/

  "example.net:443":
    access-log: /path/to/access.log
    paths:
      /:
        # 公開ディレクトリの指定
        file.dir: /path/to/httpdocs
        file.dirlisting: on
        # file.dirに見つからなければindex.phpで受け取る
        redirect:
          url: /index.php/
          internal: YES
          status: 307

結構短く書けてますね。
また、SSLはStartSSLを利用させて頂きました。

H2Oの起動・停止

マニュアルに書いてある方法を参照させて頂きました。

# 起動(-cオプションには設定ファイルのパスを指定する)
h2o -m daemon -c /path/to/h2o.conf
# 停止(設定ファイルに記述したpid-fileのパスを指定する)
kill -TERM `cat /path/to/h2o.pid`

取り敢えずこれでH2O+PHPの環境が整いました。また、SSLで接続するとちゃんとHTTP/2で通信してくれます。(このブログもHTTP/2になっている…はず…)

PHP7をphpenv+php-buildでインストール

どうせなので、phpenvとphp-buildを使ってPHPをインストールしてみました。

phpenvのインストール

phpenvもGitHubに公開されていますので、Gitで取得します。また、インストール用のシェルスクリプトが用意されていますので、そのまま実行。

git clone https://github.com/CHH/phpenv.git
cd phpenv/bin/
sh phpenv-install.sh

パスを通して完了です。

export PATH="/root/.phpenv/bin:$PATH"
eval "$(phpenv init -)"
source ~/.bashrc

php-buildのインストール

同様に、php-buildもGitHubで公開され、インストール用のシェルスクリプトが用意されています。便利便利。

git clone https://github.com/CHH/php-build.git
cd php-build/
sh install.sh

php-buildでPHP7をインストール

php-buildでインストール出来るバージョンの一覧を見てみます。

php-build --definitions
## 略
5.6.5
5.6.6
5.6.7
5.6.8
5.6.9
5.6snapshot
7.0.0alpha1
7.0.0alpha2
master

7.0.0alphaがあるので利用させて頂きました。

php-build 7.0.0alpha2 ~/.phpenv/versions/7.0.0alpha2

が、依存パッケージがことごとく入っていないので頑張ります。

取り敢えず必要らしいパッケージを一気にインストール。

yum install libxml2-devel bison bison-devel openssl-devel curl-devel libjpeg-devel libpng-devel libmcrypt-devel readline-devel libtidy-devel libxslt-devel

re2cをソースからインストール。

wget http://sourceforge.net/projects/re2c/files/re2c/0.14.3/re2c-0.14.3.tar.gz
tar zxvf re2c-0.14.3.tar.gz
cd re2c-0.14.3
./configure
make make install

libmcryptも足りない。

yum install --enablerepo=epel libmcrypt libmcrypt-devel

libtidyも足りない。

yum install --enablerepo=epel libtidy libtidy-devel

ここまでインストールして入りました。

php-build 7.0.0alpha2 ~/.phpenv/versions/7.0.0alpha2

PHP7でphp-fpmを設定・起動

php-buildでインストールしたPHPの設定ファイルをいじって、実行します。(既にphp-fpmを起動している場合は停止する必要があります)

# php.iniを更新
vi ~/.phpenv/versions/7.0.0alpha2/etc/php.ini
# php-fpm.confを更新
cp ~/.phpenv/versions/7.0.0alpha2/etc/php-fpm.conf.default ~/.phpenv/versions/7.0.0alpha2/etc/php-fpm.conf
vi ~/.phpenv/versions/7.0.0alpha2/etc/php-fpm.conf
# php-fpm.d/www.confも更新
vi ~/.phpenv/versions/7.0.0alpha2/etc/php-fpm.d/www.conf
# php-fpmを実行
~/.phpenv/versions/7.0.0alpha2/sbin/php-fpm &

雑感

思っていたよりも設定内容は少なくかけることにビックリました。なにもチューニングしていなくても、それなりの速度が出るそうです。

Apacheやnginxと繋げて、リバースプロキシ部分だけをH2Oを使う、と言った方法を取っても良いそうなのですが、そこまでの知識は無いので、取り敢えずH2O単体で、リバースプロキシも無しです。(なしですよね?)

HTTP/2も名前だけ知っており、簡単には使えないんだろうなぁ、と思っていたらサクッと動いたのでビックリしました。HTTP/2らしさはあんまりまだありませんが、環境が整っただけでも取り敢えず良しとしておきます。

あと、SSLにしたので、はてブのAPI取得出来なくなりました。SSL対応してくれないかなぁ…。

参考