RustでPHPビルトインサーバ用のリバースプロキシを書いてみました

kamasu

名前は kamasu です。 RustをPHPのビルトインサーバの前段にカマして並列に処理したい、という目的で書きました。 HTTPSで接続を受けて、通信することも可能です。

       +--------------------+     +----------------------------------------+
       | kamasu(main proc)  | - - |                                        |-+
       |                    | +-->|           php built-in server          | |-+
 HTTP  |    +--------+ HTTP | |+->| (child proc via std::process::Command) | | |
----------->| thread |--------+|  +----------------------------------------+ | |
       |    | (http) |      |  |    +----------------------------------------+ |
       |    +--------+      |  |      +----------------------------------------+
       |                    |  |                     :
 HTTPS |    +--------+ HTTP |  |                     : N procs
----------->| thread |---------+                     :
       |    | (https)|      |
       |    +--------+      |
       +--------------------+

使い方

 $ cargo install --force --git https://github.com/hhatto/kamasu.git
 $ kamasu -S 127.0.0.1:8080

-S -t -c あたりは php コマンドと同じ引数を指定すれば、バインドアドレス、 ドキュメントルート、php.iniファイル(またはディレクトリ)を指定して起動することができます。

-s オプションにアドレスを渡すことでHTTPSのプロキシとして動作させることができます。

軽くベンチマーク

 $ php -S 127.0.0.1:8000 -t ./docroot
 $ ab -n 1000 -c 10 http://127.0.0.1:8000/
         :
 Concurrency Level:      10
 Time taken for tests:   14.320 seconds
 Complete requests:      1000
 Failed requests:        0
 Total transferred:      229000 bytes
 HTML transferred:       96000 bytes
 Requests per second:    69.83 [#/sec] (mean)
 Time per request:       143.200 [ms] (mean)
 Time per request:       14.320 [ms] (mean, across all concurrent requests)
 Transfer rate:          15.62 [Kbytes/sec] received
         :

 $ kamasu -S 127.0.0.1:8000 -t ./docroot
 $ ab -n 1000 -c 10 http://127.0.0.1:8000/
         :
 Concurrency Level:      10
 Time taken for tests:   7.825 seconds
 Complete requests:      1000
 Failed requests:        0
 Total transferred:      305000 bytes
 HTML transferred:       107000 bytes
 Requests per second:    127.79 [#/sec] (mean)
 Time per request:       78.255 [ms] (mean)
 Time per request:       7.825 [ms] (mean, across all concurrent requests)
 Transfer rate:          38.06 [Kbytes/sec] received
         :
 $

モチベーション

手元の開発環境だとPHPのビルトインサーバを使っていて、 ちょっと並列で動かしたいなという場面がでてきたので、 Tokio のサンプルにちょうどいいと思い実装してみました。

アイディア自体は以下のQiita記事を読んで、思い立った次第です。ありがたい。

その他

バイナリのリリースについては、以下を参考にさせていただきました。ありがたい。

GitHubのreleasesページ からバージョンごとのバイナリをダウンロードして使い始めることができます。 今の所x86_64なLinux/macOS環境向けのみ提供しています。

よければ使ってみてください。ではまた