BusyBoxのhttpd
概要
ちょっとした動作確認とか例を用意するときにNginxを使用していた場面でBusyBoxのHTTPサーバー(httpdコマンド)が使えるんじゃないかと思って、いくつかの使い方をメモしておきたいと思います。
環境
BusyBoxはDockerコンテナで用意します。
$ docker --version
Docker version 20.10.8, build 3967b7d
$ docker run --rm busybox busybox --help|head -n 1
BusyBox v1.33.1 (2021-09-13 17:20:40 UTC) multi-call binary.
静的ファイルをホスティング
-h
でディレクトリをホスティングできます。
例えば次の内容でstatic/index.html
を用意してください。
<h1>Hello, world!</h1>
それから次のコマンドでBusyBoxのHTTPサーバーを立てます。[1]
docker run -d --name web -p 8080:80 -v $PWD/static:/static \
busybox httpd -f -h /static
curl
で動作確認してみましょう。
curl -s http://localhost:8080
Hello, world!
が返ってきましたね。
ちなみに、BusyBoxにはwget
が備わっているので、それで動作確認しても良いですね。
docker exec web wget http://localhost -q -O -
CGIを使う
/cgi-bin/
配下のパスはCGIスクリプト(懐かしすぎる)とみなして実行してくれます。
BusyBox単体だとシェルスクリプトをCGIスクリプトにできます。
例えば次のようなファイルをcgi/cgi-bin/index.cgi
として作成してください。
#!/bin/sh
# レスポンスヘッダーまたは空行から開始する必要がある
printf "\r\n"
printf "<h1>Hello, $(whoami)!</h1>"
# 設定された環境変数を見たい場合は次の行のコメントを外す
# env
それから実行権限を付けます。
chmod +x cgi/cgi-bin/index.cgi
実行権限が付けられたらHTTPサーバーを立てます。
docker run -d --name web -p 8080:80 -v $PWD/cgi:/cgi \
busybox httpd -f -h /cgi
動作確認してみましょう。
curl -s http://localhost:8080/cgi-bin/index.cgi
<h1>Hello, root!</h1>
と表示されましたね。
CGIの仕様についての詳細はRFC 3875を参照してください。
特定のパスへのリクエストをproxyする
設定ファイルを用意することで特定のパスへのリクエストをproxyできます。
まず次の内容で設定ファイルを用意します。
ファイル名はproxy/httpd.conf
とします。
P:/greeting:http://web/greeting
次にHTMLファイルを2つ用意します。
1つめは次の内容でproxy/public/index.html
とします。
<h1>Hello, proxy!</h1>
2つめは次の内容でweb/greeting/hello.html
とします。
<h1>Hello, world!(via proxy)</h1>
最後にBusyBoxでHTTPサーバーを2つ立てます。
docker run -d --name web -v $PWD/web/public:/public \
busybox httpd -f -h /public
docker run -d --name proxy -p 8080:80 --link web -v $PWD/proxy:/proxy \
busybox httpd -f -h /proxy/public -c /proxy/httpd.conf
curl
で動作確認しましょう。
まずはproxy
がホスティングしている静的ページを取得します。
curl -s http://localhost:8080
<h1>Hello, proxy!</h1>
が返されましたね。
続いてproxy
経由でweb
がホスティングしている静的ページを取得します。
curl -s http://localhost:8080/greeting/hello.html
<h1>Hello, world!(via proxy)</h1>
が返されましたね。
終わりに
今回はBusyBoxに備わったhttpd
コマンドを使って次の機能を試しました。
- 静的ページのホスティング
- CGI
- proxy
他にも機能を持っているため、気が向いたら試そうと思います。
以上です。
-
-f
を付けるとforegroundで実行します ↩︎
Discussion