You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pysolr连接Solr时出现Errno 111连接拒绝问题求助

问题描述

我开发了一个Flask应用,尝试用pysolr连接Solr,代码如下:

import flask as f
import pysolr

app = f.Flask(__name__)
solr = pysolr.Solr('http://localhost:8983/solr/')

@app.route("/ping")
def ping():
    return solr.ping()

运行时抛出连接拒绝错误:

pysolr.SolrError: Failed to connect to server at http://localhost:8983/solr/admin/ping/?: HTTPConnectionPool(host='localhost', port=8983): Max retries exceeded with url: /solr/admin/ping/ (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f1a085f6510>: Failed to establish a new connection: [Errno 111] Connection refused'))

我确认Solr正常运行,浏览器能访问http://localhost:8983/solr,但无论代码里用localhost、0.0.0.0还是127.0.0.1都无法解决。目前用docker-compose部署Solr和Web应用,此前未用Docker时也遇到相同问题,我的docker-compose.yml内容如下:

version: '3'

services:

  solr:
    image: solr
    ports:
     - "8983:8983"
    volumes:
      - ./data:/var/solr/
    entrypoint:
    - bash
    - "-c"
    - "precreate-core stable; precreate-core unstable; precreate-core archive; exec solr -f"

  frontend:
    build: ./src
    ports:
      - "80:80"
    depends_on:
      - solr

volumes:
  data:
解决方法

1. 修正Docker环境下的网络连接地址

在Docker容器内部,localhost指向容器自身,而非宿主机的Solr服务。需要改用docker-compose中Solr的服务名solr作为主机地址,同时必须指定具体的Solr核心(你预创建的stable/unstable/archive之一):

# 示例:连接stable核心
solr = pysolr.Solr('http://solr:8983/solr/stable')

Solr的ping接口绑定到具体核心,不指定核心会导致请求路径无效,触发连接拒绝或404错误。

2. 非Docker环境的核心指定修正

未使用Docker时,同样需要在连接串中添加核心名,否则无法正常调用ping接口:

solr = pysolr.Solr('http://localhost:8983/solr/stable')

3. 确保Solr服务完全就绪

docker-compose的depends_on仅保证容器启动顺序,不确保Solr服务已完成加载。可以给Solr服务添加健康检查,确保服务就绪后再启动前端应用:
修改docker-compose.yml中的solr服务配置:

solr:
  image: solr
  ports:
   - "8983:8983"
  volumes:
    - ./data:/var/solr/
  entrypoint:
  - bash
  - "-c"
  - "precreate-core stable; precreate-core unstable; precreate-core archive; exec solr -f"
  healthcheck:
    test: ["CMD", "curl", "-f", "http://localhost:8983/solr/stable/admin/ping"]
    interval: 10s
    timeout: 5s
    retries: 5

同时,建议在Flask应用中添加重试逻辑,避免Solr未就绪时的连接失败:

# 先安装依赖:pip install tenacity
import tenacity

@app.route("/ping")
@tenacity.retry(stop=tenacity.stop_after_attempt(5), wait=tenacity.wait_fixed(2))
def ping():
    return solr.ping()

内容的提问来源于stack exchange,提问作者theo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 15:43:34