【问题标题】:What user is running my Rails app?什么用户正在运行我的 Rails 应用程序?
【发布时间】:2011-05-13 00:22:14
【问题描述】:

我正在尝试在 Apache、Passenger 3.0.0 和 Rails 3.0.3 下部署一个简单的 Rails 应用程序。我收到各种奇怪的错误。主要围绕我认为与捆绑程序或 RAILS_ENV 相关的内容。

该应用程序唯一的非默认情况是开发和测试环境使用 SQLite3,而生产环境使用 MySQL。

当从 Web 浏览器访问应用程序时,Passenger 会抛出有关 gem (sqlite3) 的错误,这些 gem (sqlite3) 被明确声明为不是生产环境的一部分(在 Gemfile 和 database.yml 中)。

我如何知道服务器试图以哪个用户身份运行我的 Rails 应用程序?我想确保为该用户正确设置了 RAILS_ENV,因为我认为乘客出于某种原因试图在开发模式下运行此应用程序。

编辑:添加ps aux | grep httpd的结果

myserver:current elvis$ ps aux | grep httpd
elvis     4424   0.4  0.0    66152    192 s000  S+   11:03AM   0:00.00 grep httpd
_www      1950   0.0  0.2    93024   2544   ??  S    11:40PM   0:01.23 /usr/sbin/httpd -D FOREGROUND
root      1918   0.0  1.0    93024  10244   ??  Ss   11:39PM   0:02.75 /usr/sbin/httpd -D FOREGROUND
_www      4084   0.0  0.2    93024   2536   ??  S     9:41AM   0:00.15 /usr/sbin/httpd -D FOREGROUND

ls -l ...

myserver:current elvis$ ls -l config
total 48
-rw-rw-r--  1 aaron  admin  1923 Nov 19 21:40 application.rb
-rw-rw-r--  1 aaron  admin   326 Nov 19 21:40 boot.rb
-rw-rw-r--  1 aaron  admin   741 Nov 19 21:40 database.yml
-rw-rw-r--  1 aaron  admin  1257 Nov 19 21:40 deploy.rb
-rw-rw-r--  1 aaron  admin   149 Nov 19 21:40 environment.rb
drwxrwxr-x  5 aaron  admin   170 Nov 19 21:40 environments
drwxrwxr-x  7 aaron  admin   238 Nov 19 21:40 initializers
drwxrwxr-x  3 aaron  admin   102 Nov 19 21:40 locales
-rw-rw-r--  1 aaron  admin  1808 Nov 19 21:40 routes.rb

【问题讨论】:

  • 你能告诉我们一些错误吗?

标签: ruby-on-rails deployment passenger


【解决方案1】:

默认情况下,乘客将以拥有config/environment.rbconfig.ru 文件的用户身份运行您的应用,请参阅http://www.modrails.com/documentation/Users%20guide%20Apache.html#user_switching

默认情况下,Passenger 将在production 环境中运行,除非您使用RailsEnv 另有说明,请参阅http://www.modrails.com/documentation/Users%20guide%20Apache.html#rails_env

【讨论】:

  • 我认为运行该应用程序的用户在您的情况下可能是一个红鲱鱼。更有可能是 Rails 配置问题。您可以从服务器上的应用程序目录运行./script/console production 吗?如果这会引发相同的错误,那么调试起来会更容易。
  • 您的 config.ru/environment.rb 的所有者应该是您运行“捆绑安装”的任何用户。 'bundle install' 安装到 $HOME/.bundle 或 ./help 取决于您的 Bundler 设置;在前者的情况下,$HOME 取决于调用“捆绑安装”的用户。因此,如果您将“bundle install”作为“foobar”运行,那么您还必须确保您的 Rails 应用程序作为“foobar”运行,否则由于权限问题,它无法访问 Bundler 已安装的 gem。
  • 更新了我上面的问题。运行 apache 的用户是 _www 而 environment.rb 的所有者是 aaron 和/或 root。我无法以_www 登录。它是系统创建的用户。我不知道它的宝石位置。但是像 aaron 和其他用户这样的用户有不同的 gem,具体取决于他们的 $PATH 变量。服务器上没有 rvm。我怎么知道 Rails 生产中的宝石(假设它是 _www)指向什么?
  • Apache 的控制进程以 root 身份运行,因为它需要 root 才能绑定到端口 80。完成此操作后,出于安全原因,它将生成将其权限降至 _www 的工作进程。控制进程仍然是 root 以便能够产生更多的工作进程。
  • 如果你以 aaron 的身份运行 'bundle install' ,那么一切正常;从 Phusion Passenger 启动的 Rails 应用程序将尝试在 aaron 的主目录中找到宝石,正如它应该做的那样。您的 config.ru 是否也归 aaron 所有?
【解决方案2】:

您可以运行ps aux | grep httpd 来查看正在运行您的 apache 进程的用户。

【讨论】:

  • 添加了上面ps aux | grep httpd的结果。在之前的问题中......为什么会有两个不同的用户运行 httpd 进程?!?
  • 是的。生产。之前运行过一个 Rails 2.3.5 应用程序。试图让 3.0.3 运行,但一切都崩溃了。
【解决方案3】:

这就是我用来检测哪些用户应该运行 rails 应用程序

RAILS_USER=$(stat -c '%U' /YOUR_PATH/environment.rb) 

echo "Detected rails user: $RAILS_USER"

【讨论】:

  • 虽然此代码可以回答问题,但提供有关 如何为什么 解决问题的附加上下文将提高​​答案的长期价值。
猜你喜欢
  • 1970-01-01
  • 2015-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-24
  • 2011-06-22
相关资源
最近更新 更多