Apache Traffic Server の設定やちょっとした制御ロジックを mruby で書けるようになるかもしれないプラグイン書いてる
mod_mruby や ngx_mruby 、 h2o_mruby 、 libvmod_mruby など、さまざまな HTTP サーバの設定などを mruby スクリプトで書ける世の中になりつつありますね。 そんな風潮の後押しもあり、近頃、題意の通り mruby で ATS(Apache Traffic Server) の設定やヘッダの加工などのロジックを mruby で記述可能にするプラグイン、 ts_mruby をちまちまと開発しています。
ts_mruby によって例えば下記のようなロジックが mruby で書けるようになります。
- リクエストヘッダを付与したり削除する
if server_name == "NGINX" Server = Nginx elsif server_name == "Apache" Server = Apache elsif server_name == "ApacheTrafficServer" Server = ATS end # rewrite request headers r = Server::Request.new conn = Server::Connection.new r.headers_in["X-ATS-Plugin"] = "ts_mruby" r.headers_in["X-Forwarded-For"] = conn.remote_ip r.headers_in.delete("Cookie")
- 特定 IP 以外からのリクエストを弾く
if server_name == "NGINX" Server = Nginx elsif server_name == "Apache" Server = Apache elsif server_name == "ApacheTrafficServer" Server = ATS end whitelist = [ "127.0.0.1" ] # deny if client IP isn't listed in whitelist conn = Server::Connection.new unless whitelist.include?(conn.remote_ip) Server::echo "Your access is not allowed ..." Server::return Server::HTTP_FORBIDDEN end
ATS でプラグインをロードする際、グローバルプラグイン(ATS 全体に作用するプラグイン)や Remap プラグイン(各リクエストをプロキシする際に作用するプラグイン)という形態を採ることになるのですが、 ts_mruby ではそのどちらもサポートしています。 全リクエストで動作させたいのか、特定 VirtualHost や パスだけに対して動作させたいのか、など要件によって使い分けることが可能です。
- グローバルプラグインとして使う場合、 plugin.config に下のように記述
# write here if you hope to apply all of requests ts_mruby.so etc/trafficserver/unified_hello.rb
- Remap プラグインとして使う場合、 remap.config に下のように記述
# write here if you hope to apply only accesses to /test map /test http://127.0.0.1/ @plugin=ts_mruby.so @pparam=etc/trafficserver/unified_hello.rb
現状サポートしている ts_mruby の mruby 向けクラス、メソッド は mod_mruby, ngx_mruby と共通の名前、機能にするよう気をつけています。 mruby を HTTP サーバ設定の DSL として使うこともできるようになるかもしれません(ただし各サーバ固有の機能の部分はどうしても出てくるわけで、その部分をどう扱うか悩みどころです)
ts_mruby は現状、細々と個人で開発をしている状態です。なにかご意見や Pull-Request などいただけると幸いです。