httpサーバを手っ取り早く立てる


概要

開発時 http サーバが欲しくなる以下のような状況について記載します。

  • 静的htmlファイルなどを file:/// を使わずブラウザで開きたい。
  • CGI(php) をとりあえず動かしたい。
  • リバースプロキシサーバ(nginx)をとりあえず動かしたい。

ここ最近数ヶ月のうちに、2つ目と3つ目の方法が必要になり、調べてました。せっかくなので記事化しておく。

対象環境

Linux。メジャーな distribution なら大差ないはず。

手段

静的htmlファイルなどを開くためのhttpサーバを立てる

python3http.server モジュールを使う。

$ python3 -m http.server 8000
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

http://localhost:8000/ に接続。
index.html が無ければディレクトリ一覧も出るので便利。

CGI(php) をとりあえず動かしたい。

php が使える。

$ php -S 0.0.0.0:8000
[Sun Jul 25 18:52:46 2021] PHP 7.4.3 Development Server (http://0.0.0.0:8000) started

http://localhost:8000/ に接続。
ディレクトリ一覧は出せないので、一覧を自力で書くか、routerを定義する必要がある。

router の書き方については、以下の stackoverflow に書かれている回答が役に立ちました。

リバースプロキシサーバ(nginx)をとりあえず動かしたい

リバースプロキシサーバが必要になりました。仕方ないですね。docker で nginx を立てましょう。

まずは、最も単純な、8000 番ポートに nginx サーバを立てる方法。python3 -m http.server 8000 と大体同じ。

docker run --name my-nice-nginx --rm \
  -v $PWD:/usr/share/nginx/html:ro \
  -d -p 8000:80 nginx

終了するには、docker kill my-nice-nginx だけでok。--rm 付けていますし。

設定ファイルを書き換えるには、以下のように設定ファイルをマウントする。

docker run --name my-nice-nginx --rm \
  -v $PWD/nginx/html:/usr/share/nginx/html:ro \
  -v $PWD/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
  -v $PWD/nginx/conf.d:/etc/nginx/conf.d:ro \
  -v $PWD/nginx/log:/var/log/nginx/:rw \
  -d --net host nginx

ポートフォワーディングで(80から8000に変更するような)ポート変更の対応をすると、リバースプロキシとしてnginxを使いたいときに、dockerの設定が大変になる。
ここは --net host してしまって、nginx 側の設定でlistenするポートを置き換えると手を抜ける。conf.d/default.conf の変更も忘れずに。

本番環境はちゃんとカプセル化しましょう。