Elasticsearch+Kibanaのインストールで嵌ったこと
経緯
このチュートリアル記事に従ってEFKをインストールして遊ぼうとしている(まだインストール途中)。
このチュートリアルではE->K->Fの順にインストールしているのだが、今のところKまではインストール出来てDashboardが見れるようになったところである。そこまでの作業で(環境依存だけど)嵌りどころがあったので紹介する。
環境
- 元記事: Ubuntu 14.04
- 自分: CentOS7 on GCE
嵌ったこと
Dashboardが表示出来ない。具体的には以下のようなエラーになる。Elasticsearchへのアクセスに失敗してるっぽい。
Kibana3とElasticsearchの連携の仕組み
Kibana2はサーバサイドでElasticsearchと連携し、Viewを作成していたらしい。しかしKibana3では、HTML+JavaScriptからなる、完全にクライアントサイドの仕組みに変わったらしい(下記参照)
つまりKibana3を使う場合は、下図のような構成になり、別途Elasticsearchのポートをインターネットからreachableな状態にする必要がある。デフォルトではElasticsearchは9200番ポートを使用する。
しかしWebアプリのために80番以外のポートは開けたくないというのも普通の要求である。そこでチュートリアルでは、nginxを使って下図のように80番ポートをmultiplexingしている。
ところが、後者の構成では前述のようなエラーになってしまうのである。ちなみに、前者の構成にして9200番ポートを開けてElasticsearchへ直アクセスさせると、普通にDashboardが表示出来た。つまり、失敗しているのはnginxとElasticsearchの間の処理だということが、この時点で推測できた。
ログ調査
ESのログ
まずはESのログ/var/log/elasticsearch/elasticsearch.logを見てみた。 すると、どうもアクセス自体が届いてないようだ。ログに形跡がない。
nginxのログ
経路的にはESの前はnginxになる。なので次はnginxのエラーログ/var/log/nginx/error.logを見てみた。すると、下記のようなエントリを見付けた。
2014/10/06 02:24:27 [crit] 1571#0: *151 connect() to 127.0.0.1:9200 failed (13: Permission denied) while connecting to upstream, client: ***.***.***.***, server: kibana, request: "GET /_nodes HTTP/1.1", upstream: "http://127.0.0.1:9200/_nodes", host: "***.***.***.***", referrer: "http://***.***.***.***/"
エラー13はEACCES。どうもSELinuxの臭いがする。
SELinuxのログ
この辺は勘だけど、どうもSELinuxが怪しいなと思ったので、SELinuxのログ/var/log/audit/audit.logを覗いてみた。すると以下のエラーエントリを見付けた。
type=AVC msg=audit(1412562267.022:40595): avc: denied { name_connect } for pid=1571 comm="nginx" dest=9200 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:unreserved_port_t:s0 tclass=tcp_socket
やはりSELinuxによってconnect(2)が失敗しているようだ。
解決策
まず下記のコマンドでSELinuxの設定状況を一覧出来る。
% getsebool -a
この設定の中をhttpで検索したところ、httpd_can_netword_connectという設定がoffになっていることが分かった。httpdを踏み台に他所に迷惑を掛けないための設定だと推察される。audit.logのエラーにはhttpd_tがどうのと書いてあったから、これが原因かなと思い、onにしてみた。
# setsebool httpd_can_network_connect on
すると以下のようにDashboardが表示出来るようになった。