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環境向けのみ提供しています。
よければ使ってみてください。ではまた