Luaは速いことで有名ですね。実はnginxにはLuaを埋め込めるのですが、これでWebサービスを作ったらかっこよさそうなので、技術デモとして作ってみました。
今回は素のnginxではなく、Luaを便利に使えるようにしたOpenRestyを使用しました。自宅サーバでやってもいいのですが、デモ後に環境を綺麗にするのが手間なので、Google Compute Engineを使いました。
configurationに直接書くのもできますが、100行弱まで長くなったので分離しました。
worker_processes 24
location / { default_type text/html; content_by_lua_file /home/mipsparc/luachat/main.lua; }
https://github.com/mipsparc/luachat/blob/master/main.lua
Luaプログラミングは初めてです。ライブラリに基本的なものしかない上に、Webプログラミングなんて前提にされていないので、自分で1から作る感覚が面白かったです。
しばらくはここでホストしておくので、試してみてください。
http://35.243.116.247/
測定結果
条件: GCE(vCPU x 8、メモリ 9.25 GB)のlocalからApacheBenchでテスト
参考: 404静的ページ 23589req/s, 2ms(95%) 下記と同じ
GET / (CookieのセッションIDが正規かRedisで確認、Redisから投稿一覧を取得して表示)
$ ab -c 32 -n 10000 -C 'sess=IQHUKNJXEfb5XzBXa72SfsOi4xfmZpJB' http://35.243.116.247/
14375req/s, 3ms(95%)
POST / (CookieのセッションIDがPOST内容と同じで正規かRedisで確認、Redisに投稿を追加してリダイレクト)
$ ab -c 32 -n 10000 -C 'sess=IQHUKNJXEfb5XzBXa72SfsOi4xfmZpJB' -p postfile http://35.243.116.247/
12747req/s, 4ms(95%)
割と高速にレスポンスを返せているかと思います。Webサービスを作るのにはプリミティブすぎてあまりおすすめはできないかもしれないですが、複雑なルーティングや認証基盤としては手軽で高速なのでありかもしれないです。
実際には一番重いのがRedisだろうとおもうので、コネクションプールなどの工夫をすれば更に高速にできそうです。