现场是这样的。部署完 vllm serve 后直接访问 /generate 能用,业务改用 openai 客户端访问 /v1/chat/completions 却 404,base_url 写的是 http://ip:8000。
中间走过弯路,把「前面挂了 Nginx,只转发了 /generate 这一个前缀」当成主因,改完现象没变。
排查方向其实有限,先把可能性排一排。base_url 少了 /v1,SDK 拼出来的路径多了一层;启动参数里带了 –api-key,未带鉴权头被当成无效路由;模型名与启动时的 –served-model-name 不一致,另一类 404。
直接 curl 两条路径确认哪条通
curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8000/v1/models
再往下把 base_url 补上 /v1 再试
python -c "import openai;c=openai.OpenAI(base_url='http://127.0.0.1:8000/v1',api_key='x');print(len(c.models.list().data))"
剩下的就是检查反代是否只转发了单个前缀
curl -sS -o /dev/null -w '%{http_code}\n' http://your-domain/v1/models
当时还开着另一个排查窗口,两边日志对照着看才定位到。
同一份数据我导出了两份,一份留底,一份拿来试。
恢复的判定其实很直接。/v1/models 与 /v1/chat/completions 都返回 200,SDK 能列出模型并正常对话,404 消失。
补一句。OpenAI 客户端的 base_url 必须写到版本号那一层,写主机名会拼出重复路径,这个坑在新接自建服务时反复出现。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
