过去几天,我一直在尝试让 Phusion Passenger 在 5.6 上运行,但一直没有成功。最初,我使用 RVM 下的 Ruby 1.9.2,因为基于 RHEL 的发行版上的默认 Ruby 相当老旧。我成功安装了所有东西,但遇到了一些问题。我以为是 RVM 的问题,因此将其与默认 Ruby 一起完全删除,并将 Ruby Enterprise Ed. 1.8.7.2011-03 安装了进去/usr
。我仍然遇到同样的问题。
当我尝试使用安装程序提供的默认安装说明来安装 Passenger 时,我收到一条错误消息cannot find phusion_passenger/analytics_logger
。我从 Google 上找到的相关信息很少,但据我推测这是一个权限错误。
最初,我尝试设置一个 ACL,允许 apache 用户访问 Passenger 根目录。如果失败,我尝试将 Passenger 根目录的权限设置为 777。接下来,我尝试根据用户指南的第 6.3.5 节将 Passenger 根目录及其父目录的上下文更改为httpd_sys_content_t
。最后,我尝试将 SELinux 设置为宽容。但没有任何效果。
阅读完用户指南后,我尝试了以下设置,结果得到了 500 ISE:
PassengerUserSwitching off
PassengerUser apache
PassengerGroup apache
这是我的passenger.conf
文件减去上述内容(来自/etc/httpd/conf.d
):
LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-3.0.7/ext/apache2/mod_passenger.so
PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-3.0.7
PassengerRuby /usr/bin/ruby
....
PassengerLogLevel 3
这是 500 错误的日志输出:
[ pid=17939 thr=1094539584 file=ext/common/ApplicationPool/Pool.h:939 time=2011-04-30 13:12:17.351 ]: Spawning a process for /var/www/html because there are none for this app group
[ pid=17939 thr=1094539584 file=ext/common/ApplicationPool/../SpawnManager.h:291 time=2011-04-30 13:12:17.352 ]: Spawning a new application process for /var/www/html...
[ pid=17939 thr=1094539584 file=ext/common/ApplicationPool/../SpawnManager.h:427 time=2011-04-30 13:12:17.352 ]: Spawn server died. Attempting to restart it...
[ pid=17939 thr=1094539584 file=ext/common/ApplicationPool/../SpawnManager.h:430 time=2011-04-30 13:12:17.357 ]: Restart seems to be successful.
[ pid=17939 thr=1094539584 file=ext/common/ApplicationPool/../SpawnManager.h:291 time=2011-04-30 13:12:17.359 ]: Spawning a new application process for /var/www/html...
/usr/bin/ruby: error while loading shared libraries: libtcmalloc_minimal.so.0: cannot open shared object file: No such file or directory
[ pid=17939 thr=1094539584 file=ext/common/ApplicationPool/Server.h:297 time=2011-04-30 13:12:17.365 ]: Client 9: SpawnException occured (no error page)
[ pid=17951 thr=47853881642864 file=ext/apache2/Hooks.cpp:865 time=2011-04-30 13:12:17.366 ]: Unexpected error in mod_passenger: Cannot spawn application '/var/www/html': Could not read from the spawn server: Connection reset by peer (104)
Backtrace:
in 'virtual Passenger::SessionPtr Passenger::ApplicationPool::Client::get(const Passenger::PoolOptions&)' (Client.h:750)
in 'Passenger::SessionPtr Hooks::getSession(const Passenger::PoolOptions&)' (Hooks.cpp:297)
in 'int Hooks::handleRequest(request_rec*)' (Hooks.cpp:566)
答案1
首先,当您说删除了默认 Ruby 时,我希望您指的不是 CentOS 附带的 Ruby。根据我的经验,最好不要管它,让 yum 来管理它。我将 Ruby/REE 版本安装到 /opt/ruby 中,但它们也可以放在 /usr/local 或您想要的任何位置。
至于配置 SELinux,我个人禁用它,但 permissive 应该没有什么不同。从基本安装开始,我只需添加编译软件包所需的典型软件包,然后进行完整升级:
# yum -y install gcc make gcc-c++ cpp automake patch zlib-devel && yum -y upgrade
然后我安装 REE 1.8.7-2011.03:
# ./installer --dont-install-useful-gems --no-dev-docs --auto /opt/ruby/enterprise-1.8.7-2011.03
确保 Apache(httpd)已安装,然后安装 Passenger gem 和相应的 Apache 模块:
# /opt/ruby/enterprise-1.8.7-2011.03/bin/gem install --no-rdoc --no-ri --version '= 3.0.7' passenger
# /opt/ruby/enterprise-1.8.7-2011.03/bin/passenger-install-apache2-module -a
将它告诉您的内容添加到 Apache 的 httpd.conf 中。我使用以下内容:
SetEnv MY_RUBY_HOME "/opt/ruby/enterprise-1.8.7-2011.03"
SetEnv GEM_HOME "/opt/ruby/enterprise-1.8.7-2011.03/lib/ruby/gems/1.8"
SetEnv GEM_PATH "/opt/ruby/enterprise-1.8.7-2011.03/lib/ruby/gems/1.8"
LoadModule passenger_module /opt/ruby/enterprise-1.8.7-2011.03/lib/ruby/gems/1.8/gems/passenger-3.0.7/ext/apache2/mod_passenger.so
PassengerRoot /opt/ruby/enterprise-1.8.7-2011.03/lib/ruby/gems/1.8/gems/passenger-3.0.7
PassengerRuby /opt/ruby/enterprise-1.8.7-2011.03/bin/ruby
然后,我将一个简单的 Rails 应用程序部署到 /home/httpd/app,并添加类似于以下的 VirtualHost:
<VirtualHost *:80>
ServerName example.domain.com
DocumentRoot /home/httpd/app/public
RackBaseURI /
RailsEnv production
PassengerSpawnMethod smart
</VirtualHost>
确保安装了应用程序所需的所有 gem,包括“rails”。
在整个设置过程中,您不应该除了必须记住您的应用程序将以 Rails 应用程序根目录所有者的用户/组身份运行外,文件权限也不必太过特殊。此用户必须至少拥有所有 /opt/ruby 内容的 rx 权限。
我真的不知道你为什么会收到错误/usr/bin/ruby: error while loading shared libraries: libtcmalloc_minimal.so.0: cannot open shared object file: No such file or directory
,但如果你按照上述指示,并确保不打扰你的系统 Ruby,你应该不会遇到任何问题。
很抱歉我没有真正回答您的问题,但我希望我经过尝试和信任的过程对您和对我自己同样有效!