使用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
相关产品推荐
相关产品推荐

