pumaをh2oをunixドメインソケットで連携させるところまで

## 概要

- [puma](https://github.com/puma/puma)
- [h2o](https://h2o.examp1e.net/) version 2.2.2
- HTTP/2, TLSは考慮してない
- OS: CentOS 7 (SELinuxは利用していない)

## 目次

- h2oの利用
  - ポートの開放
  - インストール・起動
- pumaの利用
  - ruby環境の構築
  - pumaの初期設定・起動
- h2oの設定・再起動

## h2oの利用

### ポートの開放

80番ポートをすでに使用していないか確認する。 `lsof` を使う。なければインストール。 `lsof` でなにも表示されなければよし

```
sudo yum install lsof -y
lsof -i:80 
```

80番ポートを解放する。serviceとしてhttp, portとして80/tcpを追加する。

```
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --add-port=80/tcp --zone=public --permanent
sudo firewall-cmd --reload
```

状況の確認

```
sudo firewall-cmd --list-all
```

### インストール・起動

- [H2Oの公式](https://h2o.examp1e.net)が[h2o-rpm](https://github.com/tatsushid/h2o-rpm)を紹介しているのでそれを使う
- おおむね[README.md](https://github.com/tatsushid/h2o-rpm/README.md)に従う
- 個人的な保守性のために若干READMEから変えている。bashでそのまま実行できるようにしている。`$` をエスケープしたりしている。

リポジトリの登録

```bash
cat <<EOS > bintray-tatsushid-h2o-rpm.repo
[bintray-tatsushid-h2o-rpm]
name=bintray-tatsushid-h2o-rpm
baseurl=https://dl.bintray.com/tatsushid/h2o-rpm/centos/\$releasever/\$basearch/
gpgcheck=0
repo_gpgcheck=0
enabled=1
EOS

sudo mv bintray-tatsushid-h2o-rpm.repo /etc/yum.repos.d/
```

インストールする

```bash
sudo yum install h2o -y
```

起動する

```
sudo systemctl start h2o.service
```

確認する。`http://ipアドレス` にアクセスして「Welcome to H2O - an optimized HTTP server」と表示されたらIt works!

## pumaの利用

### ruby環境の構築

- rbenv,ruby-build,ruby,bundlerをinstallする
- [rbenv](https://github.com/rbenv/rbenv)
- [ruby-build](https://github.com/rbenv/ruby-build)

README通りに。特に細かく説明はしない。
`git` はリポジトリのダウンロードに、 `bzip2` はrubyのソースの解凍に、 `gcc` はrubyのソースのコンパイルに、`openssl-devel` `readline-devel` `zlib-devel` はrubyの依存ライブラリに利用している。 `gcc-c++` はtherubyracerで使うが、この記事には関係ない。

```
# すでにインストール済みであれば削除
sudo yum remove ruby
sudo yum install git bzip2 gcc openssl-devel readline-devel zlib-devel gcc-c++ -y
# rbenvのインストール
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
# ruby-buildのインストール
git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
cd ~/.rbenv/plugins/ruby-build
sudo ./install.sh
# rubyのインストール
rbenv install 2.4.1
# このシェルでは2.4.1を使う
# このバージョンしか使わないのであればrbenv global 2.4.1でも良い
# ディレクトリでバージョン固定するのであればrbenv local 2.4.1
rbenv shell 2.4.1
ruby -v
# => ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux] 
# bundlerのインストール
gem install bundler
```

### pumaの初期設定

pumaのインストール

```
mkdir puma-sample; cd puma-sample
bundle init
echo "gem 'puma'" >> Gemfile
bundle install --path=vendor/bundle
```

unixドメインソケットを置く場所の設定

```
sudo mkdir /var/run/puma
# pumaを起動するユーザが読書できるように
sudo chown $(whoami):$(whoami) /var/run/puma
```

必要なディレクトリを作る

```
mkdir -p config log tmp/pids public
```

puma設定ファイルの記述。https://github.com/puma/puma/blob/master/examples/config.rb

```
cat <<EOS > config/puma.rb
bind 'unix:///var/run/puma/puma.sock?umask=0111'
environment 'production'
daemonize true
pidfile "#{Dir.pwd}/tmp/pids/puma.pid"
stdout_redirect "#{Dir.pwd}/log/log.log", "#{Dir.pwd}/log/error.log"
preload_app!
EOS
```

Rackサーバーの設定。http://rack.github.io/

```
cat <<EOS > config.ru
app = -> env do
  [
    '200',
    {'Content-Type' => 'text/html'},
    [Time.now.to_s + ?\n]
  ]
end
run app
EOS
```

pumaの起動

```
bundle exec puma
```

## h2oの設定・再起動

YAMLで書く。https://h2o.examp1e.net/configure/proxy_directives.html
host名は適当に。

```
sudo sh -c "cat <<EOS > /etc/h2o/h2o.conf
user: nobody
listen:
  port: 80
hosts:
  example.com:
    paths:
      /:
        proxy.reverse.url: http://[unix:/var/run/puma/puma.sock]/
EOS"
```

h2oの再起動

```
sudo systemctl restart h2o.service
```

`http://IPアドレス/` なりhostなりでアクセスしてみて、現在時刻が表示されれば完了。