【问题标题】:Elasticsearch: Failed to connect to localhost port 9200 - Connection refusedElasticsearch:无法连接到 localhost 端口 9200 - 连接被拒绝
【发布时间】:2026-01-15 11:10:02
【问题描述】:

当我尝试使用 curl http://localhost:9200 工作正常。

但是当我运行curl http://IpAddress:9200 时,它会抛出一个错误提示

无法连接到 localhost 端口 9200:连接被拒绝

如何解决这个错误?

【问题讨论】:

  • 如果你已经在 elasticsearch.yml 文件中设置了 network.host: localhost 那么你可以尝试在请求中添加http协议:curl -X GET "http://localhost:9200"
  • 至少在 Windows 10 上使用 Elasticsearch 7.8.0,只需在 elasticsearch.yml 文件中取消注释 network.host 即可。
  • 一定要检查日志(我的在 Ubuntu 中位于 /var/log/elasticsearch/elasticsearch.log)。

标签: elasticsearch


【解决方案1】:

你必须编辑 /etc/elasticsearch/elasticsearch.yml 默认情况下所有配置都会被注释,添加以下配置

network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: [0.0.0.0]

然后重启服务

【讨论】:

    【解决方案2】:

    我在 CentOS 7 上遇到过这种情况,问题是 /etc/hosts 有以下内容:

    127.0.0.1 localhost.localdomain

    我更新为包括 localhost 如下:

    127.0.0.1 本地主机 localhost.localdomain

    之后,就没有问题了。

    【讨论】:

      【解决方案3】:

      我每次安装或升级 ES (7.0+) 时都会遇到这个问题。解决方案总是等待 ES 完全启动。 REST API 响应大约需要一分钟。不管服务状态如何。

      service elasticsearch start
      *started
      
      *wait for at least a minute
      
      curl now works and returns responses on the port 9200
      

      【讨论】:

        【解决方案4】:

        对于那些在 GCP(谷歌云平台)的虚拟机上安装 ELK 的人,请确保您创建了 Ingress 类型的防火墙规则(即用于传入 VM 流量)。您可以在规则中一次指定多个端口,用逗号分隔它们:5000,5044,5601,9200,9300,9600

        在该规则中,您可能需要指定一个标签(选择您喜欢的标签名称,例如docker-elk,它将针对您的虚拟机(目标列):

        在虚拟机的设置页面上将该标签分配给您的虚拟机:

        之后,我可以在浏览器中通过端口 9200 访问 Elasticsearch。而且我无需编辑 elasticsearch.yml 文件。

        【讨论】:

          【解决方案5】:

          对于高于 6.8 (7.x)的版本,您需要两件事。

          1。更改网络主机以侦听公共接口。

          在配置文件elasticsearch.yml(对于debian 及其衍生产品->/etc/elasticsearch/elasticsearch.yml)。

          • network.hostnetwork.bind_host 设置为:
          ...
          network.host: 0.0.0.0
          ...
          

          或者必须到达的界面

          2。在投入生产之前,有必要设置重要的发现和集群形成设置。

          根据 elastic.co:
          v6.8 -> 应该设置的发现设置。
          通过例如

          ...
          # roughly means the same as 1
          discovery.zen.minimum_master_nodes: -1
          ...
          

          v7.x -> 应该设置的发现设置。
          通过一个节点

          discovery.type: single-node
          #OR set discovery.seed_hosts : 127.0.0.1:9200
          

          必须至少配置 [discovery.seed_hostsdiscovery.seed_providerscluster.initial_master_nodes] 之一。

          【讨论】:

            【解决方案6】:

            不适用于 7.5.0 及更高版本。

            【讨论】:

            • 一般问题没有用,或者这可能是对其中一个答案的评论/回复?
            【解决方案7】:

            就我而言,问题出在 java 版本上,我之前安装了 open-jdk 11。那是在启动服务时产生问题。我更改了它open-jdk 8,它开始工作了

            【讨论】:

              【解决方案8】:

              我遇到了类似的问题。

              我是这样解决的

              运行下面的服务命令来启动ElasticSearch

              sudo service elasticsearch start
              

              sudo systemctl start elasticsearch
              

              如果你仍然得到错误

              curl: (7) 无法连接到 localhost 端口 9200:连接被拒绝

              运行下面的服务命令来检查ElasticSearch

              的状态
              sudo service elasticsearch status
              

              sudo systemctl status elasticsearch
              

              如果您收到如下响应(Active: active (running)),则您的 ElasticSearch 处于活动状态并正在运行

              ● elasticsearch.service - Elasticsearch 已加载:已加载(/usr/lib/systemd/system/elasticsearch.service;已禁用;供应商预设:已启用) 活动:活动(运行) 自周六 2019-09-21 11:22:21 WAT; 3 秒前

              然后,您可以使用以下命令向本地主机上的端口 9200 发送 HTTP 请求来测试您的 Elasticsearch 节点是否正在运行:

              curl http://localhost:9200
              

              否则,如果您收到不同的响应,您可能需要进一步调试以修复它,但运行下面的命令将帮助您检测哪些警告阻止了 ElasticSearch 服务启动.

              sudo service elasticsearch status
              

              sudo systemctl status elasticsearch
              

              如果要停止ElasticSearch服务,只需运行下面的服务命令即可;

              sudo service elasticsearch stop
              

              sudo systemctl stop elasticsearch
              

              N/B:您可能必须在每次遇到错误时运行命令sudo service elasticsearch status OR sudo systemctl status elasticsearch,以便告知当前状态ElasticSearch 服务。

              这同样适用于Kibana,每次遇到错误时运行命令sudo service kibana statusOR sudo systemctl status kibana,以告知的状态>Kibana 服务。

              就是这样。

              我希望这会有所帮助。

              【讨论】:

                【解决方案9】:

                如果遇到Connection refused错误,只需运行以下命令检查ElasticSearch服务的状态

                sudo service elasticsearch status
                

                这将帮助您破译 ElasticSearch 服务的状态以及如何处理它。

                【讨论】:

                  【解决方案10】:

                  编辑elasticsearch.yml并添加以下行

                  http.host: 0.0.0.0
                  

                  network.host: 0.0.0.0 不适合

                  【讨论】:

                  • 这个,如果你在 Win Server x64 上,也只有这个
                  【解决方案11】:

                  我的问题是我无法使用 localhost 我需要将其设置为本地主机的 IP 地址

                  network.bind_host: 127.0.0.1

                  【讨论】:

                    【解决方案12】:

                    禁用 SELinux 对我有用,虽然我不建议这样做 - 我这样做只是为了一个 PoC

                    【讨论】:

                      【解决方案13】:

                      将 network.bind 更改为 0.0.0.0 并将 http:port 更改为 9200。绑定地址 0.0.0.0 表示本地计算机上的所有 IPv4 地址。如果主机有两个 IP 地址,192.168.1.1 和 10.1.2.1,并且在主机上运行的服务器侦听 0.0.0.0,那么这两个 IP 都可以访问它。

                      【讨论】:

                        【解决方案14】:

                        确保端口 9200 对我来说是打开的,它是一个亚马逊实例,所以当我在我的安全组中打开它时,curl 命令有效。

                        【讨论】:

                          【解决方案15】:

                          将您的 jdk 更新到您的 elasticsearch 的最新最低版本。

                          【讨论】:

                            【解决方案16】:

                            补充一点,我通过 google 发现了许多文档,说将 network.host 设置为 localhost。

                            这样做给了我臭名昭著的连接被拒绝。您必须使用 IP 地址 (127.0.0.1),而不是 FQDN。

                            杰夫

                            【讨论】:

                              【解决方案17】:

                              利用上面的一些答案后,不要忘记在 apt 安装后,可能需要完全重启。

                              【讨论】:

                                【解决方案18】:

                                这里提出的解决方案都不适合我,但最终让它发挥作用的是将以下内容添加到 elasticsearch.yml

                                network:
                                  host: 0.0.0.0
                                http:
                                  port: 9200
                                

                                之后,我重新启动了服务,现在我可以在 VM 内部和外部curl 它。出于某种奇怪的原因,我不得不在虚拟机工作之前尝试了 curl 调用 inside 的几种不同变体:

                                curl localhost:9200
                                curl http://localhost:9200
                                curl 127.0.0.1:9200
                                

                                注意:我在 Ubuntu 14.04 上使用 Elasticsearch 5.5

                                【讨论】:

                                • 你是救生员。在阅读了各种不同的帖子后,这是唯一对我有用的东西。
                                • 是的,非常有帮助,这也是唯一对我有用的东西!
                                • 谢谢,我尝试了您的解决方案,它奏效了。我觉得很奇怪,因为我只需要取消注释端口号。我认为注释行就像预定义的默认值
                                【解决方案19】:

                                在我的例子中,elasticsearch 已经启动。 但还是有

                                curl: (7) Failed to connect to localhost port 9200: Connection refused
                                

                                以下命令不成功

                                sudo service elasticsearch restart
                                

                                为了让它工作,我不得不运行

                                sudo systemctl restart elasticsearch
                                

                                然后一切顺利。

                                【讨论】:

                                • 我遇到的问题和你的完全一样,你的解决方案对我有用。非常感谢!
                                • 我也必须这样做sudo systemctl enable elasticsearch
                                • 我遇到了同样的问题,但不明白为什么systemctl 有效而服务无效?
                                • @Luv33preet systemctl 由 systemd 提供支持,是一个完全不同的程序
                                • 在 Ubuntu 16.04 和弹性搜索 1.74 上重新启动服务对我有用
                                【解决方案20】:

                                我的 2 美分,

                                我刚刚按照 Digital Ocean 上的安装程序,显然 repos 中可用的软件包不是最新的,我删除了所有内容并直接从 Elastic Search 遵循安装程序,现在一切正常,基本上是开箱即用行为是在指向 9200 的本地主机上。与 Kibana 发现相同的事情/问题,我的解决方案也是,删除所有内容并按照他们的程序,希望这可以节省两个小时(我花时间弄清楚如何设置 ELK !)

                                zh

                                【讨论】:

                                  【解决方案21】:

                                  你为什么不从这个命令行开始:

                                  $ sudo service elasticsearch status
                                  

                                  我做到了,得到:

                                  "There is insufficient memory for the Java Runtime..."
                                  

                                  然后我编辑了/etc/elasticsearch/jvm.options文件:

                                  ...
                                  
                                  ################################################################
                                  
                                  # Xms represents the initial size of total heap space
                                  # Xmx represents the maximum size of total heap space
                                  
                                  #-Xms2g
                                  #-Xms2g
                                  
                                  -Xms512m
                                  -Xmx512m
                                  
                                  ################################################################
                                  
                                  ...
                                  

                                  这就像一个魅力。

                                  【讨论】:

                                  • 这似乎提供了与 3 月 22 日答案 bu @Jefferson.macedo 相同的信息。一个新的答案不应该只是重写现有的细节,它应该提供新的和有用的信息。
                                  • @AdrianHHH 实际上这个答案提供了新的信息,例如获得的错误和关于 -Xmxxx 行含义的 cmets。我认为“原始”答案在某种程度上不那么有吸引力,可能是因为代码的引号没有与文本分开,而是放在文本的中间。
                                  【解决方案22】:

                                  尝试了此页面上的所有内容,只有来自 here 的说明有所帮助。

                                  /etc/default/elasticsearch 中,确保这些未注释:

                                  START_DAEMON=true
                                  ES_USER=elasticsearch
                                  ES_GROUP=elasticsearch
                                  LOG_DIR=/var/log/elasticsearch
                                  DATA_DIR=/var/lib/elasticsearch
                                  WORK_DIR=/tmp/elasticsearch
                                  CONF_DIR=/etc/elasticsearch
                                  CONF_FILE=/etc/elasticsearch/elasticsearch.yml
                                  RESTART_ON_UPGRADE=true
                                  

                                  确保 /var/lib/elasticsearch 归 elasticsearch 用户所有:

                                  chown -R elasticsearch:elasticsearch /var/lib/elasticsearch/
                                  

                                  【讨论】:

                                  • 遇到了同样的问题,解决方案只是chown -R elasticsearch:elasticsearch /var/lib/elasticsearch/ 并取消注释START_DAEMON=true
                                  • 对我来说,这个解决方案 + @kalanit 回答的sudo systemctl restart elasticsearch 解决了问题
                                  • 这是在 Ubuntu 16.04 上帮助我的唯一解决方案。
                                  • 这解决了问题,但是为什么呢?为什么在 Ubuntu 16.x 上存在这个问题?
                                  【解决方案23】:

                                  我在拒绝 9200 端口上的连接时遇到了同样的问题。 使用命令sudo service elasticsearch status 检查 elasticsearch 服务状态。如果它出现错误并且您阅读了与 Java 相关的任何内容,则问题可能出在您的 jvm 内存上。您可以在/etc/elasticsearch/jvm.options 中编辑它。对于 Amazon 环境中的 1GB RAM 内存机器,我将配置保持在:

                                  -Xms128m
                                  -Xmx128m
                                  

                                  设置并重新启动 elasticsearch 服务后,它就像一个魅力。 Nmap 和 UFW(如果您使用本地防火墙)检查也应该很有用。

                                  【讨论】:

                                  • 这就是为我做的。我的配置两者都有 1g,而 AWS 实例 (t2.micro) 无法为其分配那么多内存。 start 和 restart 命令静默失败,但 status 命令详细说明了错误。
                                  【解决方案24】:

                                  对于这个问题,我不得不使用: sudo /usr/share/elasticsearch/bin/elasticsearch start

                                  能够在端口 9200/9300 (sudo netstat -ntlp) 上获取某些内容并响应:

                                  curl -XGET @987654321@

                                  【讨论】:

                                  • 谢谢。这适用于 ElasticSearch 1.~ 版本。
                                  • 检查状态,错误信息没有帮助。只有在手动运行 bin 文件时,它才会给出正确的错误消息。
                                  【解决方案25】:

                                  打开 elasticsearch 文件夹下的 Dockerfile 并使用 "network.host= 更新 "network.host=0.0.0.0" 127.0.0.1"。然后重启容器。检查您与 curl 的连接。

                                  $ curl http://docker-machine-ip:9200
                                  {
                                    "name" : "vI6Zq_D",
                                    "cluster_name" : "elasticsearch",
                                    "cluster_uuid" : "hhyB_Wa4QwSX6zZd1F894Q",
                                    "version" : {
                                      "number" : "5.2.0",
                                      "build_hash" : "24e05b9",
                                      "build_date" : "2017-01-24T19:52:35.800Z",
                                      "build_snapshot" : false,
                                      "lucene_version" : "6.4.0"
                                    },
                                    "tagline" : "You Know, for Search"
                                  }
                                  

                                  【讨论】:

                                    【解决方案26】:

                                    在这种情况下,首先您需要使用以下命令检查 java 版本:

                                    java -version
                                    

                                    运行此命令后,您会得到如下内容:

                                    java版本“1.7.0_51” OpenJDK 运行时环境 (rhel-2.4.5.5.el7-x86_64 u51-b31) OpenJDK 64 位服务器 VM(内部版本 24.51-b03,混合模式)

                                    然后使用这个命令:

                                    update-alternatives --config java
                                    

                                    并选择以下版本

                                    *+ 1 /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.51-2.4.5.5.el7.x86_64/jre/bin/java 2 /usr/java/jdk1.8.0_73/jre/bin/java

                                    Enter 保留当前选择[+],或输入选择编号:2

                                    curl -XGET http://127.0.0.1:9200
                                    

                                    【讨论】:

                                      【解决方案27】:
                                      OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000085330000, 2060255232, 0) failed; error='Cannot allocate memory' (errno=12)
                                      

                                      确保服务器已启动。当我的虚拟机内存太少并且 es 无法启动时,我已经看到了这个问题。

                                      sudo systemctl status elasticsearch
                                      

                                      上面会告诉你es是否确实在运行。

                                      【讨论】:

                                      【解决方案28】:

                                      编辑/etc/elasticsearch/elasticsearch.yml 并添加以下行:

                                      network.host: 0.0.0.0

                                      这将“取消设置”此参数并允许来自其他 IP 的连接。

                                      【讨论】:

                                      • 这对我有用,谢谢!但是在我的 Mac 上,配置文件位于/Applications/elasticsearch-2.1.1/config/elasticsearch.yml,我必须编辑的参数是network.host,而不是network.bind_host
                                      • 在elasticsearch 2.2中这个参数叫做network.host
                                      • 这个 /etc/elasticsearch/elasticsearch.yml 文件应该在 Docker 容器中?
                                      • 这为我解决了,我正在使用在 docker 容器内运行的 elasticsearch-6.0.0。配置更改后,我现在可以通过curl http://172.17.0.2:9200 访问。你会认出那是常用的 docker ip 寻址。
                                      • network.host: 0.0.0.0 - 没有帮助,但我从 cerebro 得到这个异常
                                      【解决方案29】:

                                      默认情况下,它应该绑定到所有本地地址。因此,假设您没有防火墙的网络层问题,我可以考虑检查的唯一 ES 设置是 network.bind_host 并确保它未设置或设置为 0.0.0.0::0 或正确的网络 IP 地址。

                                      更新:对于 ES 2.3 中的每个 cmets,您应该改为设置 network.host

                                      【讨论】:

                                      • 我必须明确设置 network.bind_host 值,而让它未设置是我的问题。
                                      • windows中如何显式设置network.bind_host?
                                      • 你确定这是安全的吗?我认为正确的是只能从本地服务器访问。
                                      • 嗯,在大多数情况下这是安全的。但是,是的,这就是为什么存在“正确的网络 IP 地址”条款的原因。
                                      • 如下所述,“network.bind_host”现在是 elasticsearch 2.3 的“network.host”