Horizon出现500错误,基本可确定是Apache后端Python应用启动失败或运行异常,需立即查看/var/log/httpd/error_log或/var/log/apache2/error.log,重点排查ImportError、SECRET_KEY缺失、数据库认证失败等典型错误,并确认WSGIApplicationGroup %{GLOBAL}已配置且local_settings.py语法正确。

Horizon 出现 500 错误,基本可以确定是 Apache(或 httpd)后端 Python 应用启动失败或运行异常,不是前端或网络连通性问题。直接查 /var/log/httpd/error_log 或 /var/log/apache2/error.log,90% 的真实原因就藏在最近几行里。
看 Apache 错误日志定位具体异常
Horizon 是基于 Django 的 WSGI 应用,所有 Python 层报错(导入失败、配置语法错误、模块缺失、数据库连接拒绝等)都会被 Apache 捕获并转为 500。不看日志就调配置,纯属碰运气。
- 先确认日志路径:
ls -l /var/log/httpd/error_log(RHEL/CentOS)或ls -l /var/log/apache2/error.log(Ubuntu/Debian) - 实时跟踪最新错误:
tail -f /var/log/httpd/error_log | grep -i "error\|import\|dashboard\|horizon" - 常见日志线索举例:
—ImportError: No module named 'openstack_dashboard'→ Python 包未安装或路径不对
—django.core.exceptions.ImproperlyConfigured: SECRET_KEY→local_settings.py缺少或格式错误
—OperationalError: (1045, "Access denied for user 'horizon'@'localhost'")→ 数据库认证失败
检查 WSGI 配置是否启用全局应用组
OpenStack Pike 及之后版本(包括 Queens、Rocky、Train 等)在 Apache 下常因 Python 多进程隔离导致模块加载冲突,典型表现是首次访问正常、后续请求 500,或 __import__(name) 报错。这是已知的 mod_wsgi 兼容性问题。
- 编辑 Apache Horizon 配置文件:
/etc/httpd/conf.d/openstack-dashboard.conf(RHEL)或/etc/apache2/conf-available/openstack-dashboard.conf(Ubuntu) - 在
<VirtualHost>或<Directory>块内,确保包含这一行:WSGIApplicationGroup %{GLOBAL} - 不要加在
WSGIScriptAlias行后面,必须独立成行;如果已有但被注释,取消注释即可 - 改完后必须重启服务:
systemctl restart httpd(RHEL)或systemctl restart apache2(Ubuntu)
验证 Horizon 配置文件语法与依赖完整性
Horizon 启动时会加载 /usr/share/openstack-dashboard/openstack_dashboard/settings.py 和 /etc/openstack-dashboard/local_settings.py。任一文件存在语法错误、变量名拼错、缩进混乱或引用了未安装的模块,都会导致整个 WSGI 应用初始化失败。
- 手动测试配置加载是否通过:
python3 -c "from openstack_dashboard import settings; print('OK')"—— 若报错,说明 Python 层配置本身就有问题 - 检查
local_settings.py中关键项:OPENSTACK_HOST是否指向正确的 controller IP;SECRET_KEY是否非空且是字符串;ALLOWED_HOSTS是否包含当前访问域名/IP(如['controller', '192.168.1.10', 'localhost']) - 确认依赖已安装:
pip3 list | grep -E "(django|openstack)",尤其注意python-openstackclient和django-compressor是否版本匹配(Pike 要求 Django
别忽略 SELinux 和文件权限这两个“静默杀手”
在 RHEL/CentOS 上,SELinux 默认启用,而 Horizon 的静态文件目录(/usr/share/openstack-dashboard/static)、缓存目录(/var/tmp/horizon)或 WSGI 脚本(/usr/share/openstack-dashboard/openstack_dashboard/wsgi/django.wsgi)若上下文类型不正确,Apache 进程会被阻止读取,日志里只显示模糊的 Permission denied,不会提示 SELinux。
- 临时放行测试:
setenforce 0,再刷新页面 —— 如果 500 消失,就是 SELinux 问题 - 恢复 enforcing 后修复上下文:
restorecon -Rv /usr/share/openstack-dashboard/ /var/tmp/horizon/ - 检查关键文件属主:
/usr/share/openstack-dashboard/openstack_dashboard/wsgi/django.wsgi必须可被apache用户读取(不能是 root:root 且权限 600);建议设为root:apache+644
真正棘手的 500 往往卡在“日志有报错但看不懂”或“改了配置没生效”。务必确认你改的是 Apache 实际加载的那个 conf 文件(httpd -t -D DUMP_INCLUDES 可列出),而不是备份或模板;另外,修改 local_settings.py 后 Apache 不会自动重载,必须重启服务才能重新加载 Python 模块。

















