4

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

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

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

无论如何,我搜索了一下,发现有人说这是一个 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

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

很困惑……有什么想法吗?

4

2 回答 2

4

您的日志文件中“ls -l”的结果是什么?在 Ubuntu 上,我必须确保日志文件中的 acl 正确。我通常通过使用来解决这个问题

sudo chown -R deploy:deploy /path/to/app

部署是乘客运行的用户。

于 2009-11-25T13:52:44.253 回答
3

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

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

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

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

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

这可以是部署配置步骤来 chown 有问题的文件和目录,也可以是配置 apache 并告诉它以特定用户身份运行 ruby​​ 进程(例如,root 而不是nobody)。显然不建议以 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

于 2012-04-01T23:29:54.240 回答