如何管理造成停工的乘客陈旧工人

时间:2016-02-12 05:33:57

标签: ruby-on-rails nginx ubuntu-14.04 passenger

我在ubuntu 14.04计算机上运行了一个rails应用程序,它由Nginxpassenger提供服务。有时候应用程序出现故障会出现以下错误

[ agents/LoggingAgent/Main.cpp:338 ]: Signal received. Gracefully shutting down... (send signal 2 more time(s) to force shutdown)
[ agents/LoggingAgent/Main.cpp:400 ]: Received command to shutdown gracefully. Waiting until all clients have disconnected...
[ ServerKit/Server.h:453 ]: [LoggerAdminServer] Shutdown finished
[ agents/LoggingAgent/Main.cpp:425 ]: PassengerAgent logger shutdown finished
[ ServerKit/Server.h:453 ]: [ServerThr.1] Shutdown finished
[ ServerKit/Server.h:453 ]: [ServerThr.2] Shutdown finished
[ ServerKit/Server.h:453 ]: [AdminServer] Shutdown finished
[ agents/HelperAgent/Main.cpp:724 ]: Disconnecting long-running connections for process 19431, application /public#default
[ agents/HelperAgent/Main.cpp:724 ]: Disconnecting long-running connections for process 19440, application /public#default
[ agents/Watchdog/Main.cpp:1255 ]: Starting PassengerAgent watchdog...
[ agents/HelperAgent/Main.cpp:883 ]: Starting PassengerAgent server...
[ agents/HelperAgent/Main.cpp:232 ]: PassengerAgent server running in multi-application mode.
[ agents/HelperAgent/Main.cpp:637 ]: PassengerAgent server online, PID 19637
[ agents/LoggingAgent/Main.cpp:431 ]: Starting PassengerAgent logger...
[ agents/LoggingAgent/Main.cpp:312 ]: PassengerAgent logger online, PID 19645
[ agents/HelperAgent/Main.cpp:868 ]: PassengerAgent server shutdown finished

除非重新启动Nginx,否则应用程序将保持关闭状态。这可能是由于陈旧的工人不再服务而且吃掉了记忆(如果我错了,请纠正我)。

我已将乘客max pool size设置为6,因为我的应用实例需要150-200 Mb内存2GB RAM

我正在考虑编写一个脚本,定期检查过时的工作人员,如果找到则重新启动Nginx或执行touch tmp/restart.txt。我还想知道如何检查过时的工作人员,或者passenger是否按预期工作。

我认为另一个解决方案是定期重新启动Nginx或定期执行touch tmp/restart.txt,比如说一小时。

我还阅读了有关重启应用程序的三种方法的乘客文档

  • passenger-config restart-app

  • restart.txt

  • 重新启动Nginx

前两个案例在重新启动应用时不会丢弃任何请求但在重启应用时可能没有停机时间,因为重启应用可能需要一些时间,具体取决于应用。

我想知道哪种方式是好方法,还是有其他方法可以摆脱这个问题。

1 个答案:

答案 0 :(得分:0)

首先,您应该检查passenger configuration options。其次,你应该弄清楚你的乘客是什么。为此,有一个乘客日志参数(您可以监控),因为您似乎并不确定这些流程中发生了什么。 :)

现在关于手头的第一个问题 - 你希望强制工人重新启动 - 如果这实际上是由于进程在没有做任何事情时挂起:你可以组合

passenger_min_instances
passenger_max_instances

passenger_pool_idle_time / passenger_max_requests

在给定链接上阅读一些关于这些命令的内容,它会更详细。