http や https サーバをローカルにサクッと立てたい時の便利コマンド。
Local Server
local に HTTP サーバを立てたい場合、よくこんなのが使われている。
$ python2 -m SimpleHTTPServer
$ python3 -m http.server
ただ、あまり気に入ってなかった。
- 長い
- python のバージョンで変わる
- コマンドを https に変えても https サーバにはならない
- content-type を変えたい
特に HTTPS サーバは、 ServiceWorker 周りをいじる時に確認とかで便利なんだけど、証明書を作ったりが面倒。
ということで作り始めたコマンドが落ち着いて来たので載せておく。
http/https コマンド
http か https と叩くだけでカレントにサーバが上がる。
デフォルトポートは 3000 で第一引数で指定もできる。
https は証明書の準備もいらない。
$ http
$ https 8443
https の証明書はコマンドがその都度、自己証明書を内部で生成するので、openssl コマンドとか使わないで済むので楽。(ただし、ブラウザでは毎回あのエラー画面を経由する必要がある、用意すれば一回で済むので自分は用意している)
また、例えば .log
とか .md
などのファイルがバイナリ扱いされて、ブラウザで開くとダウンロードされてしまうのを防ぐために、 content-type を設定できるようにしている。
ソース
http, https でコマンド自体を分けたかったので、ほとんど重複するが 2 つのファイルにしてる。
色々やった結果、目的達成には Webrick が一番手軽だったのでそこに落ち着いた。
http
#!/usr/bin/env ruby
require 'webrick'
# ここで自由に MIME を設定できるのが便利
mime = WEBrick::HTTPUtils::DefaultMimeTypes.merge({
"js" => "text/javascript",
"json" => "text/json",
"log" => "text/plain",
"md" => "text/plain",
"markdown" => "text/plain",
})
port = ARGV.shift || 3000
config = {
:Port => port,
:DocumentRoot => '.',
:MimeTypes => mime
}
server = WEBrick::HTTPServer.new(config)
Signal.trap('INT') { server.shutdown }
server.start
最新版はこちら。
https
証明書を自動生成してる以外ほぼ同じ。
コマンド自体を分けたいから内容はほぼ重複している。
#!/usr/bin/env ruby
require 'webrick'
require 'webrick/https'
port = ARGV.shift || 3000
# ここで自由に MIME を設定できるのが便利
mime = WEBrick::HTTPUtils::DefaultMimeTypes.merge({
"js" => "text/javascript",
"json" => "text/json",
"log" => "text/plain",
"md" => "text/plain",
"markdown" => "text/plain",
})
config = {
:Port => port,
:DocumentRoot => '.',
:MimeTypes => mime,
:SSLEnable => true,
:SSLCertName => [["CN", "devserver"]], # 証明書を自動で生成してくれる
}
server = WEBrick::HTTPServer.new(config)
Signal.trap('INT') { server.shutdown }
server.start
最新版はこちら
バックグラウンドで起動
簡単にログを抑制したり、バックグラウンドで起動しっぱなしにしたい場合のオプションを、以前はコマンドに含めていたが、最近は zsh でやっている。
どういうことかというと、 zsh はコマンドの途中にエイリアスを貼れるのでそれを使っている。
alias -g N="1>/dev/null 2>/dev/null"
alias -g B="1>/dev/null 2>/dev/null &"
これを使うと、コマンド自体にオプションを追加しないでも、汎用的なオプションみたいに定義できて、すべてコマンドで使えるので便利。
# N をつけるとログの抑制
$ http 1>/dev/null 2>/dev/null
$ http N
# B をつけるとさらにバックグラウンド化
$ http 1>/dev/null 2>/dev/null &
$ http B
停止
このコマンドに限らず、バックグラウンドプロセスは peco で探して kill するコマンドを作ってて、これでさくっと探して落とすようにしている。
alias killp="ps aux | peco | awk '{print \$2}' | xargs kill -9"
$ killp # これで http を探してエンター押すだけ
配置
こういうのも dotfiles に入れてパスを通してる。
[https://github.com/Jxck/dotfiles/blob/master/bin/http]