busyboxで簡易WEBサーバー

ALL
スポンサーリンク

Linuxコマンドを1つのプログラムに詰め込んだ BusyBoxというツールがあります。
このbusyboxは busybox httpd で実行するだけで、WEBサーバーを動かすことができます。

ここでは、BusyBox の Linux版について説明します。

スポンサーリンク

とにかく早く動かしたい場合

rootユーザで以下を実行すると、busybox が存在するディレクトリ以下をWEB公開できます。
(ファイアウォールで80番ポートを許可しておいてください)
終了する場合は、CTRL-C を押してください。

busybox httpd -f

待ち受けポート番号を1024以上にする場合は、一般ユーザーでも実行できます。
-p でポート番号を指定します。
ファイアウォールで、指定したポートへの接続を許可しておいてください。

busybox httpd -f -p 30000

CGIも動作できます。
busybox が存在するディレクトリ下に cgi-bin を作成し、そこに実行可能なスクリプトを置くとCGIとして動作します。

デフォルトの動作

busybox をWEBサーバーとして動作させるには、次のように実行します。
これに加えてオプションや設定ファイルで動作を指定できます。

busybox httpd

特に指定しない場合のデフォルトの動作は次のようになります。

  • ホームディレクトリ(ドキュメントルート)
    busybox のあるディレクトリ
  • CGIディレクトリ
    ホームディレクトリ(ドキュメントルート)下の cgi-binディレクトリ
  • ポート番号
    80番
  • アクセス制限
    なし(全てのアクセス元を許可)
  • 設定ファイル
    httpd.conf が存在する場合は、その内容。詳細は後述の「設定ファイルによる設定」を参照。
  • 動作
    バックグラウンドプロセスとして動作

コマンドラインオプション

busybox httpd に続けて、次のオプションを指定できます。

-f
デーモンとして動作しません。-fオプションを付けない場合は、デーモンとして動作します。

-c 設定ファイルのパス
設定ファイルを指定します。詳細は後述の「設定ファイルによる設定」を参照。

-p [IPアドレス:]ポート番号
接続を待つIPアドレス、ポート番号を指定します。IPアドレスは省略可能です。
ポート番号に1023番以下を指定したい場合は、busyboxをrootで実行する必要があります。

-u ユーザー[:グループ]
指定したユーザー(とグループ)で動作します

-h HOME
WEB公開するホームディレクトリ(ドキュメントルート)を指定します。このオプションが指定されない場合は、busybox が存在するディレクトリがホームディレクトリ(ドキュメントルート)になります。

-r レルム名
busybox httpd で、このレルム名を指定する必要性がよくわかりませんでした。
以前のブラウザでは、BASIC認証時にこのレルム名がユーザ名・パスワード入力を求めるダイアログで表示されていましたが、最近のブラウザでは表示がされず、そのために指定する必要性はありません。
また、Apacheのbasic認証とdigest認証 | パソコン鳥のブログ の「レルム名について」での説明のように、認証にレルム名が使用されますが、busybox httpd ではディレクトリ毎にレルム名の指定ができないので、このような用途としてもレルム名を指定する必要性がありません。

-i
inetdを使用している場合は、このオプションを指定しますが、わたしの方では動作は未検証です。

-m STRING
このオプションはWEBサーバーとしての動作に関係はありません。
指定された文字列を、MD5ハッシュ化して表示して、busybox httpd はすぐ終了します。WEBサーバーとして動作することはありません。
以降で記載の「ユーザー名とパスワードでアクセス制限」の箇所で、ユーザーのパスワードをMD5ハッシュで記述する場合に、ここでの表示内容を使用できます。

-e STRING
-d STRING
これらのオプションはWEBサーバーとしての動作に関係はありません。
それぞれ指定された文字列を、HTMLエンコード/URLでコードを表示します。
表示後、busybox httpd はすぐ終了します。WEBサーバーとして動作することはありません。

設定ファイルによる設定

以降の内容を設定ファイルに記述することで、WEBサーバーの動作を指定できます。
設定ファイルとして httpd.conf、または busybox httpd で -cオプションで指定したファイルが使用されます。

httpd.conf は、ホームディレクトリ(ドキュメントルート)下のサブディレクトリ下にも置くことができます。設定内容は、httpd.conf が置かれたディレクトリ(とそのサブディレクトリ以下)で有効です。

上位ディレクトリにhttpd.confが存在したり -cオプションで指定されている場合は、それらの設定に追加される形で、下位のサブディレクトリのhttpd.conf の設定内容が追加されます。

IPアドレスでアクセス制限

許可

A: に続けて、アクセス許可するIPアドレスを CIDR表記で指定します。

A:172.20.
A:10.0.0.0/25
A:10.0.0.0/255.255.255.128
A:127.0.0.1

すべてのアクセス元を許可するには、次のようにします。
ただし、後述の「許可と拒否のルール」での説明通り、デフォルトは全てのアクセスは許可で、許可と拒否のルールでは拒否のルールが優先されるため、下記を記述する意味はありません。

A:*

拒否

D: に続けて、アクセス拒否するIPアドレスを CIDR表記で指定します。

D:192.169.
D:192.168.33.128/25
D:192.168.48.0/255.255.255.128
D:10.8.4.56

すべてのアクセス元を拒否するには、次のようにします。
ただし、後述の「許可と拒否のルール」での説明通り、許可と拒否のルールでは拒否のルールが優先されるため、下記を記述するとどこからもアクセスできなくなります。

D:*

許可と拒否のルール

デフォルトでは、すべてのアクセスを許可しています。

許可と拒否の記述を混ぜて記述できます。許可と拒否のルールが衝突した場合は、拒否のルールが優先されます。

ユーザー名とパスワードでアクセス制限

ユーザー名・パスワードで制限

次の書式で記述します。
指定されたディレクトリに対して、指定されたユーザー名・パスワードで認証します。
パスワードは、そのまま記述するか、MD5ハッシュ化されたものを記述します。
なお、ディレクトリについては、以降の「ディレクトリ」の箇所も参照してください。

ディレクトリ名:ユーザー名:パスワード

例えば、次のようにすると、URLのディレクトリ部が /test の場合に、BASIC認証が要求され、ユーザ名 user、パスワードに passwd を指定すると、ページにアクセスできます。

/test:user:passwd

なお、上記例で URLのディレクトリ部が /test2 で始まる場合は、対象では無いことに注意してください。

/etc/passwd 内のユーザー名・パスワードで制限

/etc/passwd に記述されたユーザー・パスワードで認証するには、ユーザー名やパスワードの箇所を * にします。
ただし、rootユーザーで busybox を起動している必要があります。

ディレクトリ名:ユーザー名:*
ディレクトリ名:*:*

ディレクトリ

ユーザー名とパスワードでアクセス制限する際に記述するディレクトリは、httpd.conf が存在する場所を基準にします。

例えば、ホームディレクトリ(ドキュメントルート)が /home/user/web の場合に、/home/user/web/httpd.conf に次のように記述すると、これは URL のディレクトリ部が / で始まる場合(http://xxxxxx/ のような場合)に適用されます。

/:test:passwd

URLのディレクトリ部が /subdirの場合(http://xxxxxx/subdir のような場合)の指定は、次の2つのパターンがあります。

1つ目は、/home/user/web/httpd.conf に記述する場合です。

/subdir:test:passwd

2つ目は、/home/user/web/subdir/httpd.conf に指定する場合です。
(この場合は、/home/user/web/httpd.conf に 先述の /subdir:test:passwd を記述しないようにしてください)
指定するディレクトリが、httpd.conf を置いた subdir を基準として単に / となっていることに注意してください。

/:test:passwd

ホームディレクトリ(ドキュメントルート)

次の書式で指定します。
busybox httpd で -hオプションで指定していた場合でも、ここでの指定の方が使用されます。

H:ディレクトリ

404エラーページ

次の書式で、404エラー時に表示するHTMLファイルを指定します。
この設定は、-c オプションで指定する設定ファイルでのみ有効なようです。
ホームディレクトリ(ドキュメントルート)以下に置いたhttpd.confでの指定では、config error となります。

E404:HTMLファイルのパス

デフォルトページ

ブラウザで指定するURLがディレクトリのみの場合に、表示されるようになっているページをデフォルトページといいます。デフォルトではindex.htmlを表示しようとします。
次の書式で、デフォルトページとするHTMLファイルを指定します。

I:HTMLファイルのパス

リバースプロキシ

次の書式で、リバースプロキシの動作を指定します。リダイレクト先URLに、httpsは指定できません。
この設定は、-c オプションで指定する設定ファイルでのみ有効なようです。

P:リクエストURL:リダイレクト先URL

たとえば、次のように設定すると、ブラウザで http://hoge/hage/index.html にアクセスすると、http://xxxxxxx/test/hage/index.html にリダイレクトされます。

P:/hoge:http://xxxxxxx/test

なお、busybox httpd 実行時に、「httpd: config error」でリバースプロキシの設定業が表示された場合は、その busybox のビルドではリバースプロキシの指定に対応していません。

MIMEタイプの指定

次のように、拡張子とMIMEタイプを指定できます。

.flac:audio/flac

デフォルトでは、次のものが定義されているようです。

.txt.h.c.cc.cpp:text/plain
.htm.html:text/html
.jpg.jpeg:image/jpeg
.gif      image/gif
.png      image/png
.css      text/css
.wav      audio/wav
.avi      video/x-msvideo
.qt.mov   video/quicktime
.mpe.mpeg:video/mpeg
.mid.midi:audio/midi
.mp3      audio/mpeg

CGI

ホームディレクトリ(ドキュメントルート)/cgi-bin ディレクトリ内の実行可能プログラムが CGIプログラムとして動作できます。
(http://xxxxxx/cgi-bin/test.pl のようにアクセスします)

または、httpd.conf 内で下記のように拡張子と実行パスを指定していた場合は、実行権がついていないものでも動作可能です。

*.sh:/bin/sh

CGIプログラムには、QUERY_STRINGやREMOTE_ADDRといった環境変数も渡ってきます。

参考

BusyBox – The Swiss Army Knife of Embedded Linux
[OpenWrt Wiki] BusyBox HTTP Daemon (httpd) webserver
httpd.c « networking – busybox – BusyBox: The Swiss Army Knife of Embedded Linux

コメント