🗡

BusyBoxのhttpd

2021/09/24に公開

概要

ちょっとした動作確認とか例を用意するときに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

他にも機能を持っているため、気が向いたら試そうと思います。

以上です。

脚注
  1. -fを付けるとforegroundで実行します ↩︎

Discussion