読者です 読者をやめる 読者になる 読者になる

pockestrap

Web Programmer's memo

楽々静的HTTPサーバー

Web 作ったもの Golang

静的なHTTPサーバーが欲しくなること、多々あると思います。

  • SPAを作っている時
  • クライアントサイドのみのWebアプリを作っている時
  • 人にちょっとファイルを渡したい時

こんな時に、カレントディレクトリ以下をサーブするだけのHTTPサーバーが欲しくなると思います。
そのような用途では、Python の http server モジュールが有名です。

現状: python -m http.server

以下のようにすると、カレントディレクトリ以下をサーブするHTTPサーバーが立ち上がります。

$ python -m http.server

私は使ったことは殆どないのですが、python2の場合は以下のコマンドになります。

$ python -m SimpleHTTPServer

上記コマンドを実行した後、ブラウザにてlocalhost:8000にアクセスすることでカレントディレクトリ以下を閲覧することが出来ます。

また、python以外の言語でも同様のことが可能なようです。
開発用ローカルサーバを立ち上げる方法 - Qiita

問題点

上記のコマンドによって静的HTTPサーバーを立てることが可能ですが、私は問題点がいくつかあると感じています。

  • コマンドが長い
  • ポートがかぶる
  • ブラウザが開かない

順々に説明していきます。

コマンドが長い

python -m http.server というコマンド、長いですね。 まるで万里の長城のようです。

これだけ長いと実行する際に打つのが大変です。
また、コマンド名を覚えるのが大変ですね。Pythonの場合は2系と3系でモジュール名が違うのも少々厄介です。

この問題はpecoなどを使用しシェルのヒストリを検索することで解決することが出来ます。
しかし、毎回pecoを呼び出す手間を考えると、最初から短いコマンドであった方が楽ですね。

ポートがかぶる

pythonを使用する方法だと、デフォルトでは8000番でHTTPサーバーが立ち上がります。
つまり既に他のアプリケーションが8000番を使用していると、HTTPサーバーを立ち上げることが出来ません。

そして、ポート番号の重複はよく発生します。
開発中のWebアプリが既に8000番を使用している状況は少なくないでしょう。
また、別のディレクトリで既にpython -m http.serverを実行しているだけでも重複してしまいます。

これはpython -m http.server 8888などポート番号を明示的に指定することで回避可能です。
しかし、明示的にポート番号を指定する手間が発生します。

  • まず8000番でHTTPサーバーを建てて
  • 使われていたら別の番号で建て直す

と、2段構えでコマンドを実行する手間が発生することも多々あるでしょう。

ブラウザが開かない

HTTPサーバーを起動した後、我々が行うことで一番多いのは

立ち上げたサーバーにブラウザからアクセスする

という行動であることはほぼ間違いないと思います。

ブラウザを開き、アドレスバーにlocalhost:8000などと打ち込むのは案外面倒なことです。

どうせなら、HTTPサーバーを起動したらそのままブラウザが開いてほしいですね。

解決策: www

そこで、解決策として、wwwと言うコマンドを作成しました。

github.com

使い方

$ www

以上です。とても簡単ですね。

wwwコマンドを実行すると、HTTPサーバーがランダムなポートで立ち上がり、ブラウザが自動的に開きます。

f:id:Pocke:20160125120042g:plain

  • 短い名前
  • ランダムなポート
  • 自動的に開くブラウザ

の3つによって、上で挙げた3つの問題が全て解決しています。

インストール

Go言語がインストールされている環境では、以下のコマンドを実行することでインストールが可能です。

$ go get github.com/pocke/www

また、リリースページからバイナリをダウンロードしてパスが通った場所に配置することでもインストールが可能です。

Latest Release · pocke/www

その他の機能

ポート番号の指定

-p or --port オプションで明示的にポート番号を指定してサーバーを起動することが出来ます。

$ www -p 8000
# or
$ www --port 8000

通常使用時にはランダムなポートでいいと思います。
しかし、例えばwww経由で人にファイルを受け渡しする際などはポート番号を明示的に指定できた方が便利でしょう。

リロード機能

f:id:Pocke:20160125120207g:plain

友人からのリクエストで機能追加しました。

wwwを起動しているターミナルでreloadと入力してからEnterを入力することで、もう一度ブラウザを開くことが出来ます。
誤ってブラウザのタブを閉じてしまった場合や、タブを複数開きたい場合に便利でしょう。

まとめ

GitHubでStarがほしい