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

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

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

ちなみにCentOS7です。

目次

H2Oの用意

H2Oのインストール

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

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

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

1
2
3
4
5
6
git clone https://github.com/kazuho/h2o.git
cd h2o
git submodule update --init --recursive
cmake .
make h2o
make install

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

1
2
yum install libssl-dev
yum install openssl-devel

make installで完了です。

1
make install

H2Oの設定

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

1
vi /path/to/h2o.conf

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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の起動・停止

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

1
2
3
4
# 起動(-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で取得します。また、インストール用のシェルスクリプトが用意されていますので、そのまま実行。

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

パスを通して完了です。

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

php-buildのインストール

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
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があるので利用させて頂きました。

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

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

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

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

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

1
2
3
4
5
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も足りない。

1
yum install --enablerepo=epel libmcrypt libmcrypt-devel

libtidyも足りない。

1
yum install --enablerepo=epel libtidy libtidy-devel

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

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

PHP7でphp-fpmを設定・起動

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

1
2
3
4
5
6
7
8
9
# 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対応してくれないかなぁ…。

参考

Author: SUSH
Link: http://blog.sus-happy.net/h2o_php7/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.