以前、Apache用モジュールのmod_mrubyとmod_cgroupを試しましたが、前回の日記でも書いていたように、ブログの環境をNginx+HHVMにしようかな〜と思ってるので、ngx_mruby!を触っとこうと思います。
インストール手順はMod_mrubyと少し異なり、ngx_mrubyをmakeして、できあがったモジュールをadd-moduleして〜の、Nginxをリビルドして〜のという流れになるようです。過去に、と言っても随分と過去ですが、Nginxもソースからインストールしたりした事もあったかとは思いますが、頭からはすっかりと消去されているようで、ちょっとちんぷんかんぷんだっふんだ。
今テストしてる環境ではもちろんaptからNginxをインストールしているので、今回は付属しているbuild.shを使って、スクリプトにNginxのDLからビルドまで一緒にやってもらえる手順を利用します。
Gitから落としてきて、updateなどなど、中には色々とファイルが用意されてて、このバージョンのNginxが入ると思われる。
user@deb:/ngx_mruby$ cat nginx_version NGINX_SRC_VER='nginx-1.9.3'
気になる人はbuild.shの中身を見ながらやるといいかなと思います。
user@deb:/ngx_mruby$ NGINX_CONFIG_OPT_ENV='--prefix=/usr/local/nginx' sh build.sh user@deb:/ngx_mruby$ sudo make install
設定ファイルは、aptでインストールしたNginxのConfファイルを眺めながら、新しくインストールしたNginxのConfファイルに必要なところを付け足していく感じにしたんですが、なんとまぁそれで問題なく動いてくれました。
当然ながら?Apacheよりもコンパイルも速いし気持ちいいす。
ドキュメントルートには、もともとインストールしていたWordpressを指定。
これでOK。
hhvmもインストールしていたものをincludeさせるようにしたらそのまま動いてくれました。
もともとの設定ファイルも使えてオブジェクト志向〜って感じがして気持ちいいですね。
ローカルのNginxに、ウェブサーバーのデータを全部移して既にテストはしているとこなのですが、全文表示でなおかつ数件分の記事が出してもサクサク動いています。今のサーバーでやると確実に重たいです。
かなりのレスポンスの改善はやっぱり体感できるので、この環境をサーバーで動かすとすると、もっと速いでしょうからNginx+HHVMに変える方向へとさらに加速〜。濃厚になってきました。
では、今回の本題であるmrubyのテストといきますか。
Gitに置いてあるテストコードを動かしてみます。
user@deb:/ngx_mruby$ curl -s http://localhost/mruby Hello ngx_mruby/1.12.14 world!
う 動いた!
かなり端折っていますがwwちゃんと動きました。
あとはDos_Detectorをがむばって作ってみるとか、SSLの環境も作らなきゃってとこでしょうか。
そして、それはまた今度やると。
参考サイト
Github:matsumoto-r/ngx_mruby
https://github.com/matsumoto-r/ngx_mruby/wiki/Install
Qiita:takeswim nginxにngx_mrubyをインストールする
http://qiita.com/takeswim/items/d80dcf9865d06571cc5e
終わろうかな〜と思ったけれど、もうちょいテストしておこう。
まずはGeoIpを使ってみます!
GeoIPはこれからも色々と使い道が多そうなので要チェック。
必要なパッケージをインストールします。
user@deb:~/ngx_mruby$ sudo apt-get install libgeoip-dev geoip-database-contrib
はじめて使うので良く分かりませんがアップデートしときます。
sudo geoip-database-contrib_update
あとは手順通りにbuild_config.rbのコメントアウトを外して再ビルドします。
conf.gem :github => 'matsumoto-r/mruby-geoip'
GeoIPを試すための簡易なコードを用意しました。
user@deb:~$ cat /usr/local/nginx/hooks/geo_check.rb db_path = "/usr/share/GeoIP/GeoIPCity.dat" host = "www.vincentina.net" geoip = GeoIP.new db_path geoip.record_by_name host Nginx.echo geoip.country_code Nginx.echo geoip.time_zone
コネクトハンドラにアクセスして試してみますと、レスポンスが取れました!
下のようにちゃんとデータが取れています。
$ curl -s http://localhost/geoip JP Asia/Tokyo
続いてはコネクションの情報から動的にフィルタリングしてみます。
ここまではそこそこ順調だったものの
しばらく試してみて上手く動かないぃぃぃ\(^o^)/な状態になってから知ったのが、nginx_stub_statusモジュールが必要なようでした。
ということで再ビルドします。。。
user@deb:~/ngx_mruby$ NGINX_CONFIG_OPT_ENV='--prefix=/usr/local/nginx --with-http_stub_status_module' sh build.sh
かなりしょぼいテストですけれども、ちゃんと動的に動いていることは確認できました。
Server = get_server_class dos_limit = 1 r = Server::Request.new if r.var.connections_active.to_i > dos_limit if r.var.remote_addr == "192.168.24.56" Server.return Server:: HTTP_SERVICE_UNAVAILABLE end end
こんな風にとあるタイミングのところで503が返っているのは分かると思います。
必死でやっとアクティブコネクトがしきい値を超えたっていうか1だけど、まぁちゃんと動いてます。
192.168.24.56 - - [12/Aug/2015:10:13:39 +0900] "GET / HTTP/1.1" 200 192.168.24.56 - - [12/Aug/2015:10:13:39 +0900] "GET / HTTP/1.1" 200 192.168.24.56 - - [12/Aug/2015:10:13:41 +0900] "GET / HTTP/1.1" 200 192.168.24.56 - - [12/Aug/2015:10:13:42 +0900] "GET / HTTP/1.1" 503 192.168.24.56 - - [12/Aug/2015:10:13:42 +0900] "GET / HTTP/1.1" 503
なんということでしょう。ある程度のことはできてしまいました。
DoS対策はまだ煮詰める必要はありますが、ぼちぼち引っ越しの予定を立てますか。
参考サイト
Github:matsumoto-r/mruby-geoip
https://github.com/matsumoto-r/mruby-geoip