文章目录
- 【问题解决】ConnectionRefusedError: [Errno 111] Connection refused when accessing http://127.0.0.1:8000/v1/completions
- 问题描述
- 问题原因
- 解决方案
- 方案 1:检查服务器是否运行
- 方案 2:启动服务器
- Ollama 服务器
- vLLM 服务器
- FastAPI 服务器
- 方案 3:检查服务器日志
- 方案 4:检查 API 端点
- 方案 5:检查防火墙设置
- 方案 6:使用不同的端口
- 示例代码
- 完整的连接测试和服务器启动示例
- 常见问题
- Q: 为什么服务器启动后很快就崩溃了?
- Q: 如何查看服务器的详细日志?
- Q: 端口 8000 被占用怎么办?
- Q: 防火墙阻止了连接怎么办?
- 总结
【问题解决】ConnectionRefusedError: [Errno 111] Connection refused when accessing http://127.0.0.1:8000/v1/completions
问题描述
在访问本地服务器 API 时,遇到以下错误:
ConnectionRefusedError: [Errno 111] Connection refused when accessing http://127.0.0.1:8000/v1/completions问题原因
这个错误通常由以下原因引起:
- 服务器未启动:本地服务器(如 Ollama、vLLM 或其他模型服务)未运行
- 端口错误:服务器运行在不同的端口上
- 网络配置问题:防火墙或网络设置阻止了连接
- 服务器崩溃:服务器进程已崩溃或异常退出
- 路径错误:API 端点路径不正确
- 依赖问题:服务器缺少必要的依赖项
解决方案
方案 1:检查服务器是否运行
# 检查端口 8000 是否被占用lsof-i :8000# 或使用 netstatnetstat-tuln|grep8000# 或使用 ssss -tuln|grep8000# Windows 系统使用netstat-ano|findstr :8000方案 2:启动服务器
根据使用的服务器类型,启动相应的服务:
Ollama 服务器
# 启动 Ollama 服务ollama servevLLM 服务器
# 使用 vLLM 启动服务器python -m vllm.entrypoints.api_server --model mistralai/Mistral-7B-v0.1 --port8000FastAPI 服务器
# 启动 FastAPI 服务器uvicorn app:app --host0.0.0.0 --port8000方案 3:检查服务器日志
# 查看服务器日志(以 Ollama 为例)journalctl -u ollama# 或查看最近的日志journalctl -u ollama -n50方案 4:检查 API 端点
确保使用正确的 API 端点:
importrequests# 测试 API 连接try:response=requests.post("http://localhost:8000/v1/completions",json={"model":"mistral","prompt":"Hello, ","max_tokens":50})print(f"Status code:{response.status_code}")print(f"Response:{response.json()}")exceptExceptionase:print(f"Error:{e}")方案 5:检查防火墙设置
# 检查防火墙状态(Linux)sudoufw status# 允许端口 8000(Linux)sudoufw allow8000# Windows 防火墙设置# 控制面板 -> 系统和安全 -> Windows Defender 防火墙 -> 高级设置 -> 入站规则 -> 新建规则方案 6:使用不同的端口
如果端口 8000 被占用,使用其他端口:
# 使用端口 8080 启动服务器python -m vllm.entrypoints.api_server --model mistralai/Mistral-7B-v0.1 --port8080然后更新客户端代码:
response=requests.post("http://localhost:8080/v1/completions",# 其他参数不变)示例代码
完整的连接测试和服务器启动示例
importrequestsimportsubprocessimporttimeimportosdefcheck_server_running(port=8000):"""检查服务器是否在指定端口运行"""try:response=requests.get(f"http://localhost:{port}/v1/models")returnresponse.status_code==200except:returnFalsedefstart_server(model="mistralai/Mistral-7B-v0.1",port=8000):"""启动 vLLM 服务器"""print(f"Starting server with model{model}on port{port}...")# 启动服务器进程process=subprocess.Popen(["python","-m","vllm.entrypoints.api_server","--model",model,"--port",str(port)],stdout=subprocess.PIPE,stderr=subprocess.PIPE,text=True)# 等待服务器启动time.sleep(10)# 检查服务器是否成功启动ifcheck_server_running(port):print(f"Server started successfully on port{port}")returnprocesselse:print("Failed to start server")# 打印错误信息stderr=process.stderr.read()print(f"Error:{stderr}")process.terminate()returnNonedeftest_completion(port=8000):"""测试文本生成 API"""print("Testing completion API...")try:response=requests.post(f"http://localhost:{port}/v1/completions",json={"model":"mistralai/Mistral-7B-v0.1","prompt":"Hello, how are you?","max_tokens":50,"temperature":0.7})ifresponse.status_code==200:result=response.json()print(f"Success! Generated text:{result['choices'][0]['text']}")returnTrueelse:print(f"Error:{response.status_code}-{response.text}")returnFalseexceptExceptionase:print(f"Connection error:{e}")returnFalse# 使用示例if__name__=="__main__":port=8000# 检查服务器是否已运行ifnotcheck_server_running(port):print("Server not running. Starting server...")server_process=start_server(port=port)ifnotserver_process:print("Exiting...")exit(1)# 测试 APItest_completion(port=port)# 注意:这里服务器会继续运行# 要停止服务器,使用 server_process.terminate()else:print("Server already running. Testing API...")test_completion(port=port)常见问题
Q: 为什么服务器启动后很快就崩溃了?
A: 可能是因为内存不足、缺少依赖项或模型文件损坏。检查服务器日志获取详细错误信息。
Q: 如何查看服务器的详细日志?
A: 启动服务器时不要使用后台运行,或查看系统日志文件。对于 vLLM,可以添加--debug参数获取更详细的日志。
Q: 端口 8000 被占用怎么办?
A: 使用lsof -i :8000查看占用端口的进程,然后决定是停止该进程还是使用其他端口。
Q: 防火墙阻止了连接怎么办?
A: 在防火墙设置中允许端口 8000 的入站连接,或临时关闭防火墙进行测试。
总结
遇到ConnectionRefusedError: [Errno 111] Connection refused错误时,主要需要:
- 确认服务器是否正在运行
- 检查服务器端口是否正确
- 验证 API 端点路径是否正确
- 查看服务器日志获取详细错误信息
- 检查网络和防火墙设置
- 确保服务器有足够的资源(内存、GPU 等)
通过以上解决方案,应该能够成功连接到本地服务器 API 并进行文本生成。