おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

nginx で solr のアクセスを制限する

solr(tomcat) のアクセス制限のメモです。

前提

nginx, solr(tomcat), rails アプリが全部同一のサーバに混在してる

やりたいこと

  • solr の admin ページにベーシック認証をかけたい
  • solr の検索関連のクエリは rails アプリからのみに制限したい(IP 制限をかけたい)
  • 将来的に複数サーバで運用するときに無理のない設定にしたい

admin ページのパスにベーシック認証をかけて、検索関連のクエリのパスに IPアドレス制限をかければ要件は満たせます。ただ、それを tomcat の設定で満たすのは結構難しそうな感じ。パスによってベーシック認証をかけるのは tomcat の設定でできるのですが、IP 制限についてはパス毎に切り替えるようなことができません。tomcat 本体を拡張することによって可能なようですが、それはいろいろ面倒なのでできれば避けたいところです。

結局、最終的に

  • tomcat はローカルホストからのアクセスのみ許可
  • admin ページへは nginx 経由でベーシック認証をかける

という方針でいくことにしました。

nginx で solr へのアクセスをプロキシする

まず、8000 番ポートにきたアクセスを 8080 番ポート(tomcat)へ渡すように設定します。

server {
    listen       8000;

    location / {
        proxy_pass http://localhost:8080;
    }
}

nginx を reload して、実際に 8000番にアクセスできるか確認します。

solr に IP 制限をかける

次に tomcat 側のアクセス制限を設定します。tomcatのディレクトリ/conf/server.xml に下記を追加します。

  ...
  <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127.0.0.1,0:0:0:0:0:0:0:1" />
</Host>

tomcat を再起動して、8000 番ポートから tomcat にアクセス出来ることを確認し、さらに 8080 番ポートからはアクセス出来なくなっていることを確認します。

nginx でアクセス制限する

ベーシック認証をかけるために nginx.conf を修正します。下記の設定で 8000 番にきたアクセスにベーシック認証をかけ、8080 にプロキシするようにします。

server {
    listen       8000;

    location / {
        proxy_pass http://localhost:8080;
        auth_basic "only admin";
        auth_basic_user_file "/path/to/password";
    }
}

実際に admin ページにアクセスしてベーシック認証がかかっていることを確認し、railsアプリから solr にアクセス出来ることを確認します。これでおkです。