安装 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 有两种类型的网络连接——HTTP与Transport,这两种可以单独设置,也可以用network同时设置。每种连接下有两种 host——bind_host和publish_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'
);