一、环境规划
| 项目 | 值 |
|---|
| 运行用户 | app |
| JDK 安装路径 | /data/app/jdk17 |
| ES 安装路径 | /data/app/es-server |
| ES 数据目录 | /data/app/es-data |
| ES 日志目录 | /data/app/es-logs |
| ES 配置目录 | /data/app/es-server/config |
| 证书目录 | /data/app/es-server/config/certs |
| 服务端口 | 9200 (HTTPS) |
| 集群模式 | 单节点 |
二、完整部署命令
2.1 创建 app 用户和基础目录
# 创建 app 用户
sudo useradd app -m -s /bin/bash
# 创建安装根目录并授权
sudo mkdir -p /data/app
sudo chown app:app /data/app
2.2 安装 JDK 17
# 切换到 app 用户
sudo -i -u app
# 进入安装目录
cd /data/app
# 下载 JDK 17
wget https://mirrors.tuna.tsinghua.edu.cn/Adoptium/17/jdk/x64/linux/OpenJDK17U-jdk_x64_linux_hotspot_17.0.19_10.tar.gz
# 解压
tar xzvf OpenJDK17U-jdk_x64_linux_hotspot_17.0.19_10.tar.gz
# 重命名目录
mv jdk-17.0.19+10/ jdk17
# 清理安装包
rm -f OpenJDK17U-jdk_x64_linux_hotspot_17.0.19_10.tar.gz
# 配置环境变量
echo 'export JAVA_HOME=/data/app/jdk17' >> /home/app/.bashrc
echo 'export PATH=$PATH:$JAVA_HOME/bin' >> /home/app/.bashrc
source /home/app/.bashrc
# 验证 JDK
java -version
2.3 安装 Elasticsearch
# 仍在 app 用户下执行
cd /data/app
# 下载 ES 8.14.3
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.14.3-linux-x86_64.tar.gz
# 解压
tar xzvf elasticsearch-8.14.3-linux-x86_64.tar.gz
# 重命名
mv elasticsearch-8.14.3 es-server
# 清理安装包
rm -f elasticsearch-8.14.3-linux-x86_64.tar.gz
# 创建数据和日志目录
mkdir -p /data/app/es-data
mkdir -p /data/app/es-logs
2.4 生成 SSL 证书(开启安全认证必需)
# 仍在 app 用户下执行
cd /data/app/es-server
# 生成 CA 证书(直接回车,不设密码)
./bin/elasticsearch-certutil ca
# 生成节点证书(直接回车,不设密码)
./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
# 创建证书目录并移动证书
mkdir -p config/certs
mv elastic-certificates.p12 config/certs/
mv elastic-stack-ca.p12 config/certs/
# 设置证书权限
chmod 644 config/certs/elastic-certificates.p12
2.5 配置 Elasticsearch
# 备份原配置
cp /data/app/es-server/config/elasticsearch.yml /data/app/es-server/config/elasticsearch.yml.bak
# 写入新配置
cat > /data/app/es-server/config/elasticsearch.yml << 'EOF'
# ======================== 路径配置 ========================
path.data: /data/app/es-data
path.logs: /data/app/es-logs
# ======================== 集群配置 ========================
cluster.name: my-app-cluster
node.name: node-1
network.host: 0.0.0.0
http.port: 9200
discovery.type: single-node
# ======================== 安全认证配置 ========================
# 开启安全功能
xpack.security.enabled: true
# 传输层 SSL 配置(节点间通信)
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12
# HTTP 层 SSL 配置(开启 HTTPS)
xpack.security.http.ssl.enabled: false
xpack.security.http.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.http.ssl.truststore.path: certs/elastic-certificates.p12
EOF
2.6 配置 JVM 堆内存(可选,根据服务器内存调整)
# 设置堆内存为 1G(根据实际情况调整)
sed -i 's/^-Xms.*/-Xms1g/' /data/app/es-server/config/jvm.options
sed -i 's/^-Xmx.*/-Xmx1g/' /data/app/es-server/config/jvm.options
2.7 退出 app 用户,配置系统参数
# 退出 app 用户
exit
# 配置文件描述符限制
echo "app soft nofile 65535" | sudo tee -a /etc/security/limits.conf
echo "app hard nofile 65535" | sudo tee -a /etc/security/limits.conf
# 配置虚拟内存映射数
echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# 配置进程限制
echo "app soft nproc 4096" | sudo tee -a /etc/security/limits.conf
echo "app hard nproc 4096" | sudo tee -a /etc/security/limits.conf
2.8 创建 Systemd 服务文件
sudo cat > /etc/systemd/system/elasticsearch.service << 'EOF'
[Unit]
Description=Elasticsearch Server
Documentation=https://www.elastic.co
After=network.target
[Service]
Type=simple
User=app
Group=app
WorkingDirectory=/data/app/es-server
Environment=JAVA_HOME=/data/app/jdk17
Environment=ES_PATH_CONF=/data/app/es-server/config
ExecStart=/data/app/es-server/bin/elasticsearch
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
LimitNOFILE=65535
LimitNPROC=4096
TimeoutStopSec=20
Restart=on-failure
RestartSec=3
[Install]
WantedBy=multi-user.target
EOF
2.9 设置目录权限并启动服务
# 确保所有目录属主为 app
sudo chown -R app:app /data/app
# 重载 systemd
sudo systemctl daemon-reload
# 启动 Elasticsearch
sudo systemctl start elasticsearch
# 查看启动状态(等待 10-20 秒让服务完全启动)
sleep 15
sudo systemctl status elasticsearch
2.10 设置内置用户密码
# 使用 auto 模式,自动生成随机密码
sudo -u app /data/app/es-server/bin/elasticsearch-setup-passwords auto --insecure
执行后,系统会提示输入以下用户的密码(请务必牢记):
| 用户 | 说明 | 密码建议 |
|---|
elastic | 超级管理员 | 强密码 |
kibana | Kibana 连接用 | 强密码 |
logstash_system | Logstash 监控 | 随机密码 |
beats_system | Beats 监控 | 随机密码 |
apm_system | APM 监控 | 随机密码 |
remote_monitoring_user | 远程监控 | 随机密码 |
2.11 开启防火墙端口
# 开放 9200 端口
sudo firewall-cmd --permanent --add-port=9200/tcp
sudo firewall-cmd --reload
2.12 设置开机自启
sudo systemctl enable elasticsearch
三、验证部署
3.1 基础验证(HTTPS + 认证)
# 使用 elastic 用户和密码访问(-k 忽略自签名证书验证)
curl -u elastic:<你设置的密码> http://localhost:9200
预期输出:
{
"name" : "node-1",
"cluster_name" : "my-app-cluster",
"cluster_uuid" : "xxxxxxxxxxxxxxxxxxxxxx",
"version" : {
"number" : "8.14.3",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "d55f984299e0e88dee72ebd8255f7ff130859ad0",
"build_date" : "2024-07-07T22:04:49.882652950Z",
"build_snapshot" : false,
"lucene_version" : "9.10.0",
"minimum_wire_compatibility_version" : "7.17.0",
"minimum_index_compatibility_version" : "7.0.0"
},
"tagline" : "You Know, for Search"
}
3.2 查看集群健康状态
curl -k -u elastic:<密码> https://localhost:9200/_cluster/health?pretty
3.3 查看节点信息
curl -k -u elastic:<密码> https://localhost:9200/_cat/nodes?v
3.4 远程访问验证(从其他机器执行)
curl -k -u elastic:<密码> https://<服务器IP>:9200
四、日常管理命令
4.1 服务管理
# 启动
sudo systemctl start elasticsearch
# 停止
sudo systemctl stop elasticsearch
# 重启
sudo systemctl restart elasticsearch
# 查看状态
sudo systemctl status elasticsearch
# 查看日志
sudo journalctl -u elasticsearch -f
# 查看最近 100 行日志
sudo journalctl -u elasticsearch -n 100
4.2 密码管理
# 修改 elastic 用户密码
curl -k -u elastic:<旧密码> -X POST https://localhost:9200/_security/user/elastic/_password -H "Content-Type: application/json" -d '{"password":"<新密码>"}'
# 创建新用户
curl -k -u elastic:<密码> -X POST https://localhost:9200/_security/user/monitor -H "Content-Type: application/json" -d '{"password":"<密码>","roles":["monitoring_user"]}'
4.3 证书管理
# 查看证书信息
openssl pkcs12 -info -in /data/app/es-server/config/certs/elastic-certificates.p12 -nokeys
五、目录结构总览
/data/app/
├── jdk17/ # JDK 安装目录
│ ├── bin/
│ ├── lib/
│ └── ...
├── es-server/ # ES 安装目录
│ ├── bin/ # 可执行文件
│ ├── config/
│ │ ├── elasticsearch.yml # 主配置文件
│ │ ├── jvm.options # JVM 配置
│ │ └── certs/ # SSL 证书目录
│ │ ├── elastic-certificates.p12
│ │ └── elastic-stack-ca.p12
│ ├── lib/ # 依赖库
│ └── modules/ # 模块
├── es-data/ # 数据目录
│ └── nodes/ # 节点数据
└── es-logs/ # 日志目录
└── elasticsearch.log # 主日志文件
六、常见问题排查
| 问题 | 检查命令 | 解决方案 |
|---|
| 服务启动失败 | sudo systemctl status elasticsearch | 查看错误信息,检查配置文件语法 |
| 证书错误 | sudo journalctl -u elasticsearch -n 50 | 确认证书路径正确,权限为 644 |
| 内存不足 | free -h | 调整 jvm.options 中的 -Xms 和 -Xmx |
| 端口被占用 | `sudo netstat -tlnp | grep 9200` | 修改 http.port 或停止占用进程 |
| 认证失败 | 检查密码是否正确 | 使用 elasticsearch-setup-passwords 重置 |
| 远程无法访问 | sudo firewall-cmd --list-all | 确认防火墙开放 9200 端口 |
七、安全建议(生产环境)
- 证书替换:自签名证书仅适用于测试环境,生产环境请使用 CA 签发的正式证书
- IP 绑定:
network.host: 0.0.0.0 允许所有 IP 访问,建议改为具体内网 IP - 防火墙:仅允许可信 IP 访问 9200 端口
- 定期改密:定期更换
elastic 等内置用户密码 - 审计日志:开启审计功能
xpack.security.audit.enabled: true - 备份:定期备份
/data/app/es-data 目录和证书文件
评论 (0)