Ubuntu下Apache报AH00111错误:已定义环境变量未被识别
AH00111: Config variable ${PORTAL_SERVER} is not defined的问题 我之前迁移Apache配置时碰到过几乎一模一样的情况,结合你的描述,核心问题是Apache启动进程的上下文没读取到你在/etc/environment里定义的PORTAL_SERVER变量——虽然你的用户shell能看到这个变量,但Apache启动时的环境和普通用户shell完全是两回事。
下面是我亲测有效的排查和解决步骤:
1. 手动在Apache的envvars文件中强制导出变量
虽然你说新旧机器的/etc/apache2/envvars完全一致,但不妨在新机器的这个文件末尾直接添加一行:
export PORTAL_SERVER="你的服务器地址"
保存后重启Apache:
service apache2 restart
这么做的原因是:Apache启动时会优先加载envvars里的变量,直接在这里定义能确保进程启动时就能拿到值,不受系统环境变量加载顺序的影响。
2. 检查Upstart启动配置(Ubuntu 14.04用的是Upstart)
Ubuntu 14.04的Apache是通过Upstart管理的,默认的/etc/init/apache2.conf不会自动读取/etc/environment里的变量。你可以对比下旧机器的这个文件,大概率是之前修改过的。
解决方法:在新机器的/etc/init/apache2.conf开头添加一行:
env PORTAL_SERVER="你的服务器地址"
或者如果想加载整个/etc/environment的内容,可以在pre-start script块里添加:
. /etc/environment
修改后重启Upstart服务:
initctl reload-configuration service apache2 restart
3. 排查sudo的环境变量过滤问题
如果你是用sudo操作Apache的,要注意sudo默认会重置大部分环境变量。测试一下:
sudo printenv | grep PORTAL_SERVER
如果没有输出,说明sudo把这个变量过滤掉了。解决方法是编辑sudoers文件:
sudo visudo
添加一行:
Defaults env_keep += "PORTAL_SERVER"
保存后再用sudo操作Apache就能继承这个变量了。
4. 用debug模式启动Apache排查变量加载情况
如果上面的方法都不行,可以用debug模式启动Apache,查看详细的启动日志:
/usr/sbin/apache2ctl -k start -e debug
日志里会显示Apache启动时加载的所有环境变量,你可以直接搜索PORTAL_SERVER,确认它是否被正确加载。
为什么旧机器没问题?大概率是旧机器的Apache启动配置(比如Upstart文件或者sudoers)之前已经做过适配,而你只复制了/etc/apache2文件夹,漏掉了这些系统层面的配置。
内容的提问来源于stack exchange,提问作者AbVog




