3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

dockerコンテナ上のH2OでCGIを動かそうとした on alpine linux

Posted at

背景

Docker コンテナ上でPerlを動かし、メモリを節約したかった。
注意: 本記事はパフォーマンスレポートではありません。

構成

次の構成のコンテナを作成する。

  • docker
    • alpine-linux
    • H2O
    • fcgiwrapper (via tcp)
    • supervisord

ポイント

  • 各種デーモンはrootで起動して、デーモン内でsetuid等を行う(fcgiwrapperを除く)
  • fcgiwrapper は unix socket ではなく、tcp 通信を行う
    • 起動時にユーザー(fcgiwrapper)のチェックを行うため、そのままでは起動できない
    • H2Oからソケットを参照するときに同一ユーザーじゃないとエラーとなる
    • fcgiwrapper の起動前にソケットを削除しなくてはならない(この操作はTCPの場合不要)
  • 各種ファイル(cgi)は /var/www/html へ配置
  • 配置したファイルは必ず所有者をwww-dataとすること

各種コード

  • Dockerfile
  • entrypoint.sh
  • h2o.conf
  • supervisord.conf
Dockerfile.
FROM alpine:latest

USER root
RUN apk add -U --no-cache \
    fcgi fcgiwrap perl \
    h2o supervisor sudo 

COPY supervisord.conf \
     h2o.conf \
     entrypoint.sh \
     /tmp/
RUN set -ex \
      && adduser -S -H -G www-data -u 82 www-data \
      && mv /tmp/supervisord.conf /tmp/h2o.conf /etc/ \
      && chmod 644 /etc/supervisord.conf /etc/h2o.conf \
      && mv /tmp/entrypoint.sh /etc/ \
      && chmod +x /etc/entrypoint.sh \
      && mkdir -p /var/www/html \
      && chown -R www-data:www-data /var/www/html
# Put entry point to execute
ENTRYPOINT ["/etc/entrypoint.sh"]
EXPOSE 80
# Startup supervisor
CMD ["supervisord", "-c", "/etc/supervisord.conf"]
entrypoint.sh
#!/bin/sh

exec $@
h2o.conf
pid-file: /tmp/h2o.pid
access-log: /dev/stdout
error-log: /dev/stderr
user: www-data

file.custom-handler:
  extension: [ .pl, .cgi ]
  fastcgi.connect:
    port: 9000
    type: tcp

compress: on
file.index: [ 'index.html', 'index.htm', 'index.txt', 'index.pl' ]

hosts:
  "local:80":
    listen:
      port: 80
      host: 0.0.0.0
    paths:
      "/":
        file.dir: /var/www/html

supervisord.conf
[supervisord]
nodaemon=true
loglevel=info
user=root
logfile=/dev/null
logfile_maxbytes=0
pidfile=/tmp/supervisord.pid

[program:fcgiwapper]
command=/usr/bin/fcgiwrap -c 3 -s tcp:127.0.0.1:9000
autorestart=true
user=fcgiwrap
group=www-data
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
priority=100

[program:h2o]
command=/usr/bin/h2o -c /etc/h2o.conf
autorestart=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
startsecs=3
priority=200

参考文献

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?