乘客 + nginx:应用程序不在生产模式下运行

Fer*_*ndo 6 nginx ruby-on-rails phusion-passenger

我正在使用Passenger + Nginx 来运行Rails 应用程序。如果我使用“rails_env 开发”;该应用程序运行良好。

但是如果我在生产模式下运行,我会得到“我们很抱歉,但出了点问题。”。

我确实为生产运行了 db:migrate,我可以正常访问数据库。

奇怪的是,我没有在日志中得到任何新条目(nginx 和 rails 之一),而且我确保 nginx 用户可以在它们上面写字。

如果我运行 rails 控制台生产,它工作正常:

# rails console production
Loading production environment (Rails 3.2.0)
1.9.3-p125 :001 > 
Run Code Online (Sandbox Code Playgroud)

关于可能发生什么的任何想法?我还应该检查什么?

- - 编辑 - -

在@BenLee 建议将passenger_debug_log_file 添加到nginx.conf 之后,我开始在开发和生产中遇到此错误:

# /etc/init.d/nginx restart
nginx: the configuration file /opt/nginx/conf/nginx.conf syntax is ok
nginx: [alert] Unable to start the Phusion Passenger watchdog: it seems to have crashed during startup for an unknown reason, with exit code 1 (-1: Unknown error)
nginx: configuration file /opt/nginx/conf/nginx.conf test is successful
Parando o nginx:                                           [  OK  ]
Iniciando o nginx: nginx: [alert] Unable to start the Phusion Passenger watchdog: it seems to have crashed during startup for an unknown reason, with exit code 1 (-1: Unknown error)
                                                           [  OK  ]
Run Code Online (Sandbox Code Playgroud)

我搜索了这个错误,但我仍然没有找到解决方案。看门狗似乎存在并且在正确的位置:

# ls -lh /usr/local/rvm/gems/ruby-1.9.3-p125/gems/passenger-3.0.11/agents/
total 7,8M
drwxr-sr-x 2 root rvm 4,0K Fev 22 23:34 nginx
-rwxr-xr-x 1 root rvm 4,6M Fev 22 23:35 PassengerLoggingAgent
-rwxr-xr-x 1 root rvm 3,3M Fev 22 23:34 PassengerWatchdog
Run Code Online (Sandbox Code Playgroud)

如果我删除passenger_debug_log_file,它会正常启动。但是原来的问题又回来了,应用程序没有在生产模式下运行。

Ben*_*Lee 1

这看起来可能是某种文件损坏,可能位于其中一个代理中。可能有帮助的一件事是重新安装新版本的代理。您可以通过乘客独立包来完成此操作。

为此,首先通过 SSH 连接到服务器,然后在任何目录中(在下面的示例中,我将假设您的主目录,但任何目录都可以)运行:

passenger package-runtime
Run Code Online (Sandbox Code Playgroud)

这似乎需要进行大量的下载、配置和安装,但不要惊慌。要做的就是将乘客独立版本安装在名为 的子目录中passenger-standalone。运行此命令后,您应该看到如下文件结构(假设您在主目录中运行该命令):

+ /home/you
    + passenger-standalone
        + 3.0.11-....
            nginx-x.y.z.tar.gz
            support.tar.gz
Run Code Online (Sandbox Code Playgroud)

所以它只是一棵树,其中有两个 tar.gz 文件(请注意,3.0.11-...不是字面意思,而是以该字符串开头 - 全名取决于系统;类似地,其中x.y.z一个 tar.gz 文件实际上是一个版本数字)。接下来,解压 support.tar.gz,执行如下操作:

cd passenger-standalone/3.0.11-....
tar xzvvf support.tar.gz
Run Code Online (Sandbox Code Playgroud)

这将解压到当前目录。除此之外,它将创建一个agents包含两个新文件的子目录:

+ /home/you
    + passenger-standalone
        + 3.0.11-....
            + agents
                PassengerLoggingAgent
                PassengerWatchdog
Run Code Online (Sandbox Code Playgroud)

我们的想法是将这些代理文件复制到原始系统文件上,以修复系统版本中可能存在的任何损坏。但首先,适当设置权限。从上面命令结束的地方开始,运行:

cd agents
sudo chown root:rvm Passenger*
Run Code Online (Sandbox Code Playgroud)

接下来,备份您的原始代理:

cd /usr/local/rvm/gems/ruby-1.9.3-p125/gems/passenger-3.0.11/agents
sudo cp PassengerLoggingAgent PassengerLoggingAgent.backup
sudo cp PassengerWatchdog PassengerWatchdog.backup
Run Code Online (Sandbox Code Playgroud)

最后,将新版本从独立包移至此处。

sudo mv /home/you/passenger-standalone/3.0.11-..../agents/Passenger* .
Run Code Online (Sandbox Code Playgroud)

然后,重新启动 nginx。如果由于某种原因您需要撤消此操作,只需恢复备份副本并再次重新启动 nginx 即可。

作为可选的清理步骤,您不再需要这些独立文件,因此您可以像这样删除它们:

rm -rf /home/you/passenger-standalone
Run Code Online (Sandbox Code Playgroud)