るいすときのこの物語

オタクエンジニアの雑記

Nginx から h2o へ移行して Wordpress を動かしてみた。


そういえば DigitalOcean から Azure へ移行しました。 体感速度も上がったと思います。なんといっても vCPU 1コアでしたから前は...。

今回は新たに構築するっていうことで今まで Nginx を使ってきましたが h2o を使ってみました。 h20 - github

h2o は DeNA を筆頭に多くの日本人で開発されてる HTTP Server です。 HTTP/2 に強いっぽい。何と言っても HTTP Server なのに逆にリクエストが送れたりする。

 

h2o のインストール

書くことはありません。こちらを参考にインストールしました。

 

php-fpm のインストール

好きに入れてください。

 

h2o の設定

user: h2o
pid-file: /var/run/h2o/h2o.pid
num-threads: 2
access-log: /var/log/h2o/access.log
error-log: /var/log/h2o/error.log
http2-reprioritize-blocking-assets: ON
max-connections: 1024
compress: on

# for index #
file.index: [ 'index.php', 'index.html' ]

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

hosts:
  "luispc.com:80":
    listen:
      port: 80
    paths:
      "/":
        redirect: https://104.41.191.21/

  "luispc.com:443":
    listen:
      port: 443
      ssl:
        certificate-file: /etc/h2o/ssl/ssl-bundle.crt
        key-file:         /etc/h2o/ssl/luispc_com.key

    paths:
      "/":
        file.dir: /var/www/
        file.dirlisting: OFF

        # for Expires #
        mruby.handler: |
          Proc.new do |env|
            headers = {}
            if /\.(css|js|jpg|jpeg|png|gif)\z/.match(env["PATH_INFO"])
              headers["cache-control"] = "max-age=86400"
              headers["Expires"] = "1d"
            end
            [399, headers, []]
          end

        # for Permalink #
        redirect:
          url: /index.php/
          internal: YES
          status: 307

直感的で分かりやすと思います。

  php-fpm との連携は

file.custom-handler:
  extension: .php
  fastcgi.connect:
    host: 127.0.0.1
    port: 9000
    type: tcp

これだけ。シンプルだ。

 

Wordpress のパーマリンクは

redirect:
          url: /index.php/
          internal: YES
          status: 307

こんな感じ。

ただ、ログイン時はキャッシュさせないとかパスを見てアクセスコントロールするには mruby とかいうのを使うらしい。 Ruby 分からねえよぉ... ちなみに mruby は ON でビルドしたけどこの設定あってるのか分からねえ。

しかも mruby でキャッシュの設定とかしてなくても勝手に静的コンテンツがキャッシュされてる...。 アクセスコントロールは mruby を使うと柔軟に設定できるわけですが、ちょっとハードルが高いように思う...。

 

SnapCrab_NoName_2016-6-12_22-10-18_No-00

でもまぁ管理画面でヘッダーを見てみるとWordpress側でキャッシュしないようにはなってるっぽいのでここらへんはもう気にしなくてもいいのかな。

ということで設定がよく分からないまま Nginx と比較してみます。

 

h2o + php-fpm

# wrk -t 7 -c 30 -d 60s http://127.0.0.1/
Running 1m test @ http://127.0.0.1/
  7 threads and 30 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   942.35ms  244.24ms   1.95s    81.90%
    Req/Sec     6.66      5.80    30.00     87.19%
  1661 requests in 1.00m, 102.97MB read
  Socket errors: connect 0, read 0, write 0, timeout 59
Requests/sec:     27.64
Transfer/sec:      1.71MB

27.64req/sec

 

Nginx(fastcgi_cache) + php-fpm

# wrk -t 7 -c 30 -d 60s http://127.0.0.1/
Running 1m test @ http://127.0.0.1/
  7 threads and 30 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    33.80ms  138.93ms   1.80s    96.27%
    Req/Sec     1.31k   314.62     2.02k    86.42%
  509977 requests in 1.00m, 30.67GB read
Requests/sec:   8485.62
Transfer/sec:    522.53MB

8485.62req/sec

えぇ...。Nginx の方が 314倍速い!? https ではなく http です。

画像が多く1アクセスで180reqWordpressです。 なんでこんなに差が大きすぎるんだ...。なんでや...。

とりあえずこのブログは h2o で動かして色々実験します。