h2oの設定(Raspbian buster)

##１　はじめに
　自宅サーバーRaspbian3 B(RAM:1GB,ストレージ32GBmicroSDカード）で立ち上げました。Webはh2o、証明書はcertbotでフリーの証明書を取得、fcgiwrapでcgiやり放題にしました。目的は個人的にpythonやrubyで記述したスクリプトをWeb上で動かしたかっただけです。
 以下の内容は自分のサイトにも公開してあります。

##2　サーバーソフトh2oのインストール
```
$sudo apt-get install h2o
```
##3 ドキュメントルートの設定

/home/hogehoge/public_html/下を公開する設定

/etc/h2o/h2o.confを　編集

```
server-name: "h2o (Debian)"
user: www-data
access-log: "|rotatelogs -l -f -L /var/log/h2o/access.log -p /usr/share/h2o/compress_logs /var/log/h2o/access.log.%Y-%m-%d 86400"
error-log: "|rotatelogs -l -f -L /var/log/h2o/error.log -p /usr/share/h2o/compress_logs /var/log/h2o/error.log.%Y-%m-%d 86400"
pid-file: /run/h2o.pid

hosts:
  "hogehoge.mydns.jp:80":
    listen:
     port: 80
    paths:
      /:
        file.dir: /home/hogehoge/public_html
        redirect:
            url: /index.html/
            internal: YES
            status: 307
      /server-status:
        status: ON
```

冒頭のserver-nameはdefaultのままです。
user: はwww-dataに変更しました。
file.dir:にwebのルートディレクトリを記述します。
h2o.confはレベルによって字下げをきちんとしないと文法エラーになります。
チェック方法は

```
# h2o  -c h2o.conf  -t
```

エラーがなかったら起動します。

```
# systemctl  restart h2o
```

 
##4 cgiを動かす設定
fcgiwrapをインストールします。

```
$ sudo apt-get install fcgiwrap
```

/etc/h2o/h2o.conf

```
server-name: "h2o (Debian)"
user: www-data
access-log: "|rotatelogs -l -f -L /var/log/h2o/access.log -p /usr/share/h2o/compress_logs /var/log/h2o/access.log.%Y-%m-%d 86400"
error-log: "|rotatelogs -l -f -L /var/log/h2o/error.log -p /usr/share/h2o/compress_logs /var/log/h2o/error.log.%Y-%m-%d 86400"
pid-file: /run/h2o.pid

hosts:
  "hogehoge.mydns.jp:80":
    listen:
     port: 80
    paths:
      /:
        file.dir: /home/hogehoge/public_html
        redirect:
            url: /index.html/
            internal: YES
            status: 307
        file.custom-handler:
            extension: .cgi
            fastcgi.spawn:
                command: "exec /usr/sbin/fcgiwrap"

      /server-status:
        status: ON
```
ちなみに以下は動作確認のためのサンプルスクリプト
(わざわざclassを記述しているけど覚えたてで使ってみたかっただけ）

```
#!/usr/bin/env python3.7
class htmlput():
    def __init__(self):
        print('Content-type: text/html \n\n')
    def html_send(self,msg_str):
        txt='''
        <html>
        <head>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8">
        <title>pythonでwebページを表示</title>
        </head>
        <body link="#0000EE" vlink="#551A8B" text="#000000" bgcolor="#ffff99" alink="#EE0000">
        {}
        <br>
        </body>
        </html>
        '''
        print(txt.format(msg_str))

htm=htmlput()
htm.html_send('python ためし<br>')
```




##5 BASIC認証の設定
/home/hogehoge/puclic_html/kisho のところだけBASIC認証する設定です。
まずmrubyをインストールします。

```
$ sudo apt-get install mruby
```


/etc/h2o/h2o.confファイルの設定

```
hosts:
  "hogehoge.mydns.jp:80":
    listen:
     port: 80
    paths:
      /:
        file.dir: /home/hogehoge/public_html
        redirect:
            url: /index.html/
            internal: YES
            status: 307
        file.custom-handler:
            extension: .cgi
            fastcgi.spawn:
                command: "exec /usr/sbin/fcgiwrap"
      /kisho:
        mruby.handler: |
            require "htpasswd.rb"
            acl {
            use Htpasswd.new("/home/hogehoge/.htpasswd", "realm-name")
            }
        file.dir: /home/hogehoge/public_html/kisho
        file.custom-handler:
            extension: .cgi
            fastcgi.spawn:
                command: "exec /usr/sbin/fcgiwrap"
      /server-status:
        status: ON

```
上のリストに"/home/hogehoge/.htpasswd", "realm-name"
と記述しましたがhogehogeのホームディレクトリでユーザidとパスワードを
次のように設定します。

```
$ htpasswd -nbm ユーザid   パスワード　 > .htpasswd
$ sudo chown web-data .htpasswd
$ sudo chmod 400 .htpasswd
```
あとは h2o -c h2o.conf -t　でh2o.confのチェックがとおったらh2oを再起動する。

##6 certbotでSSL化
certbotを使えば無料で認証局CAの証明書がもらえます。以前はletsenryptというパッケージだったらしい。
インストール

```
# apt-get install certbot
```
SSL証明書を発行してもらう前に必ずサーバーを起動してく。それから以下のコマンドを実行

```
# certbot certonly --webroot -w /home/hogehoge/public_html/ -d hogehoge.mydns.jp --agree-tos
```

成功すると
/etc/letsencrypt/live/[FQDN]/ の下に以下のファイルができる。

privkey.pem  : the private key for your certificate.
fullchain.pem: the certificate file used in most server software.
chain.pem    : used for OCSP stapling in Nginx >=1.3.7.
cert.pem     : will break many server configurations, and should not be used


もし鍵を削除する場合は

```
# certbot delete --cert-name hogehoge.mydns.jp
```

次に/etc/h2o/h2o.confの設定

```
server-name: "h2o (Debian)"
user: www-data
access-log: "|rotatelogs -l -f -L /var/log/h2o/access.log -p /usr/share/h2o/compress_logs /var/log/h2o/access.log.%Y-%m-%d 86400"
error-log: "|rotatelogs -l -f -L /var/log/h2o/error.log -p /usr/share/h2o/compress_logs /var/log/h2o/error.log.%Y-%m-%d 86400"
pid-file: /run/h2o.pid
file.index: ['index.html']

listen: 80
listen:
  port: 443
  ssl:
    certificate-file: /etc/letsencrypt/live/hogehoge.mydns.jp/fullchain.pem
    key-file: /etc/letsencrypt/live/hogehoge.mydns.jp/privkey.pem

hosts:
  # httpでアクセスがあったらhttpsにリダイレクト
  "hogehoge.mydns.jp:80":
    paths:
      "/":
        redirect:
          url:  https://hogehoge.mydns.jp/
          status: 301
   
  "hogehoge.mydns.jp:443":
    paths:
      "/":
        file.dir: /home/hogehoge/public_html
        file.custom-handler:
          extension: .cgi
          fastcgi.spawn:
            command: "exec /usr/sbin/fcgiwrap"
      "/kisho":
        mruby.handler: |
          require "htpasswd.rb"
          acl {
          use Htpasswd.new("/home/hogehoge/.htpasswd", "realm-name")
          }
        file.dir: /home/hogehoge/public_html/kisho
        file.custom-handler:
          extension: .cgi
          fastcgi.spawn:
            command: "exec /usr/sbin/fcgiwrap"
      /server-status:
        status: ON
```
あとはちゃんと443ポートを開けておくことを忘れずに

証明書の有効期限は90日なのでcrontabで月１回更新を登録

```
#毎月３日の2時1分に証明書を更新する
01 02 03 * * /usr/bin/certbot renew && /bin/systemctl restart h2o
```