
🔥承渊政道: 个人主页
❄️个人专栏: 《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单机环境这次要验证什么
- [2.前提条件:先确认系统、Java 和实际安装版本](#2.前提条件:先确认系统、Java 和实际安装版本)
- 3.安装Elasticsearch7.17.29
- 4.用API把Elasticsearch的基本操作跑一遍
-
- 4.1查看集群健康状态
- 4.2创建索引
- [4.3写入文档:自动生成 ID](#4.3写入文档:自动生成 ID)
- 4.4写入文档:指定ID
- 4.5查询文档
- 4.6更新文档
- 4.7删除文档和索引
- 5.安装cpolar,把本地9201映射到公网
- 6.先用随机公网地址验证远程访问
- 7.随机地址跑通后,再换成固定二级子域名
- 8.总结
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 管理界面.记录中的入口写法为:
登录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 业务,再决定是否接入可视化、业务程序或更多节点;确实需要异地访问时,再单独处理公网入口和安全策略.

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