Ubuntu20 Odoo14经Apache2代理频繁报bus.Bus不可用故障排查
前置核验结论
目前已确认:
- 8072 longpolling端口本地监听状态正常,无端口连通性障碍
- Odoo配置已开启proxy_mode = True、正确配置longpolling_port = 8072
- Apache已添加基础反向代理规则
- Odoo日志每间隔1分钟抛出
bus.Bus unavailable异常,对应请求路径为POST /longpolling/poll
核心报错根因
- Apache代理规则匹配顺序冲突:mod_proxy模块默认按配置文件自上而下的顺序匹配请求路径,匹配到第一条规则后就会停止后续规则匹配。当前配置将全局根路径规则
ProxyPass / http://127.0.0.1:8069/放在所有细分路径规则之前,所有发往/longpolling的请求会被优先匹配全局规则,直接转发到8069端口的普通HTTP工作进程,完全绕过了后面配置的8072 longpolling转发规则。 - Odoo源码内置异常触发逻辑:Odoo 14的
bus.controllers.main模块中,/longpolling/poll接口设计为仅由8072端口的gevent长轮询进程响应,当请求被错误转发到8069的普通HTTP进程时,控制器会直接抛出bus.Bus unavailable异常,和日志堆栈完全匹配。 - 长连接代理参数缺失:即使规则顺序调整正确,默认Apache配置的短超时、响应缓冲机制也会中断longpolling的长轮询连接,持续触发bus连接异常。
落地修复步骤
1. 调整Apache代理配置顺序与长连接参数
- 移除冗余重复的longpolling规则,将细分路径代理规则移到全局根路径规则之前,追加长轮询适配参数,修正后的VirtualHost代理段参考:
# 优先匹配longpolling路径,置于全局规则之前 <Location /longpolling> # 适配长轮询的超时配置,默认30s超时会中断长连接 ProxyTimeout 2592000 ProxyPass /longpolling http://127.0.0.1:8072/ ProxyPassReverse /longpolling http://127.0.0.1:8072/ # 关闭代理层的连接复用、响应缓冲,适配长轮询协议 SetEnv proxy-nokeepalive 1 SetEnv proxy-sendchunks 1 </Location> # 全局根路径规则放在最后匹配 ProxyPass / http://127.0.0.1:8069/ ProxyPassReverse / http://127.0.0.1:8069/
- 修正后执行
apache2ctl configtest确认配置无语法错误,再重启Apache服务。
2. 校验Odoo侧bus模块完整性
- 通过Odoo shell连接目标数据库,执行bus模型查询命令,排查数据库表损坏问题:
from odoo import api, SUPERUSER_ID # 替换为实际数据库名 env = api.Environment(cr, SUPERUSER_ID, {}) env['bus.bus'].search([])
- 如果执行命令报表不存在、字段缺失错误,升级
bus模块即可恢复表结构完整性。
3. 修复效果验证
- 本地直连代理端口测试longpolling路径转发正确性:
curl -v http://127.0.0.1/longpolling/poll
- 观察Odoo日志确认不再周期性抛出
bus.Bus unavailable报错,浏览器打开Odoo页面后,长连接可正常建立,消息通知、实时面板等bus依赖功能恢复正常。
内容的提问来源于stack exchange,提问作者Omeed Totakhel
相关产品推荐
相关产品推荐

