Centos+Apache+Phusion+REE=失败

Centos+Apache+Phusion+REE=失败

过去几天,我一直在尝试让 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,你应该不会遇到任何问题。

很抱歉我没有真正回答您的问题,但我希望我经过尝试和信任的过程对您和对我自己同样有效!

相关内容