サーバ設定

stat.inkの画像配信サーバがH2Oになりました


だからどうしたって話ではありますが、 img.stat.ink というホストのサーバが H2O になりました。変更前は Nginx でした。一度試してみたかったんですよね、H2O。

H2Oのコンパイル

CentOS 7 用の H2O の RPM が見当たらなかったので、tatsushid/h2o-rpm の成果物を使って RPM パッケージを作成しました。

Docker上でビルドするスクリプトなので、Dockerをインストールしておいて、

# git clone https://github.com/tatsushid/h2o-rpm.git
# cd h2o-rpm
# make centos7

こんな感じ。まったく簡単だ。

H2Oのインストール

構築されたRPMは centos7.build/RPMS/x86_64 あたりに吐かれているので、これを yum install

# yum install centos7.build/RPMS/x86_64/h2o-1.6.2-1.el7.x86_64.rpm

せっかくなのでインストールされたファイルの一覧を表示してみる。

# rpm -ql h2o

/etc/h2o
/etc/h2o/h2o.conf
/etc/logrotate.d/h2o
/run/h2o
/usr/bin/h2o
/usr/lib/systemd/system/h2o.service
/usr/share/doc
/usr/share/doc/h2o
/usr/share/doc/h2o/assets
/usr/share/doc/h2o/assets/8mbps100msec-nginx195-h2o150.png
/usr/share/doc/h2o/assets/firstpaintbench.png
/usr/share/doc/h2o/assets/remotebench.png
/usr/share/doc/h2o/assets/searchstyle.css
/usr/share/doc/h2o/assets/style.css
/usr/share/doc/h2o/benchmarks.html
/usr/share/doc/h2o/configure
/usr/share/doc/h2o/configure.html
/usr/share/doc/h2o/configure/access_log_directives.html
/usr/share/doc/h2o/configure/base_directives.html
/usr/share/doc/h2o/configure/command_options.html
/usr/share/doc/h2o/configure/errordoc_directives.html
/usr/share/doc/h2o/configure/expires_directives.html
/usr/share/doc/h2o/configure/fastcgi_directives.html
/usr/share/doc/h2o/configure/file_directives.html
/usr/share/doc/h2o/configure/gzip_directives.html
/usr/share/doc/h2o/configure/headers_directives.html
/usr/share/doc/h2o/configure/http1_directives.html
/usr/share/doc/h2o/configure/http2_directives.html
/usr/share/doc/h2o/configure/mruby_directives.html
/usr/share/doc/h2o/configure/proxy_directives.html
/usr/share/doc/h2o/configure/quick_start.html
/usr/share/doc/h2o/configure/redirect_directives.html
/usr/share/doc/h2o/configure/reproxy_directives.html
/usr/share/doc/h2o/configure/syntax_and_structure.html
/usr/share/doc/h2o/faq.html
/usr/share/doc/h2o/index.html
/usr/share/doc/h2o/install.html
/usr/share/doc/h2o/search
/usr/share/doc/h2o/search/jquery-1.9.1.min.js
/usr/share/doc/h2o/search/oktavia-english-search.js
/usr/share/doc/h2o/search/oktavia-jquery-ui.js
/usr/share/doc/h2o/search/searchindex.js
/usr/share/h2o/annotate-backtrace-symbols
/usr/share/h2o/fetch-ocsp-response
/usr/share/h2o/kill-on-close
/usr/share/h2o/setuidgid
/usr/share/h2o/start_server
/var/log/h2o
/var/www
/var/www/html
/var/www/html/index.html

なんか /etc/h2o/h2o.conf をいじって systemctl で動かせばどうにかなりそうな雰囲気ですね。

H2Oの設定

サイトとかを見ながらこんな感じに。

user: nobody
access-log: /var/log/h2o/access.log
error-log: /var/log/h2o/error.log
pid-file: /var/run/h2o/h2o.pid
hosts:
  "img.stat.ink:443":
    listen:
      port: 443
      ssl:
        certificate-file: "/etc/letsencrypt/live/img.stat.ink/fullchain.pem"
        key-file: "/etc/letsencrypt/live/img.stat.ink/privkey.pem"
        minimum-version: TLSv1
        cipher-suite: "AESGCM:HIGH:!3DES:!RSA:!aNULL:!eNULL:!MD5"
        cipher-preference: server
    paths:
      "/":
        file.dir: /home/statink/images
        header.add: "X-XSS-Protection: 1;mode=block"
        header.add: "X-Content-Type-Options: nosniff"
        header.add: "X-Frame-Options: DENY"
        header.add: "X-UA-Compatible: IE=Edge"
        header.add: "Strict-Transport-Security: max-age=31536000"
        header.add: "Cache-Control: no-transform"
        expires: 7 day
      "/.well-known/":
        file.dir: /home/statink/letsencrypt/.well-known/

  "img.stat.ink:80":
    listen: 80
    paths:
      "/":
        redirect: https://img.stat.ink/
      "/.well-known/":
        file.dir: /home/statink/letsencrypt/.well-known/

http2-reprioritize-blocking-assets: ON

/.well-known/ は Let’s Encrypt でごにょごにょやるための設定なので要らないひとは要らないはず(うちは大体Public Beta開始時の記事のとおりの設定なのでこうやると更新とか楽ちん)。
要る人は適当に合わせないと悲しいはず。

起動

とりあえず

# h2o -t -c /etc/h2o/h2o.conf

とかして設定の確認をして、

# systemctl enable h2o
# systemctl start h2o

とかお約束なことをやって、動作確認をしておしまい。

確認

あとはいつも通り SSL Labs で TLS の設定を確認して A+ もらって完了。