httpサーバーh2o設定メモ

2024.02.16 debian bookworm
2023.03.04 debian bullseye
2020.04.09 raspbian buster


   h20+certbot(== letsencrypt)でssl化

1 インストール

$audo apt-get install h2o

重要!

Debian Ver11 bullseye で h2oをインストールするとapache2のライブラリ等も一緒にはいる。しかし、完璧ではないので、h2oは動かない。
sudo  systemctl  start h2o
とやってもエラーメッセージも出ない。 
ps  ax | grep  h2o
で確認してもまったく動いていない。
ところが
sudo  apt-get install apache2
sudo  apt-get remove apache2
systemctl  restart h2o
とするとやっと動くようになり、
ps ax | grep h2o でデーモンが動いていることが確認できる
以上は、Debian Ver12 bookwormでは何もしなくてOK


2 /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:
  "karappi.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

 h2o.congのチェック
# /usr/bin/h2o -c h2o.conf -t
  configuration OK
  configuration OKが出るまで修正

起動
$ sudo systemctl restart h2o
※debian Ver12 bookwormでは /home/hogehoge を
$ sudo chmod 755 /home/hogehoge
でパーッミッションを変更しておく必要がある。


ユーザkarappiをグループwww-dataに追加しておく(www-dataは、httpdのデーモン)
$ sudo  gpasswd  -a  karappi www-data
( 削除するときは -d オプションを使う)

/home/karappiのパーミッションを変更
$ sudo  chmod 755 /home/karappi
 

3 cgiを動かす設定

 ngnx同様、fcgiwrap経由で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:
  "karappi.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

ちなみにh2o下で試したcgiはpython3のスクリプト
/home/hogehoge/public_html/tameshi.cgi
#!/usr/bin/env python3.7
class htmlput():
    def __init__(self):
        print('Content-type: text/html \n\n')
        '''上の最後の改行コード2個ってちょっとしたノウハウ'''

    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>')
パーミションは$ chmod 500 tameshi.py  にしてオーナーを $ chown  www-data tameshi.pyにしておく

もしrubyで作るなら(最初のところまで)
tameshi.cgi
#!/usr/bin/ruby -Ku

STDOUT.sync = true
puts "Content-type: text/html"
puts
# 上の行のContent-type: text/htmlのあとに1個putを入れておかないとなぜかエラーに
#以下略

4 BASIC認証  basic authentication の設定

/home/hogehoge/public_html下でcgiやり放題になったけど/home/hogehoge /public_html/kisho 下をアクセスするときは
basic認証にしたい場合の設定

/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:
  "karappi.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

 mruby.handler: の行末のパイプ |  あれはなんだか?わからない
 ところでh2oのbasic認証で検索すると/etc/h2o/下に  enabled-sites/mruby/htpasswd.rbを置くという記述がいくつか見られたけど
Debian Ver10.3(raspbian buster) では無くても動いている。

 mrubyのインストール
$ sudo apt-get install mruby

ユーザーIDとパスワードファイルの設定
$ htpasswd -nbm ユーザid   パスワード  > .htpasswd
$ sudo chown www-data .htpasswd
$ sudo chmod 400 .htpasswd

※2024.02.16追記
raspberryPIでは、上のように.htpasswdを作成するが、 Debian Ver12やubuntu Ver22.04以降の64bitOSでは -sオプションを追加してやらないと認証ができないことがわかった(これいろいろ試してて発見するのに 2week近くかかった)
以下のように一文字sをオプションに追加する (パスワードのSHAオプション)
$ htpasswd -nbms ユーザid   パスワード  > .htpasswd




あとはh2o.confの文法チェックをしてh2oを再起動して出来上がり。
# /usr/bin/h2o -c /etc/h2o/h2o.conf -t
  configuration OK
# systemctl restart h2o