RustでPHPビルトインサーバ用のリバースプロキシを書いてみました
Posted on Fri, 08 Sep 2017 19:55:30 +0900
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環境向けのみ提供しています。
よければ使ってみてください。ではまた