Puppet搭配Apache与Passenger:无法生成应用进程问题求助
碰到这个问题我太熟悉了,结合你的环境CentOS 6.5、Puppet 3.8.7、Apache 2.2.15和Phusion Passenger 5.2.1,大概率是这几个原因导致的,给你逐个分析排查:
Passenger版本兼容性不匹配
你用的Passenger 5.2.1其实和这套老环境冲突挺明显的:Passenger 5.x已经不再支持Ruby 1.8.7(CentOS 6.5默认的Ruby版本),而Puppet 3.8.7刚好依赖Ruby 1.8.7。这直接导致Passenger无法正常启动Puppet的Ruby应用进程。
解决建议:把Passenger降级到4.0.x系列,这个版本完美兼容Ruby 1.8.7和Apache 2.2.15,和Puppet 3.8.7搭配也最稳定。系统资源被耗尽
如果服务器内存、CPU跑满了,Passenger根本没法fork新进程处理Puppet请求。你可以用这两个命令快速排查:- 用
top看CPU和进程负载; - 用
free -m查看空闲内存。
Puppet主节点至少要留512MB以上空闲内存给Passenger池,如果内存不够,要么清理后台无用进程,要么升级服务器配置;CPU高负载的话,建议优化Puppet代码(比如减少重复的资源声明、用高效的模板)。
- 用
文件权限配置错误
Apache运行的httpd用户需要对Puppet相关目录有读写权限,否则Passenger没法加载应用。重点检查这些路径:/etc/puppet(Puppet主配置目录)/var/run/passenger(Passenger临时进程目录)/var/log/puppet(日志目录)
确保这些目录的所有者或组包含apache用户,目录权限设为755,文件权限设为644就够了。
Apache与Passenger的配置项冲突
检查Apache的Passenger配置段有没有错:- 确认
PassengerRoot和PassengerRuby指向正确,PassengerRuby必须是系统里和Puppet匹配的Ruby路径(比如CentOS 6.5的/usr/bin/ruby); PassengerMaxPoolSize别设太小,默认建议至少设为4,如果并发请求多,可以适当调高;- 虚拟主机里的
RackBaseURI要设为/puppet,这是Puppet应用的默认挂载路径。
- 确认
SELinux策略限制
CentOS 6.5默认开着SELinux,如果它阻止Apache访问Puppet目录或执行相关操作,也会导致进程生成失败。可以先临时关SELinux测试:setenforce 0,如果问题解决了,别直接永久关,用audit2allow工具生成自定义策略模块,给Apache授权访问Puppet相关资源的权限,这样更安全。
内容的提问来源于stack exchange,提问作者pitmod

