前回http/2ベンチマークツール「h2load」をインストール - SIS Labでhttp/2ベンチマークツールをインストールしたので、いよいよh2oをインストールします。

さくらVPSで運用しているCentOSは、Ansible経由で整備しているので今回もAnsibleのタスクを作成して、まずはローカルの開発環境でテスト、そしてさくらVPSのCentOSに適用します。

Wordpressも、h2oで動かそうと思ったのですが、うまくリソースが取得できませんでした。下記の設定では、静的ジェネレータhugoで作成するファイルだけh2oで公開するときの設定です。

Ansibleでのh2oインストール方針

  • ダウンロードしたソースコードは、/tmpに格納する
  • 実行ファイルは/usr/local/binに格納する
  • h2oの設定ファイルは/usr/local/etc/h2o/conf/に格納する

Ansibleのロール設定

group_vars
roles
  - h2o
    - tasks
    - templates
hosts
site.yml

tasks/main.yml

---
- name: install cmake
  yum: name=cmake state=present
  sudo: yes

- name: install package
  yum: pkg={{ item }} state=present enablerepo=epel
  with_items:
    - openssl
    - openssl-devel
  sudo: yes

- name: check h2o installed
  command: test -x /usr/local/bin/h2o
  register: h2o_present
  ignore_errors: yes
  changed_when: false

- name: download h2o
  get_url: url=https://github.com/h2o/h2o/archive/v{{h2o_version}}.tar.gz dest=/tmp/h2o.tgz
  when: h2o_present|failed

- name: expand h2o
  command: tar xzf h2o.tgz chdir=/tmp creates=/tmp/h2o-{{h2o_version}}
  when: h2o_present|failed

- name: cmake h2o
  command: cmake -DWITH_BUNDLED_SSL=on . chdir=/tmp/h2o-{{h2o_version}} creates=/tmp/h2o-{{h2o_version}}/Makefile
  when: h2o_present|failed

- name: make h2o
  command: make chdir=/tmp/h2o-{{h2o_version}} creates=/tmp/h2o-{{h2o_version}}/h2o
  when: h2o_present|failed

- name: install h2o
  command: make install chdir=/tmp/h2o-{{h2o_version}} creates=/usr/local/bin/h2o
  when: h2o_present|failed
  sudo: yes

- name: Ensures conf dir exists
  file: path=/usr/local/etc/h2o/conf/ state=directory

- name: Copy h2o configuration
  template: src=h2o.conf dest=/usr/local/etc/h2o/conf/h2o.conf

- name: Ensures log dir exists
  file: path=/var/log/h2o/ state=directory

- name: Create access log file
  file: path=/var/log/h2o/access.log state=touch

- name: Create error log file
  file: path=/var/log/h2o/error.log state=touch

- name: Create pid log file
  file: path=/usr/local/etc/h2o/h2o.pid state=touch mode=0777

- name: add iptables rule for http
  lineinfile: dest=/etc/sysconfig/iptables regexp="{{ httpd_port }}" line="-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport {{ httpd_port }} -j ACCEPT" insertbefore="^# add end" state=present

- name: add iptables rule for https
  lineinfile: dest=/etc/sysconfig/iptables regexp="{{ https_port }}" line="-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport {{ https_port }} -j ACCEPT" insertbefore="^# add end" state=present

- name: iptables restart
  command: /etc/init.d/iptables restart

templates/h2o.conf

access-log: /var/log/h2o/access.log
error-log:  /var/log/h2o/error.log
pid-file:   /usr/local/etc/h2o/h2o.pid

http2-reprioritize-blocking-assets: ON
gzip: ON
expires: 1 day

hosts:
  "meganii.com:80":
    listen:
      port: 80
    paths:
      "/":
        redirect: https://meganii.com/
  "meganii.com:443":
    listen:
      port: 443
      ssl:
        certificate-file: /etc/letsencrypt/live/meganii.com/fullchain.pem
        key-file:         /etc/letsencrypt/live/meganii.com/privkey.pem
        minimum-version: TLSv1
        cipher-suite: "AESGCM:HIGH:!3DES:!RSA:!aNULL:!eNULL:!MD5"
        cipher-preference: server
    paths:
      "/":
        file.dir: /home/web/www/meganii.com/

h2oでWordpressを動かそうとしたときのメモ

h2ophp-fpmの設定を下記の通り設定すれば、h2oでWordpressが動くことは動きました。でも、以下の不具合が出てしまい、うまく表示ができない状態になってしまいました。

  • 静的ファイル(css,js,img)の読込エラーで、レイアウトが崩れる
  • サブディレクトリで複数のブログを管理しているが、その管理画面の表示がうまくできない

静的ファイルの読込エラーは、おそらくh2oとWordpressのファイル読取・実行権限が上手くいっていないことが考えられます。h2oはデフォルトでnobodyとして動くはずなので、user: wordpressとしたのですが、ダメでした。どこを見なおせばよいのか。。

また、管理画面の表示がうまくいないのは、nginxでいうところのRewriteの部分が影響しているとかんがえられる。これは、h2oでどのように書くのがよいのか要調査。

# Rewrite multisite '.../wp-.*' and '.../*.php'.
if (!-e $request_filename) {
        rewrite ^/[_0-9a-zA-Z-]+(/wp-.*) $1 last;
        rewrite ^/[_0-9a-zA-Z-]+.*(/wp-admin/.*\.php)$ $1 last;
        rewrite ^/[_0-9a-zA-Z-]+(/.*\.php)$ $1 last;
}

h2o.conf

user: wordpress
file.custom-handler:
  extension: .php
  fastcgi.connect:
    port: /var/run/php-fpm/wordpress.sock
    type: unix
"domain.com:80":
  listen:
    port: 80
  paths:
    "/":
      redirect: https://domain.com/
"domain.com:443":
  listen:
    port: 443
    ssl:
      certificate-file: /etc/letsencrypt/live/domain.com/fullchain.pem
      key-file:         /etc/letsencrypt/live/domain.com/privkey.pem
      minimum-version: TLSv1
      cipher-suite: "AESGCM:HIGH:!3DES:!RSA:!aNULL:!eNULL:!MD5"
      cipher-preference: server
  paths:
    "/":
      file.dir: /srv/wordpress
      file.dirlisting: OFF
      redirect:
        url: /index.php/
        internal: YES
        status: 307

/etc/php-fpm.d/wordpress.conf

[wordpress]
listen = /var/run/php-fpm/wordpress.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

user = wordpress
group = wordpress

pm = dynamic
pm.max_children = 10
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.max_requests = 500
chdir = /srv/wordpress/
php_admin_value[open_basedir] = /srv/wordpress/:/tmp
php_admin_value[error_log] = /var/log/php-fpm/www-error.log

まとめ

静的ファイルをホストするには、configファイルもシンプルで楽、たぶんデフォルトでうまいことやってくれるのがh2oだと思う。Wordpressをなんとか動かせるようにして、サーバープッシュなどの機能を有効にしてベンチマークを取りたい。

ただ、やりたいことはただ単純にブログと簡単なアプリを公開したいだけなので、その目的を実現するためには、ネットで情報があるnginx + Wordpressの方が設定を探しやすいことは探しやすい。

まあ、何事も勉強ということで。