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環境向けのみ提供しています。

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