ngx_mrubyを使ってみよう

以前、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。

hpnginx

hhvmもインストールしていたものをincludeさせるようにしたらそのまま動いてくれました。
もともとの設定ファイルも使えてオブジェクト志向〜って感じがして気持ちいいですね。

hhvmview

ローカルの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

Similar Posts:


Leave a Reply

Your email address will not be published. Required fields are marked *