クラウド時代にも活かせる? RewriteMapやSSIをつかってみよう!

こんにちは。GMO NIKKO エンジニアのALPHです。

今回、偶然にもブログを書く機会を頂きましたが
正直なにを書けばいいのか悩みました。

毎日システムを運用させて頂いていますが
これはと思う、新しいネタになるようなものが
なかなかありませんので
なにか記事になるものはないかと探しました。

今、時代も時代で
様々な技術シフトが起きています。
状況が状況なので
事業継続が叫ばれていますが
これはまさに誰もが心に突き刺さります。

そんな状況の中
・枯れた技術
・運用コストが低いもの
・理解しやすいもの/使えるもの
・メンテナンスされているもの
をポイントとして
新技術と併用して、組み合わせたりするものがあれば
なにかの足しになるのではないかと思いました。

今回自分が知っている範囲で
なにかあるか一生懸命思い出したのですが

年配エンジニアの方なら単語は
うっすら結構しっている
ApacheModRewriteRewriteMapServerSideInclude
という古いサーバサイド技術を紹介させて頂きたいと思います。
※Apacheも、もうすっかり、Nginxの登場で小さくなってしまいました。

こう書くと
おい、古すぎっ、いっぱい既に記事あるじゃないか
という突っ込みがありそうです。

このクラウド全盛の時代においては
そして、若手のエンジニアの人にとっては
あまり関心がないエリアかとは思います。

でも、心の中では
「ちょっと使い方がイメージつきにくい点だな」
「自分のエンジニア人生においてあんまり触らないかなぁ」
とか気になっていたりして。
そして攻略するには、ちょっと微妙に手をなんとなく出しずらいエリアかと。

そこで、細かいことは他のブログやサイトに任せるとして
今回は組み合わせて色々使えるように、という視点で
「ModRewrite,RewriteMapとSSI」を使ってみます。

今回紹介する例の目的としては
シンプルに
「あるキーのパラメータがURLについていたときに
そのキーデータを検索して、そのバリューを取得し、指定されたフォーマットで返す」
という機能を上記のモジュールの機能組合せで実現します。

Apache以外になにをインストールすればよいのか
と思われるかもしれませんが、今回の例ではなにもいりません。

RewriteMapをKVS(KeyValueStore)として
SSIをVIEWエンジンとして
これらを組み合わせて使ってみようと思います。

Apacheのインストールは
それぞれ行って頂いた前提で以下進めていきます。

まず、下のように、Apacheのhttpd.conf の追加設定を行います。
※rewriteMap 設定は.htaccess等では記載できないので注意してください。

キーの値を取り出す処理としては下記2点です。
・URLパラメータでつけられたKEY_IDを変数セット(X_KEY_ID)
・RewriteMap で設定されたDB(map.db)から値をとり変数セット(X_STATUS)

次に、KeyValue用のDBの準備をします。
map.db の元のデータmap.txtの構造は下のようになっています。
※スペース区切りで左がKEY_IDで、右がステータスです。

このデータをコンパイルしてmap.dbを作成します。

リロードする前に
http.conf 上で、mod_rewrite/mod_ssi/mod_headers は
ロード設定されていることを事前に確認しておきます。

最後に、SSIを使った出力部分の設定をします。
今回はアウトプットは、map.jsonとmap.jsの二つサンプルパターンを用意しました。
これらをkvstore配下に設置します。

1.  map.json

jsonの場合の、サーバのSSIテンプレは↓

2.  map.js

jsの場合の、サーバのSSIテンプレは↓

最後に、Apacheをリロードしてあげます。
以上で、設定が完了です。

さっそくアクセステストをしてみましょう。
1.  map.json
/kvstore/map.json?key_id=orangeでURLを叩くと
下のようにきちんとステータスが返ってきます。

2.  map.js
ためしに/kvstore/map.js?key_id=orangeでURLを叩くと
下のようにきちんとステータスが返ってきます。

なんとなくイメージはつかめたでしょうか。

データ部はバイト数制限がありますので
簡単なURLやフラグ程度しか扱えないとは思いますが、
たしか、初期にリダイレクト用に作られたと推測され
古いURL長ならデータ登録できた記憶がします。

利用ケースとしては
やはり 「お手軽KVS」 でしょうか。
この商品のデータのフラグや価格、商品属性が知りたいとか
そんなときに利用します。
バリューデータは一つしか設定できませんが
区切り文字を決めておいて
それを出力時に分割するとかも検討できるかもしれません。
また、更新するとApacheが自動的に読み込んでくれるみたいです。

意外なポイントとして
ちょこちょこ、アクセスがあっても結構「寝れ」ます。
いつ、吹き飛ぶか気にされている方も多いかと思いますが
固定データなので、「生成に失敗」しなければ
データとしては動かないので、そこそこ安心できるかもしれません。

データ格納バイト数やDB自体の重さから
とにかく、英数字フラグ管理のスモールデータ向きかとは思います。
データ量が膨れるのでバイト計算注意してください。
昔のアプリを触っている感覚が。。

「ちょっと商品量が多いかな」という場合は
REWRITEMAPは組み合わせて使えるので
各カテゴリごとにファイルを分けて
対応してみるのもありかもしれません。
どこまでいけるか、チャレンジみたいな。

他にもなにかと組み合わせると、結構力発揮するかもしれません。

パフォーマンス的には、結構快適にいけます。
また、SSIでもそこそこ高速でレスポンスが返ってきます。
CPUも思ったより同時アクセスさばいても、そんなに高くならない気がしました。
これは試してみた人は、昔を懐かしく思い出す感じがします。
昔懐かしの「駄菓子屋のお菓子」のテイストです。

どうでもいいですが、「うまい棒」いまでも食べます。。

用途としては
いろいろあるとは思いますが
ちょっとした簡易APIや
ネットワーク・サーバのパフォーマンス試験用とか
それぐらいの感覚でいいのであれば、いろいろなにかに使えそうです。

長くなってしまいましたが
枯れた技術も見つめなおすと意外な発見があるので
是非TRYしてみてください。

それでは、また次回まで。