ワンライナーWebサーバを集めてみた

  • 384
    いいね
  • 14
    コメント

ワンライナーWebサーバを集めてみた

クライアントサイドのJavaScriptをいじっていて,不意にローカルファイルでは実行できない領域に踏み込んでしまうことがあると思います.とりあえず私が踏み込んでしまったのはWebWorkersですが,他にもWebRTCや・・・(思い出し中)・・・(見つからなかった)・・・などが該当します.

そんな時にいちいちApacheやnginxを立ち上げるのも面倒なので,ちょっと検索した結果を残しておきます.

Python(SimpleHTTPServer)編

Pythonでは(バージョン2.4以降限定らしいですが)モジュールをスクリプトとして実行する"-m"オプションが追加されました.このオプションを使って,標準ライブラリの一つであるSimpleHTTPServerをワンライナーで実行します.起動例とアクセスログを示します.標準ポート番号は8000です.

8000番ポートで待ち受けする例
$  python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...
127.0.0.1 - - [09/Jan/2014 11:21:09] "GET / HTTP/1.1" 200 -

きちんとアクセスログが残るのが良いですね.ポート番号を変更したい場合は,末尾にポート番号を指定してください.

3000番ポートで待ち受けする例
$  python -m SimpleHTTPServer 3000
Serving HTTP on 0.0.0.0 port 3000 ...

参考:コマンド1つで今すぐWebサーバを起動させるためのワンライナー(Ruby or Python)

Python3.x編

試していませんが,Python3.x系であれば以下のようにしても動作するそうです.

8000番ポートで待ち受けする例
$ python -m http.server 8000

参考:ワンライナーでWebサーバ

Ruby(WEBRick)編

Rubyにもwebrickというライブラリが標準添付されているので,これを使ってWebサーバを立てることができます.以下の例ではドキュメントルートとポート番号(8000)しか指定していませんが,その他の設定も行えます.標準ポート番号は80です.ポート番号を指定しない場合,管理者権限がないとエラーで止まるので注意してください.

8000番ポートで待ち受けする例
$ ruby -rwebrick -e 'WEBrick::HTTPServer.new(:DocumentRoot => "./", :Port => 8000).start'
[2014-01-09 13:49:12] INFO  WEBrick 1.3.1
[2014-01-09 13:49:12] INFO  ruby 1.9.3 (2013-06-27) [x86_64-darwin12.4.0]
[2014-01-09 13:49:12] INFO  WEBrick::HTTPServer#start: pid=9479 port=8000
localhost - - [09/Jan/2014:13:49:15 JST] "GET / HTTP/1.1" 200 2377
- -> /

こちらもアクセスログが残るのが良いですね.

※停止する場合はkillコマンドに-KILLオプションを使ってください.
先ほど試したら,ctrl+Cで停止できました.

昔の停止方法(今はctrl+Cで止まります)
$ ps aux | grep ruby
webrickのプロセス番号を調べて
$ kill -KILL プロセス番号

参考:コマンド1つで今すぐWebサーバを起動させるためのワンライナー(Ruby or Python)

Ruby(WEBRick)でHTTPS編

久しぶりにWEBRickを調べてみたところ,簡単にHTTPSに対応できることが分かりました.以下の例では証明書を自動生成した上で,8000番ポートで待受をします.※HTTPS専用です.HTTPでは接続できません.

8000番ポートでHTTPSで待ち受けする例
$ ruby -rwebrick -rwebrick/https -e 'WEBrick::HTTPServer.new(:DocumentRoot => "./", :Port => 8000, :SSLEnable => true, :SSLCertName => [["CN", WEBrick::Utils::getservername]] ).start'
[2016-06-01 14:10:36] INFO  WEBrick 1.3.1
[2016-06-01 14:10:36] INFO  ruby 2.1.4 (2014-10-27) [x86_64-darwin14.0]
................................................................................................................++++++
....++++++
[2016-06-01 14:10:36] INFO
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 1 (0x1)
    Signature Algorithm: sha1WithRSAEncryption
        Issuer: CN=sahara.local
        Validity
            Not Before: Jun  1 05:10:36 2016 GMT
            Not After : Jun  1 05:10:36 2017 GMT
        Subject: CN=sahara.local
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (1024 bit)
                Modulus:
                    00:b7:e4:37:9e:86:40:dd:cb:01:b2:a7:a8:53:db:
                    42:e8:81:0f:a9:23:63:d9:6c:6a:6a:13:0f:bc:66:
                    ed:ac:04:6c:93:1d:82:7b:22:6f:11:fc:cd:b7:ab:
                    a8:6b:fc:fc:60:e8:18:cc:52:95:b4:1a:aa:8c:1e:
                    01:cb:fa:14:0b:03:f0:3e:9e:d2:d4:5d:44:b2:83:
                    e4:de:49:5c:37:7d:1a:2b:97:a7:82:e9:d9:cb:c0:
                    fa:f5:5b:92:54:29:5c:e4:fe:c4:ed:a0:2f:3b:da:
                    83:09:e2:12:d8:01:84:9f:60:80:9c:5a:1b:12:70:
                    be:97:e1:3c:34:b6:fd:80:29
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            X509v3 Key Usage:
                Key Encipherment
            X509v3 Subject Key Identifier:
                00:0C:DD:F6:BD:66:22:72:82:DA:82:20:9C:54:E6:12:64:5E:90:15
            X509v3 Extended Key Usage:
                TLS Web Server Authentication
            Netscape Comment:
                Generated by Ruby/OpenSSL
            X509v3 Authority Key Identifier:
                keyid:00:0C:DD:F6:BD:66:22:72:82:DA:82:20:9C:54:E6:12:64:5E:90:15
                DirName:/CN=sahara.local
                serial:01

    Signature Algorithm: sha1WithRSAEncryption
         5b:ae:8f:06:7f:07:a2:ff:25:f1:4e:b6:04:c7:9f:fb:e0:aa:
         54:3d:b8:ab:54:a5:cf:e0:94:52:d1:e5:03:0e:8f:73:13:6f:
         34:f4:e7:88:93:9e:69:df:43:c2:33:5d:cc:48:4b:2a:84:48:
         a4:a2:7d:e8:e1:82:7e:3e:a4:23:34:c9:72:f3:5b:52:c7:41:
         6a:99:29:16:70:ee:bf:bd:d5:38:92:9b:0a:0d:9a:70:6f:a8:
         c3:18:60:df:73:45:41:29:3d:b3:6a:59:23:fe:1f:14:e0:cf:
         a1:db:09:50:06:7c:a3:81:95:c0:78:29:3c:71:ce:ac:aa:20:
         98:06
[2016-06-01 14:10:36] INFO  WEBrick::HTTPServer#start: pid=7246 port=8000
localhost - - [01/Jun/2016:14:10:55 JST] "GET / HTTP/1.1" 200 4257
- -> /

Webブラウザで接続しようとすると「この接続ではプライバシーが保護されません」(Chromeの場合)や「安全な接続ではありません」(Firefoxの場合)などの注意書きが表示されます.

Chromeの場合は「詳細設定」をクリックすると出てくる「localhostにアクセスする(安全ではありません)」をクリックすることで,ページを表示できます.

Firefoxの場合はちょっと複雑で,「エラー内容」をクリックすると出てくる「例外を追加」をクリックし,ダイアログ内の「セキュリティ例外を承認」をクリックすることで,このサイトを例外扱いできます.しかしその後,HTTPSサーバを再起動してしまうと,証明書が更新されてしまい接続を拒否されてしまいます(エラーコード: SEC_ERROR_REUSED_ISSUER_AND_SERIAL).この場合,Firefoxに登録されている証明書を削除する必要があります.詳しくは参考2をご覧ください.

上記の方法では証明書を自動的に作成していますが,既存の証明書を利用することもできます.ワンライナーと呼ぶには長くなりすぎるので割愛しますが,詳しくは参考1をごらんください.

参考1:WEBrickでSSLを有効にする
参考2:他と同じシリアル番号をもつサーバ証明書

Ruby(Sinatra)編

Rubyには,Sinatraフレームワークがあり,こちらを使ってワンライナーでWebサーバを立てることもできます.起動例とアクセスログを示します.標準ポート番号は4567です.Sinatraの書式に則れば複雑なURLも処理してくれますが,以下の例だとindex.htmlを無視して"Hello World"を返してしまいます.

4567番ポートで待ち受けする例
$ ruby -rsinatra -e 'set :public_folder, "./", get("/"){"Hello world"}'
== Sinatra/1.4.2 has taken the stage on 4567 for development with backup from Thin
>> Thin web server (v1.5.1 codename Straight Razor)
>> Maximum connections set to 1024
>> Listening on localhost:4567, CTRL+C to stop
127.0.0.1 - - [09/Jan/2014 13:56:05] "GET / HTTP/1.1" 200 11 0.0025

ポート番号を指定する場合は,以下のようにしてください.

8000番ポートで待ち受けする例
$ ruby -rsinatra -e 'set :port, 8000; set :public_folder, "./", get("/"){"Hello world"}'

参考:ワンライナーでウェブサーバを起動する方法

※この方法ではlocalhostからしか接続できないようです.外部から接続したい場合は以下のようにproduction環境であることを明示してください.

他のホストからも受け入れる例
ruby -rsinatra -e 'set :port, 8000; set :public_folder, "./"; set :environment, :producntion; get("/"){"Hello world"}'

参考:Sinatraがデフォルトでは外部から繋がらなくなってたよ

PHP編

PHP 5.4.0からWebサーバの機能が組み込まれるようになりました(tadsan様,情報提供ありがとうございました).ドキュメントによると,「デモやテストに使ってね」とのことですが,本投稿の用途にはピッタリです.以下の例では8000番ポートを利用するように起動しています.ホスト名やポート番号は省略できません.

localhostからのみ受け付ける例
$ php -S localhost:8000
PHP 5.4.17 Development Server started at Thu Jan  9 17:35:44 2014
Listening on http://localhost:8000
Document root is /hoge
Press Ctrl-C to quit.
[Thu Jan  9 17:35:48 2014] ::1:59299 [404]: / - No such file or directory

Ruby(Sinatra)編と同様,このままではlocalhost以外から接続できません.他のホストから接続したい場合はホスト名として以下のように「0.0.0.0」を指定して起動してください.

他のホストからも受け入れる例
$ php -S 0.0.0.0:8000

参考:ビルトインウェブサーバー

Ruby(unライブラリ)編

これまでノーチェックだったのですが,Rubyでも簡単にWebサーバを立てることができます(
yoshi-taka様,情報提供ありがとうございました).ドキュメントによるとUnixの基本コマンドの代替となるユーティリティであるunライブラリの一部で,実際に起動するのはWEBRickのようです.以下の例ではカレントディレクトリをドキュメントルートとし,8000版ポートを利用するように起動しています.アクセスログはベースとなっているWEBRickと同じですね.ポート番号を省略すると80番ポートで起動しようとします.先に紹介したRuby(WEBRick編)と比べて「コマンドが短い」「ctrl+Cで終了できる」ことが利点です.

8000版で待ち受けする例
$ ruby -run -e httpd . -p 8000
[2014-03-01 11:03:36] INFO  WEBrick 1.3.1
[2014-03-01 11:03:36] INFO  ruby 2.0.0 (2013-06-27) [universal.x86_64-darwin13]
[2014-03-01 11:03:36] INFO  WEBrick::HTTPServer#start: pid=825 port=8000
localhost - - [01/Mar/2014:11:03:49 JST] "GET /test.html HTTP/1.1" 200 94937
- -> /test.html

参考:library un - Ruby
参考:httpd (Object) - APIdock

Python(CGIHTTPServer)編

Python界隈ではスタティックなWebページだけでは満足できずに,CGIすらワンライナーで動かすことのできるライブラリが存在するようです(mash76様,情報提供ありがとうございました).ライブラリの名前ですが,その名もズバリCGIHTTPServerとのことです.調べてみるとSimpleHTTPServerを継承して,さらにCGIに対応したとのことです.
それでは事前準備としてCGIスクリプトを用意します.CGIスクリプトはカレントディレクトリのcgi-binに入れておいてください.以下の例ではpythonを使っていますが,他の言語でも実行可能です.

CGIの準備
$ mkdir cgi-bin
$ cd cgi-bin
$ cat > index.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
'''
文字列(hello world.)を表示する
'''
print "Content-Type: text/plain"
print
print "hello world."
^D  (←コントロール+Dを押してください)
$ chmod 755 index.py
$ cd ..
$ tree
.
└── cgi-bin
    └── index.py

それでは起動してみます.以下の例ではカレントディレクトリをドキュメントルートとして起動します.なお,ポート番号を省略すると8000番ポートを利用します.なお,ctrl+Cで修了できますが,終了時にエラーメッセージが出てくるので心の準備をしておいてください.

標準(8000番)ポートで待ち受けする例
$ python -m CGIHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...
127.0.0.1 - - [02/Dec/2015 12:53:38] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [02/Dec/2015 12:53:39] code 404, message File not found
127.0.0.1 - - [02/Dec/2015 12:53:39] "GET /favicon.ico HTTP/1.1" 404 -
127.0.0.1 - - [02/Dec/2015 12:53:47] "GET /cgi-bin/index.py HTTP/1.1" 200 -

ポート番号を指定する場合は以下のようにしてください.

9000番ポートで待ち受けする例
$python -m CGIHTTPServer 9000

Perl編

PerlでもワンライナーWebサーバがあるとの情報を頂きました(xtetuji様,情報提供ありがとうございました).個人的にPerlをほとんど使っていなかったので,インストール方法から記述したいと思います.

cpanの設定とPlackのインストール
$ cpan
(結構長いです.インストール先など,いくつか質問されるので適切に入力する.私は全て標準的な設定でよかったのでEnterを押しました.最後に起動スクリプトに環境変数を設定して良いか聞かれます.)
$ sudo cpan Task::Plack
(こちらも結構長いです.必要なモジュールなどをダウンロードします.待たされた後,標準的なインストールで良いか聞かれるので適切に答えてください.私はYを選択しました.また,最初にsudo無しで実行したらPermission Deniedと表示されたのでsudoを付けています.)

それでは5000番ポートで待ち受けするように実行してみましょう.ちょっとコマンドラインが長いですが,ドキュメントルートも容易に変更できます.

PerlによるワンライナーWebサーバの起動
$ plackup -MPlack::App::Directory -e 'Plack::App::Directory->new({root=>$ENV{PWD}})->to_app'
HTTP::Server::PSGI: Accepting connections at http://0:5000/
127.0.0.1 - - [02/Dec/2015:14:01:01 +0900] "GET / HTTP/1.1" 200 31580 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.73 Safari/537.36"
127.0.0.1 - - [02/Dec/2015:14:01:02 +0900] "GET /favicon.ico HTTP/1.1" 404 9 "http://localhost:5000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.73 Safari/537.36"

参考:Plack入門:Plackでウェブサーバを起動してhello worldするまで

node.js(http-server)編

その1. http-serverをグローバルインストール

node.jsにもワンライナーWebサーバがあるようです.ということでhttp-serverを紹介します.node.jsのインストールが済んでいるものとして説明します.まずはhttp-serverのインストールからです.

グローバルインストールの例
$ npm install -g http-server

ドキュメントルートは,publicディレクトリが有ればそちらに,publicが無ければカレントディレクトリになります.今,下記のようなディレクトリ構成であるものとします.

ディレクトリ構成の例
.
└── public
    └── index.html

上記の「.」に相当するディレクトリから,標準ポート(8080番)を利用するように起動します.

8080番ポートで待ち受けする例
$ http-server
Starting up http-server, serving ./public
Available on:
  http:127.0.0.1:8080
  http:192.168.0.1:8080 (←localhost以外でも待ち受けします)
Hit CTRL-C to stop the server
[Wed, 02 Dec 2015 04:10:35 GMT] "GET /" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.73 Safari/537.36"

ポート番号を変更するには-pオプションを利用します.

8000番ポートで待ち受けする例
$ http-server -p 8000
Starting up http-server, serving ./public
Available on:
  http:127.0.0.1:8000
  http:192/168/0.1:8000
Hit CTRL-C to stop the server

また,http-serverには起動と同時にWebブラウザを開くためのオプションが-oが有ります.以下のように実行すると,自動的にWebブラウザが開きます.(すでにWebブラウザが起動している場合,新しいタブで該当ページが開きます:chromeの場合)

ブラウザを同時に開く例
$ http-server -p 8000 -o
Starting up http-server, serving ./public
Available on:
  http:127.0.0.1:8000
  http:172.16.11.3:8000
Hit CTRL-C to stop the server
[Wed, 02 Dec 2015 05:10:59 GMT] "GET /" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.73 Safari/537.36"
[Wed, 02 Dec 2015 05:11:00 GMT] "GET /favicon.ico" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.73 Safari/537.36"
[Wed, 02 Dec 2015 05:11:00 GMT] "GET /favicon.ico" Error (404): "Not found"

参考:Node.jsのhttp-serverっていうコマンドラインのウェブサーバーが便利

その2. http-serverをローカルインストール

上の例ではhttp-serverをグローバルインストールしましたが,場合によってはローカルインストールで済ませたい場合があると思います.そのような人のために,ローカルインストールについても説明したいと思います.ローカルインストールでは,モジュールがカレントディレクトリのnode_modules以下にインストールされるので,環境を汚染しません.それではさっそくインストールしてみましょう.

http-serverをローカルインストール
$ npm install http-server
http-server@0.8.5 node_modules/http-server
├── opener@1.4.1
├── corser@2.0.0
├── colors@1.0.3
├── http-proxy@1.12.0 (eventemitter3@1.1.1, requires-port@0.0.1)
├── optimist@0.6.1 (wordwrap@0.0.3, minimist@0.0.10)
├── ecstatic@0.7.6 (url-join@0.0.1, he@0.5.0, mime@1.3.4, minimist@1.2.0)
├── union@0.4.4 (qs@2.3.3)
└── portfinder@0.4.0 (async@0.9.0, mkdirp@0.5.1)
$

続けてWebサーバの起動です.8000番ポートを利用するようにしています.

http-serverの起動
$ ./node_modules/.bin/http-server -p 8000
Starting up http-server, serving ./
Available on:
  http:127.0.0.1:8000
  http:192.168.0.1:8000
Hit CTRL-C to stop the server

コマンドが長いという人は,npm binを併用してください(kaminaly様,ありがとうございました).なお,npm binの利点として,サブディレクトリに潜っていてもきちんと実行できます.以下の例では,あえてカレントディレクトリをpublicにした上で実行しています.

npmコマンドを併用したhttp-serverの起動
$ cd public (←publicにcdしていても・・・)
$ $(npm bin)/http-server -p 8000 (←実行可能.※本来はこの行のみで実行)
Starting up http-server, serving ./
Available on:
  http:127.0.0.1:8000
  http:192.168.0.1:8000
Hit CTRL-C to stop the server

その3. package.jsonを利用してローカルインストール

起動コマンドが長いという人は,以下の様なファイルを作成して,npmを活用してみてください.ポート番号を変更したい場合は6行目の-pの後ろの数値を変更してください.

package.json
{
  "name": "web",
  "version": "1.0.0",
  "description": "シンプルなWebサーバ",
  "scripts": {
    "start": "http-server -p 8000"
  },
  "author": "suda",
  "license": "ISC",
  "dependencies": {
    "http-server": "^0.8.5"
  }
}

npmを利用してhttp-serverをインストールします.package.jsonの置いてあるディレクトリ内で以下のコマンドを叩いてください.

package.jsonに従ってモジュールをインストール
$ npm install
npm WARN package.json web@1.0.0 No repository field.
npm WARN package.json web@1.0.0 No README data
http-server@0.8.5 node_modules/http-server
├── opener@1.4.1
├── corser@2.0.0
├── colors@1.0.3
├── http-proxy@1.12.0 (eventemitter3@1.1.1, requires-port@0.0.1)
├── optimist@0.6.1 (wordwrap@0.0.3, minimist@0.0.10)
├── union@0.4.4 (qs@2.3.3)
├── portfinder@0.4.0 (async@0.9.0, mkdirp@0.5.1)
└── ecstatic@0.7.6 (url-join@0.0.1, he@0.5.0, mime@1.3.4, minimist@1.2.0)
$

続けてnpmを利用してWebサーバを起動します.package.jsonの"script"の"start"の項目が実行されます.なお,自動的に./node_modules/<パッケージ名>/binにパスが通った状態で./node_modules/.binにパスが通った状態で実行されます(kaminaly様,ありがとうございました).

$ npm start
> web@1.0.0 start /home/suda
> http-server -p 8000

Starting up http-server, serving ./public
Available on:
  http:127.0.0.1:8000
  http:192.168.0.1:8000
Hit CTRL-C to stop the server

package.jsonを作ってnpmで管理するのはいささか大げさな気がしますが,環境を破壊せずに使える上,初心者にとっては覚えることが少ないので良いという利点もあります.

node.js(serve)編

http-serverに似たモジュールとしてserveがあることを教えていただきました(kaminaly様,ありがとうございました),ということでさっそく試してみようと思います.ここではグローバルインストールのみ説明していますが,ローカルインストールやpackage.jsonによるローカルインストールも可能です.

グローバルインストールの例
$ npm install -g serve

続けて,カレントディレクトリをドキュメントルートとして,標準ポート(3000番)を利用するように起動します.

3000番ポートで待ち受けする例
$ serve
serving /home/suda on port 3000
GET / 200 13ms - 132

ポート番号を変更するには-pオプションを利用します.

8000番ポートで待ち受けする例
$ serve -p 8000
serving /home/suda on port 8000

参考:serve

ncコマンド編

ncコマンドはTCPやUDPを利用してコマンドラインからデータを送受信するツールです.このコマンドを使うことで,簡易的なWebサーバを立てることが可能です(と言いつつtukiyo3様のコメントを見て初めて知りました.ご指摘ありがとうございました).

まずは返信する文字列をワンライナー内で指定する場合の実行方法です.返信する文字列を変更したい場合は\n\nの後ろを変更してください.以下の例では"hello"を返します.

8000番ポートで待ち受けする例
$ while :; do { echo -e 'HTTP/1.1 200 OK\n\nhello'; } | nc -l 8000; done

ファイルの内容を返信したい場合は,以下のように実行してください.以下の例ではindex.htmlの内容を返信します.

返信するファイルを指定する場合
$ while :; do { echo -e 'HTTP/1.1 200 OK\n\n'; cat index.html; } | nc -l 8000; done

参考1によると,Ctrl+Cでは停止できないとのことでしたが,手元のMacOS Xのbash上で実行したところ,停止できました(何故かzsh上で実行した場合は停止できませんでした).確実に停止するようにしたい場合は同記事をご覧ください.

参考1:nc コマンドで簡易HTTPサーバ
参考2:すぐに簡易Webサーバを起動したいとき