Siburlog

SiblogだとSI BlogっぽいのでSiburlogとする

Elasticsearch+Kibanaのインストールで嵌ったこと

経緯

このチュートリアル記事に従ってEFKをインストールして遊ぼうとしている(まだインストール途中)。

このチュートリアルではE->K->Fの順にインストールしているのだが、今のところKまではインストール出来てDashboardが見れるようになったところである。そこまでの作業で(環境依存だけど)嵌りどころがあったので紹介する。

環境

  • 元記事: Ubuntu 14.04
  • 自分: CentOS7 on GCE

嵌ったこと

Dashboardが表示出来ない。具体的には以下のようなエラーになる。Elasticsearchへのアクセスに失敗してるっぽい。

f:id:siburu:20141007003412p:plain

Kibana3とElasticsearchの連携の仕組み

Kibana2はサーバサイドでElasticsearchと連携し、Viewを作成していたらしい。しかしKibana3では、HTML+JavaScriptからなる、完全にクライアントサイドの仕組みに変わったらしい(下記参照)

つまりKibana3を使う場合は、下図のような構成になり、別途Elasticsearchのポートをインターネットからreachableな状態にする必要がある。デフォルトではElasticsearchは9200番ポートを使用する。

f:id:siburu:20141007012128p:plain

しかしWebアプリのために80番以外のポートは開けたくないというのも普通の要求である。そこでチュートリアルでは、nginxを使って下図のように80番ポートをmultiplexingしている。

f:id:siburu:20141007012237p:plain

ところが、後者の構成では前述のようなエラーになってしまうのである。ちなみに、前者の構成にして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が表示出来るようになった。

f:id:siburu:20141007003424p:plain

まとめ

  • GCEのCentOS7のデフォルト設定では、nginxから他サービスへのフォワードが禁じられている。
  • SELinuxの設定httpd_can_network_connectをonにすれば解決出来る。