2011年10月2日

Nginx を Solr のフロントに使ってみる

Solr のフロントに Nginx を使ってみます。 外部からも select はできるけど update はできないようにして、 admin には BASIC 認証をかけます。

クリーンな環境の方が分かりやすいので、Amazon の EC2 を使います。

EC2 のインスタンスを用意

基本的な構成でインスタンスを作成します。 SSH のための 22 番ポートと、HTTP のための 80 番ポートを開放しておきます。 細かい手順はこの辺で。

ローカルマシンから EC2 のインスタンスには SSH で接続しますが、 このときにローカルマシンにポートを転送させます。 Solr は Jetty を使って 8983 番ポートで起動し、Nginx はデフォルトの 80 番ポートで起動させ、 ローカルマシンでは、それぞれを 8080 番ポートと 8000 番ポートに対応付けます。

$ ssh -L8080:localhost:8983 -L8000:localhost:80 -l ec2-user -i {PRIVATE_KEY} {IP_ADDRESS}

もちろん {PRIVATE_KEY}{IP_ADDRESS} は環境に合わせて適当な文字列を使います。

以降の作業はこのインスタンス上で進めます。

Solr を準備

Solr の 3.4 をダウンロードして展開します。

$ wget http://ftp.riken.jp/net/apache/lucene/solr/3.4.0/apache-solr-3.4.0.tgz
$ tar -xzvf apache-solr-3.4.0.tgz

example ディレクトリに移動して、付属の Jetty を使って起動します。

$ cd apache-solr-3.4.0/example
$ java -jar start.jar &

EC2 インスタンスの 8983 番ポートはローカルマシンの 8080 番ポートにフォワードされていますから、 ブラウザーで http://localhost:8080/solr/admin にアクセスすると、管理画面が表示されます。

Nginx を準備

パッケージ管理ソフトを使って Nginx をインストールし、起動スクリプトから起動させます。 自動起動を有効にする場合にはその設定もしておきます。

$ sudo yum -y install nginx
$ sudo /etc/init.d/nginx start

(この記事を書いている時点では nginx-0.7.67 のパッケージを使いますので、 最新版を使いたい場合にはソースコードを自分でビルドします。)

EC2 インスタンスの 80 番ポートはローカルマシンの 8000 番ポートにフォワードされていますから、 ブラウザーで localhost:8000/ にアクセスすると、ウェルカムページが表示されます。

設定ファイル置き場も確認しておきます。

$ tree /etc/nginx/
/etc/nginx/
├── conf.d
│   ├── ssl.conf
│   └── virtual.conf
├── fastcgi.conf
├── fastcgi.conf.default
├── fastcgi_params
├── fastcgi_params.default
├── koi-utf
├── koi-win
├── mime.types
├── mime.types.default
├── nginx.conf
├── nginx.conf.default
└── win-utf

Nginx の設定

プロキシの設定をします。 Nginx に /search でアクセスされたら Solr の /solr/select にフォワードします。 /etc/nginx/nginx.conf に次の記述を追加します。

location /search {
    proxy_pass   http://127.0.0.1:8983/solr/select;
}

Nginx を再起動します。

$ sudo /etc/init.d/nginx restart

ブラウザーで http://localhost:8000/search?q=*:* にアクセスすると 空の結果を意味する XML が返されます。

次に管理画面に BASIC 認証をかけます。 wiki の設定をほぼそのまま適用します。

/etc/nginx/nginx.conf に設定を追加します。

location /admin {
    proxy_pass            http://127.0.0.1:8983/solr/admin;
    auth_basic            "Restricted";
    auth_basic_user_file  htpasswd;
}

パスワードファイルを作成します。 パスは、 nginx.conf ディレクトリからの相対パスで決定します。 nginx のプリフィクスディレクトリからではありませんので、インストール方法によっては注意が必要です。

$ sudo htpasswd -c /etc/nginx/htpasswd admin

htpasswd コマンドが存在しない場合には crypt(3) 関数を使って手動でパスワードファイルを作成します。 何らかのツールを使った方が良いでしょうね。

Nginx を再起動します。

$ sudo /etc/init.d/nginx restart

ブラウザーで http://localhost:8000/admin にアクセスすると、 BASIC 認証のダイアログが表示されます。 なお、パスを大きく変更していますので管理画面からは検索を実行できません。

Solr のテストデータ

Solr の配布パッケージに付属するサンプルデータを登録します。 Solr の example ディレクトリに exampledocs があり、ここにテストデータが保存されています。 post.sh に引数で与えた XML ファイルを登録できます。

$ cd apache-solr-3.4.0/example/exampledocs
$ ./post.sh *.xml

続けて、件数カウントのリクエストを投げます。

$ wget -qO - "http://localhost:8983/solr/select?q=*:*&rows=0&indent=on"
<?xml version="1.0" encoding="UTF-8"?>
<response>
<lst name="responseHeader">
  <int name="status">0</int>
  <int name="QTime">0</int>
  <lst name="params">
    <str name="indent">on</str>
    <str name="q">*:*</str>
    <str name="rows">0</str>
  </lst>
</lst>
<result name="response" numFound="17" start="0"/>
</response>

ローカルマシンの 8000 番ポートで確認します。 ブラウザーで http://localhost:8000/search?q=*:* にアクセスすると XML で結果が返ってきます。

きちんと 80 番ポートが開放されていると、 そのアドレスにアクセスすれば同じ結果が得られますね。

開放しているポートからプロキシするのは検索用のハンドラだけですから、 ドキュメントインデクスの更新は閉じたネットワーク内で完結します。 間違ってドキュメントを削除することは防止できますから、 URL を公開しても問題ありません。

終わりに

Nginx を Solr のフロントに使ってみました。 「それ、Apache でいいじゃん」というのはその通りで、 単純に Nginx を使ってみたかったのでやってみた、という感じです。 実際に手を動かすととても簡単なことが実感できますので、 Nginx ってなんだか難しそう... とは杞憂に終わりました。

Nginx は Web サーバーというよりプロキシサーバーですから、 複数の Solr サーバーに対してロードバランシングもできます。 アクティブ / スタンバイ構成ではなく、複数台のサーバーを並べて使えると、 マシンが遊んでしまうこともなさそうです。

EC2 に関しては、ちょっとした動作確認にマイクロインスタンスを使うのは便利だな、と思います。 管理用のコマンドラインツールもありますし、パッケージも不便なく利用できます。 サービスとして動かし続ける場合はそれなりのお金がかかるでしょうが、 学習用にスポットとして使う分には書籍代より安いですし、そもそもダラダラと作業しないようになり、 可能なものは事前に調べるようになる気がします。 なにより、自分のマシンがミドルウェアでいっぱいにならないのは嬉しいですね。

使い終わったインスタンスは ec2-stop-instances で停止させておきましょう。 インスタンスの ID は ec2-describe-instances で確認できます。

コメントを投稿