承渊政道头像
CentOS 7单机部署Elasticsearch 7.17.29:从启动报错、CRUD验证到固定公网地址的完整过程封面图

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只负责网络入口.哪一层出问题,就回到对应步骤检查,不把应用问题和网络问题混在一起.


fMYkgkivT

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 版本:

java -version

image-20260226150539083


3.安装Elasticsearch7.17.29

3.1下载Elasticsearch

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

image-20260226152752241

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

image-20260226153420300

接着打开 config/elasticsearch.yml:

vim config/elasticsearch.yml
# 节点名称(可选)
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"] 

image-20260226154559641

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


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

先直接启动:

./bin/elasticsearch

image-20260226160546391

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

sudo useradd elasticsearch
sudo passwd elasticsearch 

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

sudo chown -R elasticsearch:elasticsearch /app/elasticsearch/
sudo chown -R elasticsearch:elasticsearch /app/elasticsearch/data
sudo chown -R elasticsearch:elasticsearch /app/elasticsearch/logs

image-20260226163238744

切换到新用户:

su - elasticsearch

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

./app/elasticsearch/bin/elasticsearch

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

image-20260226163837966

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

./bin/elasticsearch -d

接着先在本机验证 9201:

curl http://localhost:9201

image-20260227140414179

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

http://192.168.42.140/:9201

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

image-20260227143306207


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

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

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

image-20260227142651013

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

# 查看当前值
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 时应该先看具体报错指向哪个参数,再执行对应修改,否则很容易“改了一个值,另一个错误还在”.

image-20260227142715722

问题 2:Bootstrap Check 与 nofile 限制
这一处开始处理的是运行用户可以打开的文件数量.

image-20260227142846079

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

sudo vi /etc/security/limits.conf

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

elasticsearch soft nofile 65535
elasticsearch hard nofile 65535

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

session    required   pam_limits.so

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

exit  # 退出当前 elasticsearch 会话
# 重新 ssh 登录或 su - elasticsearch
su - elasticsearch

最后检查当前值:

ulimit -n
#正确输出应为:65535

image-20260227143242045


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

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

{
  "name" : "node-1",
  "cluster_name" : "my-app",
  "version" : { ... },
  "tagline" : "You Know, for Search"
}

4.1查看集群健康状态

先看集群健康接口:

curl -X GET "http://localhost:9201/_cluster/health?pretty"

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


4.2创建索引

创建一个名为 products 的索引:

curl -X PUT "http://localhost:9201/products?pretty"

索引名使用小写.

image-20260227145414449


4.3写入文档:自动生成 ID

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

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

image-20260227145538638


4.4写入文档:指定ID

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

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

image-20260227145621909


4.5查询文档

先按 ID 查询:

curl -X GET "http://localhost:9201/products/_doc/1001?pretty"

再做简单全文查询:

curl -X GET "http://localhost:9201/products/_search?q=name:iphone&pretty"

然后用 Query DSL 查询:

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

image-20260227145854110

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

192.168.42.140:9201/products/_search

image-20260227144014099


4.6更新文档

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

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

更新后:

image-20260227144132587


4.7删除文档和索引

先删除指定文档:

curl -X DELETE "http://localhost:9201/products/_doc/1001"

再删除整个 products 索引:

curl -X DELETE "http://localhost:9201/products"

image-20260227150134281

删除后再次访问:

192.168.42.140:9201/products/_search

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

image-20260227150227330

完成删除验证后,本地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

使用一键脚本安装:

sudo curl https://get.cpolar.sh | sh

image-20250725104019896

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

sudo systemctl status cpolar

22e5adfaf290a17fc3384bb296055259

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

【http://ip:9200】

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

8a6698b1bf26d64ba3645827fbfb1c29


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

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

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

image-20260227161015537

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

image-20260227161103974

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

image-20260227161247843

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

curl -X PUT "http://24479b89.r2.cpolar.top/products?pretty"

image-20260227161839359

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

image-20260227161817252


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

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

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

image-20250918151358733

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

image-20260227162119323

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

image-20260227162223775

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

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

点击更新.

image-20260227162317066

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

image-20260227162356854

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

image-20260227162426173


8.总结

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

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

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

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


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

敬请期待下一篇文章内容


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

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

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/2401_87629362/article/details/167694379

文章来源转载

评论

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--