nc コマンドで簡易に http サーバを立ち上げることができます。大体の *nix ディストリビューションにはデフォルトで入っているので気軽に利用できます。

$ nc -l 8080

これで 8080 番ポートで listen してくれる tcp サーバが立ち上がります.curl http://localhost:8080 とリクエストを送ると nc コマンドに http リクエストの内容が出力されます。個人的には別途 tcpdump しなくても良いこの挙動が大好きです。 

$ nc -l 8080
GET / HTTP/1.1
User-Agent: curl/7.15.5 (i686-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
Host: localhost:8080
Accept: */*

ただこれだと、レスポンスを何も返していないので、そのまま固まります。この場合は curl コマンドを Ctrl-C で終了しましょう。

レスポンスも返したい場合はパイプで渡せばよいです。

$ ( echo "HTTP/1.0 200 Ok"; echo; echo "Hello World" ) | nc -l 8080

これでちゃんとレスポンスが返ります。

$ curl -v http://localhost:8080
* About to connect() to localhost port 8080
*   Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 8080
> GET / HTTP/1.1
> User-Agent: curl/7.15.5 (i686-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
> Host: localhost:8080
> Accept: */*
>
< HTTP/1.0 200 Ok
Hello World
* Closing connection #0

ただ1回返すと nc コマンドは終了してしまうので、ずっと起動しておきたい場合は、

$ while true; do ( echo "HTTP/1.0 200 Ok"; echo; echo "Hello World" ) | nc -l 8080; done

のようにループさせる必要があります。あれ、Ctrl-C で死なないですね。Ctrl-z で中断して kill %job で終了させてください ^^;

$ while true; do ( echo "HTTP/1.0 200 Ok"; echo; echo "Hello World" ) | nc -l 8080; done
# ^z
[1] + 6782 suspended
$ kill %1 [1] + 6782 terminated

※ なにかうまい方法ないかな ...

追記:見つけた!

$ while true; do ( echo "HTTP/1.0 200 Ok"; echo; echo "Hello World" ) | nc -l 8080; [ $? != 0 ] && break; done

これで Ctrl-C で終了できました :D
でも長くなって覚えるのめんどくさいから、Ctrl-z でいいや ^^;

さらに追記:これでもイケますね。ってなんだかシェル芸の記事みたいになってきた。。。

$ bash -c 'trap exit INT; while true; do ( echo "HTTP/1.0 200 Ok"; echo; echo "Hello World" ) | nc -l 8080; done'