CentOS 7单机部署Elasticsearch 7.17.29:从启动报错、CRUD验证到固定公网地址的完整过程


🔥承渊政道: 个人主页
❄️个人专栏: 《C语言基础语法知识》 《数据结构与算法》 《C++知识内容》 《Linux系统与网络知识》 《算法刷题指南》 《测评文章活动推广》 《大模型语言路线学习》 《MySQL数据库学习》 《Python知识内容》 《cpolar知识学习》
✨逆境不吐心中苦,顺境不忘来时路!✨ 🎬 博主简介:

如果只是想在CentOS 7上把Elasticsearch进程启动起来,步骤并不算多;但一套真正方便后续开发的单机环境,至少还要回答几个问题:服务监听在哪个端口、普通用户能不能稳定启动、系统限制有没有通过、索引和文档能不能正常读写,以及离开当前局域网以后还能不能继续访问.这次我按一条完整技术链来做:在CentOS 7下载 Elasticsearch 7.17.29,把HTTP端口设为 9201,处理运行用户和系统参数,再用 curl 完成集群健康检查以及索引、文档的增删改查.每一步都有对应命令和页面结果,不把"进程启动"直接当成"部署完成".本地操作确认以后,再安装cpolar,将 Elasticsearch 的 9201 服务映射到公网,先使用随机地址验证远程访问和索引创建,最后再配置固定二级子域名,解决长期使用时地址变化的问题.这样做的好处是每一层都能单独排查:Elasticsearch 负责搜索和数据接口,CentOS负责运行环境,cpolar只负责网络入口.哪一层出问题,就回到对应步骤检查,不把应用问题和网络问题混在一起.

目录

1.Elasticsearch单机环境这次要验证什么

Elasticsearch是分布式搜索和分析引擎,但这篇不从集群扩展讲起,而是先做单机闭环.目标很明确:把一个节点跑起来,然后通过RESTful API验证索引和文档操作.

它常见的能力包括全文搜索、近实时查询、分片与副本、RESTful API、聚合分析和动态映射.单机部署虽然不等于生产集群,但非常适合熟悉配置、接口和基本数据操作.

1.1这次会用到的核心能力

1. 全文搜索(Full-Text Search)

  • 支持对文本内容进行高效、相关性排序的搜索.
  • 内置分词能力;中文场景通常还会关注对应分词插件.
  • 支持模糊搜索、短语匹配、高亮显示等.

2. 近实时(Near Real-Time)

数据写入后不会按照传统关系型数据库"立即可见"的思路理解,实际使用时要关注 Elasticsearch 自己的近实时刷新机制.

3. 分布式与高可用

  • 数据可以通过分片(shard)分布在多个节点.
  • 支持通过增加节点扩展容量与性能.
  • 副本(replica)用于提高数据可用性.

4. RESTful API

  • 主要操作可以通过 HTTP 接口完成,数据通常使用 JSON.
  • 便于和 Python、Java、Go 等不同语言的程序对接.

5. 聚合分析(Aggregations)

除了搜索,还能做统计和聚合,思路上可以类比 SQL 中的 GROUP BY、COUNT、SUM、AVG 等操作.

6. 动态映射

插入JSON文档时可以自动推断字段类型;真正长期使用时,mapping是否需要显式定义,还要结合数据结构和查询需求判断.

场景 说明
电商网站搜索 用户输入关键词,快速返回相关商品
日志分析(ELK Stack) 收集服务器/应用日志,用Kibana可视化(Logstash → Elasticsearch → Kibana)
APM(应用性能监控) 如Elastic APM,追踪请求延迟、错误率
推荐系统 基于用户行为做相似内容推荐
安全分析(SIEM) 检测异常登录、网络攻击等

2.前提条件:先确认系统、Java 和实际安装版本

这套实操记录中的环境条件是:

  • 操作系统:CentOS 7
  • Java 环境
  • root 或 sudo 权限

这里先提醒一个版本点:前置说明里提到了"Elasticsearch 8.x 默认启用安全功能",同时又写了"JDK 版本 8 或更高";但后面真正下载并运行的安装包是 Elasticsearch 7.17.29.这两处版本不是同一个系列,实际部署时不要把8.x的默认安全行为、Java 要求和 7.17.29 的实操混为一套配置.

下面先按记录查看当前 Java 版本:

shell 复制代码
java -version

3.安装Elasticsearch7.17.29

3.1下载Elasticsearch

安装包下载到 /app 目录.这里使用的是 7.17.29 的 Linux x86_64 压缩包,同时下载 SHA512 文件做校验,然后解压并把目录改名为 elasticsearch:

shell 复制代码
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.29-linux-x86_64.tar.gz
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.29-linux-x86_64.tar.gz.sha512
sha512sum -c elasticsearch-7.17.29-linux-x86_64.tar.gz.sha512
tar -xzf elasticsearch-7.17.29-linux-x86_64.tar.gz
mv elasticsearch-7.17.29 elasticsearch
cd elasticsearch

接着打开 config/elasticsearch.yml:

shell 复制代码
vim config/elasticsearch.yml
shell 复制代码
# 节点名称(可选)
node.name: node-1

# 绑定所有 IP(允许远程访问,测试用;生产请限制 IP)
network.host: 0.0.0.0

# 修改 HTTP 端口(9200端口冲突)
http.port: 9201

 # 集群的名字,默认为 elasticsearch。可以根据需要修改。
cluster.name: my-app

# 在首次启动时指定初始主节点,用于集群发现。
cluster.initial_master_nodes: ["node-1"] 

这组配置里最需要记住的是 network.host: 0.0.0.0 和 http.port: 9201.前者意味着服务监听范围被放开,后者则把 HTTP 端口从默认使用习惯切到了 9201.这也是后面本地访问、浏览器验证和公网映射一直使用 9201 的原因.


3.2第一次启动:root用户直接被拦住

先直接启动:

shell 复制代码
./bin/elasticsearch

这一步出现的错误说明 Elasticsearch 不能按当前方式使用 root 用户运行.于是创建专门的 elasticsearch 用户,并设置密码:

shell 复制代码
sudo useradd elasticsearch
sudo passwd elasticsearch 

随后把 Elasticsearch 相关目录的所有权交给这个用户:

shell 复制代码
sudo chown -R elasticsearch:elasticsearch /app/elasticsearch/
sudo chown -R elasticsearch:elasticsearch /app/elasticsearch/data
sudo chown -R elasticsearch:elasticsearch /app/elasticsearch/logs

切换到新用户:

shell 复制代码
su - elasticsearch

然后执行记录中的启动命令:

shell 复制代码
./app/elasticsearch/bin/elasticsearch

这里有一个值得提前标出来的路径疑点:前面安装目录一直写的是 /app/elasticsearch,这里却写成了 ./app/elasticsearch/bin/elasticsearch.两者一个是绝对路径,一个是相对当前目录的 ./app.如果切换用户后提示文件不存在,应该先检查当前工作目录和真实安装位置,避免把"路径不对"误判成 Elasticsearch 启动失败.上面的命令按实操记录保留.

服务确认可以启动后,可以使用 -d 参数转到后台:

shell 复制代码
./bin/elasticsearch -d

接着先在本机验证 9201:

shell 复制代码
curl http://localhost:9201

记录中还使用了下面这个浏览器地址:

http://192.168.42.140/:9201

但它和后文使用的 http://192.168.42.140:9201/... 格式并不一致.如果浏览器打不开,先核对 URL 中IP和端口的组合,不要直接去改Elasticsearch配置.


3.3启动检查:把系统参数逐项处理

问题1:记录中标为"文件描述符限制太低"

截图里记录的当前值是 4096,并写明要求至少 65535:

紧接着执行的却是下面这组 vm.max_map_count 命令:

shell 复制代码
# 查看当前值
cat /proc/sys/vm/max_map_count

# 临时生效(重启失效)
sudo sysctl -w vm.max_map_count=262144

# 永久生效
echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

这里要特别区分:从命令本身可以看到,这一步修改的是 vm.max_map_count,而不是 nofile 文件描述符数量.也就是说,小节标题、截图描述和实际调整对象之间存在混淆.遇到 Bootstrap Check 时应该先看具体报错指向哪个参数,再执行对应修改,否则很容易"改了一个值,另一个错误还在".

问题 2:Bootstrap Check 与 nofile 限制

这一处开始处理的是运行用户可以打开的文件数量.

先检查 /etc/security/limits.conf:

shell 复制代码
sudo vi /etc/security/limits.conf

确保 elasticsearch 用户包含下面两行:

shell 复制代码
elasticsearch soft nofile 65535
elasticsearch hard nofile 65535

然后检查 /etc/pam.d/su 是否启用了 limits:

shell 复制代码
session    required   pam_limits.so

配置改完以后,需要完全退出当前 elasticsearch 会话,再重新登录,让限制重新加载:

shell 复制代码
exit  # 退出当前 elasticsearch 会话
# 重新 ssh 登录或 su - elasticsearch
su - elasticsearch

最后检查当前值:

shell 复制代码
ulimit -n
#正确输出应为:65535

4.用API把Elasticsearch的基本操作跑一遍

先用本地接口确认 Elasticsearch 已经可以响应.返回信息中应该能看到节点名、集群名、版本信息和tagline.下面的 JSON 是文中的示例结果:

shell 复制代码
{
  "name" : "node-1",
  "cluster_name" : "my-app",
  "version" : { ... },
  "tagline" : "You Know, for Search"
}

4.1查看集群健康状态

先看集群健康接口:

shell 复制代码
curl -X GET "http://localhost:9201/_cluster/health?pretty"

返回status: green表示一切正常.


4.2创建索引

创建一个名为 products 的索引:

shell 复制代码
curl -X PUT "http://localhost:9201/products?pretty"

索引名使用小写.


4.3写入文档:自动生成 ID

先写入一条 iPhone 15 数据,让 Elasticsearch 自动生成文档 ID:

shell 复制代码
curl -X POST "http://localhost:9201/products/_doc" \
-H "Content-Type: application/json" \
-d '{
  "name": "iPhone 15",
  "price": 7999,
  "category": "phone"
}'

4.4写入文档:指定ID

再写入一条 MacBook Pro,并把 ID 指定为 1001:

shell 复制代码
curl -X PUT "http://localhost:9201/products/_doc/1001" \
-H "Content-Type: application/json" \
-d '{
  "name": "MacBook Pro",
  "price": 15999,
  "category": "laptop"
}'

4.5查询文档

先按 ID 查询:

shell 复制代码
curl -X GET "http://localhost:9201/products/_doc/1001?pretty"

再做简单全文查询:

shell 复制代码
curl -X GET "http://localhost:9201/products/_search?q=name:iphone&pretty"

然后用 Query DSL 查询:

shell 复制代码
curl -X POST "http://localhost:9201/products/_search" \
-H "Content-Type: application/json" \
-d '{
  "query": {
    "match": {
      "name": "iPhone"
    }
  }
}'

浏览器中也记录了这个查询地址:

192.168.42.140:9201/products/_search


4.6更新文档

把 ID 为 1001 的文档价格改为 14999:

shell 复制代码
curl -X POST "http://localhost:9201/products/_doc/1001/_update" \
-H "Content-Type: application/json" \
-d '{
  "doc": {
    "price": 14999
  }
}'

更新后:


4.7删除文档和索引

先删除指定文档:

shell 复制代码
curl -X DELETE "http://localhost:9201/products/_doc/1001"

再删除整个 products 索引:

shell 复制代码
curl -X DELETE "http://localhost:9201/products"

删除后再次访问:

192.168.42.140:9201/products/_search

记录中的页面已经无法再返回之前的索引内容,用来确认删除操作后的状态.

完成删除验证后,本地Elasticsearch的基本操作链已经走完.接下来处理的是另一个层面的问题:如何从局域网之外访问这个 9201 服务.

这里我把应用和网络入口分开看.Elasticsearch 继续监听本地端口,cpolar负责把这个端口映射出去;这样后面公网访问失败时,也能先用 localhost:9201 判断应用本身是否正常.


5.安装cpolar,把本地9201映射到公网

5.1cpolar在这里负责什么

这里不把 cpolar 和 Elasticsearch 的业务能力混在一起.Elasticsearch 继续负责索引、文档和查询,cpolar 只把本地正在监听的端口变成一个可以从外部网络访问的入口.

这样做适合开发联调、临时演示和远程测试,但"公网能打开"不等于"服务已经安全".尤其前面的配置使用了 network.host: 0.0.0.0,而整篇没有展示 Elasticsearch 自身的账号认证、TLS 或额外访问控制配置,因此不要直接把测试方式照搬到有真实数据的生产环境.


5.2安装cpolar

使用一键脚本安装:

shell 复制代码
sudo curl https://get.cpolar.sh | sh

安装完成后检查服务状态:

shell 复制代码
sudo systemctl status cpolar

服务起来以后,在浏览器通过虚拟机主机 IP 加 9200 端口进入 cpolar 管理界面.记录中的入口写法为:

【http://ip:9200】

登录cpolar账户以后,就可以继续配置隧道.


6.先用随机公网地址验证远程访问

在 cpolar Web UI 中进入"隧道管理 → 创建隧道",参数按这次实操填写:

  • 隧道名称:可自定义,本例使用 ela
  • 协议:http
  • 本地地址:9201
  • 域名类型:随机域名
  • 地区:China Top

创建完成后,打开在线隧道列表,可以看到生成的公网地址.

随后从异地设备访问这个地址,页面已经可以打开.这里验证的是 公网入口已经连到本地 9201 服务,不是 Elasticsearch 的全部功能或安全性已经验证完成.

为了不只停留在"页面能打开",接着从远端使用公网地址创建索引:

shell 复制代码
curl -X PUT "http://24479b89.r2.cpolar.top/products?pretty"

创建操作返回后,再刷新页面检查结果.


7.随机地址跑通后,再换成固定二级子域名

如果只是一次测试,随机地址已经能够完成验证;如果需要长期使用,记录中继续配置了固定二级子域名.

使用cpolar为其配置二级子域名(cpolar官网-安全的内网穿透工具 | 无需公网ip | 远程访问 | 搭建网站),该地址用于保持访问入口稳定.

在 cpolar 控制台进入"预留",选择保留二级子域名,地区为 China Top,示例名称使用 elasticsearch.

然后回到cpolar Web UI的隧道列表,找到对应隧道并点击"编辑".

把刚才预留的二级子域名写入隧道配置:

  • 域名类型:选择二级子域名
  • Sub Domain:填写保留成功的二级子域名
  • 地区: China Top

点击更新.

更新后回到在线隧道列表,可以看到原来的随机公网地址已经切换成保留的二级子域名.

最后在其他设备浏览器中访问这个固定地址,页面能够正常打开.这里得到的是一个不会随随机隧道变化的访问入口;地址稳定只代表地址稳定,不代表 Elasticsearch 因此自动获得了安全认证.


8.总结

这篇完成的是一套可复现的单机闭环:CentOS 7 上下载 Elasticsearch 7.17.29,设置节点名、监听地址、9201 端口和集群名,改用普通用户启动,并处理系统限制;服务起来以后,再用 curl 验证健康状态以及索引、文档的增删改查.

随后,cpolar只承担网络入口这一层:先创建指向 9201 的 HTTP 隧道,拿随机公网地址做异地访问和远端建索引验证,再把隧道切换到保留的二级子域名.这样解决的是"地址怎么从外面访问"和"长期地址怎么保持不变",不是 Elasticsearch 本身的认证或数据权限.

这次公网测试证明的是远端可以访问接口并完成示例中的索引创建,但固定地址并不等于安全上线.文章没有展示Elasticsearch账号认证、TLS 或额外访问控制,因此如果服务里已经有真实数据,不能直接把这套测试配置原样暴露到公网.

把这几个边界分清以后,这套环境就比较容易继续扩展:本地先验证 Elasticsearch 业务,再决定是否接入可视化、业务程序或更多节点;确实需要异地访问时,再单独处理公网入口和安全策略.

🚀真正的勇者不是流泪的人,而是含泪奔跑的人!


敬请期待下一篇文章内容


每日心灵鸡汤: 真正的清醒是停止内耗,把时间和精力还给自己!

如何避免精神内耗?分清哪些事能改变,哪些只能坦然接纳,停止反复回想过往失误,不再自我责备;不去凭空揣测别人想法,减少多余猜想,把注意力聚焦当下,做好眼前每件小事.遇到烦恼及时止损,别任由思绪无限拉扯;接纳自己的局限,不苛求事事做到完美,累了就适时休息,不要一直强迫硬撑.行动化解焦虑,用做事代替胡思乱想,守住内心的平静,轻装走好求学之路.

相关推荐
雪落漂泊1 小时前
Linux基础开发工具(一)软件包管理器与Vim编辑器篇
linux·运维·服务器
崽崽..1 小时前
【Linux】网络编程的调试工具以及连接失败的具体排查方法
linux·网络
进击的荆棘1 小时前
Linux系统——库的原理与制作之ELF文件的形成与加载的过程(上)
linux·elf·动静态库
额额额对了1 小时前
Linux 内核定时器与 DHT11
linux·运维·服务器
别动我齐刘海11 小时前
C++ 工程化学习
java·linux·前端·c++·学习·机器学习·机器人
玖石书13 小时前
Ubuntu 24.04 UFW 全命令攻略:从入门到端口开放实战
linux·运维·ubuntu
xiaoqiMikko13 小时前
Linux 实战(七):useradd、sudoers、umask、SGID、软链 —— 三台真机实测
linux·centos
拂拉氏15 小时前
【知识讲解】 Linux之动静态库的了解
linux·运维·服务器·动静态库
Fcy64815 小时前
Linux下 五种IO模型的认识与⾮阻塞IO的实现
linux·服务器·io