安装 Nginx

# 下载Nginx
wget http://nginx.org/download/nginx-1.17.10.tar.gz
# 解压Nginx
tar zxvf nginx-1.17.10.tar.gz
cd nginx-1.17.10
# 安装
./configure --prefix=/data/home/nginx --without-http_rewrite_module
make
make install
cd /data/home/nginx

用 htpasswd 命令生成密码文件

htpasswd -cm /data/home/nginx/espasswd username

修改 Nginx 配置

# 进程数
worker_processes  4;
# 连接数
events {
    worker_connections  1024;
}
http {
    keepalive_timeout  65;

    # 将9200端口转发到9201
    upstream elasticsearch_servers {
        zone elasticsearch_servers 64K;
        server localhost:9201;
    }

    server {
        listen       9200;
        server_name  _;

    # 加上密码认证
    location / {
            auth_basic "auth_basic";
            auth_basic_user_file /data/home/nginx/espasswd;
            proxy_pass http://elasticsearch_servers;

        }

    error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

重启 Nginx

sbin/nginx -s stop
sbin/nginx

修改 Elasticsearch 配置

打开配置文件

cd /path/to/elasticsearch
vi config/elasticsearch.yml

Elasticsearch 有两种类型的网络连接——HTTPTransport,这两种可以单独设置,也可以用network同时设置。每种连接下有两种 host——bind_hostpublish_host,这两种可以单独设置,也可以用host同时设置。

在本文的情况中,希望 elasticsearch 的 http 连接只通过 Nginx 访问,但是集群中各个节点的之间的 transport 无需通过 Nginx,所以设置 network.host 为 local 的同时,设置 transport.host 为机器的 ip 地址。由于 Nginx 和 Elasticsearch 装在同一台机器上,设置 http.publish_host 为 ip 地址,http.publish_port 为 9200。

# 只允许本地连接
network.host: _local_
http.publish_host: "ip_address"
transport.host: "ip_address"
# 修改端口为9201
http.port: 9201
http.publish_port: 9200

重启 Elasticsearch

kill -9 PID
bin/elasticsearch -d

连接 Elasticsearch

修改 Kibana 配置,加上这两行

elasticsearch.username: "username"
elasticsearch.password: "password"

通过 curl 访问 Elasticsearch

curl http://username:password@host:9200/_cat/nodes

通过 Python 访问 Elasticsearch

from elasticsearch import Elasticsearch
es = Elasticsearch(['http://username:password@host:9200'])

通过 Hive 访问 Elasticsearch

ADD JAR hdfs:///path/to/elasticsearch-hadoop.jar;
CREATE EXTERNAL TABLE table_to_elk (
  s1 string
)
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
TBLPROPERTIES('es.resource' = 'table/_doc',
  'es.nodes' = 'host',
  'es.port'='9200',
  'es.net.http.auth.user' = 'username',
  'es.net.http.auth.pass' = 'password'
);

References