未写入日志文件(乘客)

时间:2009-11-24 03:26:15

标签: ruby-on-rails linux apache passenger selinux

在本地,我的应用运行良好并写入其日志。

我的生产服务器运行CentOS,运行Passenger的Apache服务器。在尝试调试时,我注意到我的日志文件没有被写入。我做的第一件事是chmod 0666他们,当我发现不起作用时,我查看了我的apache日志。我发现了这个:Rails错误:无法访问日志文件。请确保/var/www/vhosts/mysite.com/rails/exp/releases/20091124020342/log/production.log存在并且是chmod 0666.日志级别已提升为WARN,输出已定向到STDERR,直到出现问题是固定的。

(注意:我正在使用capistrano进行部署)

无论如何,我用Google搜索并发现有人说这是SELinux问题,所以我查看了乘客的文档并发现了这一点:http://www.modrails.com/documentation/Users%20guide.html#_my_rails_application_8217_s_log_file_is_not_being_written_to

基本上说这样做:chcon -R -h -t httpd_sys_content_t / path / to / your / rails / app

然而,当我填写正确的路径时,我得到:不支持操作。

非常难过......有什么想法吗?

2 个答案:

答案 0 :(得分:4)

日志文件中“ls -l”的结果是什么?在Ubuntu上,我必须确保日志文件中的acl是正确的。我通常使用

来解决这个问题
sudo chown -R deploy:deploy /path/to/app

部署是乘客所在的用户。

答案 1 :(得分:3)

我的ubuntu 10.x服务器遇到了同样的问题。这是我在排除故障时学到的。

  • 如前所述,在文档中,Passenger运行rails ruby​​进程作为config / environment.rb文件的所有者。除非您做了一些特别的事情,否则这通常与整个rails应用程序目录的所有者相同。在capistrano部署的情况下,这是capistrano用户。
  • 如果environment.rb由root拥有(很可能是因为您以root用户身份部署),乘客将铁路进程作为“nobody”运行

您可以通过top命令(或任何其他技术)查看进程运行的用户。

在任何一种情况下 - 我的发生都是后者 - 如果rails进程无法写入日志文件,则日志中没有任何内容显示(duh)。 Rails将忽略此权限被拒绝错误并尝试正常处理请求。

解决方案是确保rails ruby​​进程以拥有rails部署,config / environment.rb文件以及logs目录和文件的用户身份运行。

这可以是deplyment配置步骤,用于chown有问题的文件和目录,或者配置apache并告诉它以特定用户(例如root而不是nobody)运行ruby进程。显然不建议以root身份运行,但如果您出于某种原因这样做,并且需要正确写入rails日志,则可以通过添加以下内容来执行此操作

# in /etc/apache2/apache2.conf
PassengerDefaultUser root 

如果您没有以root身份部署(我在其他服务器上就是这种情况),典型情况应该是rails app目录由非root用户拥有,而乘客应该将rails进程作为那个用户。一切都应该奏效。

[1] http://www.modrails.com/documentation/Users%20guide%20Apache.html#_the_rails_application_reports_that_it_8217_s_unable_to_start_because_of_a_permission_error