可以在不重启的情况下使用 nginx 乘客登录 rails 应用程序吗?

Posted

技术标签:

【中文标题】可以在不重启的情况下使用 nginx 乘客登录 rails 应用程序吗?【英文标题】:possible to logrotate rails app with nginx passenger without restart? 【发布时间】:2011-05-11 19:43:42 【问题描述】:

可以在不重新启动 nginx 的情况下进行 logrotate(只需向 nginx 发送 USR1 信号它就可以完成这项工作)。我想知道我的 Rails 应用程序(nginx 乘客)是否有可能。仅仅为了进行 logrotate 就重新启动我的 rails 应用程序是不值得的。

【问题讨论】:

【参考方案1】:

如果您正在谈论 Rails 应用程序日志轮换,您可以通过放置来做到这一点

 config.logger = Logger.new(config.log_path, 10, 1024**2)

在您的环境文件中。第二个参数是您想要保留的 .log 文件的数量,第三个是文件在旋转之前允许达到的大小(以字节为单位)。此配置意味着 10 个 1 兆字节的文件。可能不像 logrotate 那样可配置(不支持压缩等),但它可以让您将所有日志文件保留在应用程序中。这通常对我有用。

还有found this 如果想通过 nginx 坚持日志轮换。

【讨论】:

谢谢,我从来没有意识到 rails 有这个选项。 我个人发现 Rails 日志旋转会被击中或错过。有时,rails 记录器在轮换后会卡在记录到旧文件上。 对此要小心...如果您通过Passenger(即PassengerMinInstances)运行多个Rails实例,并且您的Passenger配置中还设置了PassengerMaxRequests之类的东西,请注意Rails 进程的每个新生成都会创建一个新文件。我们的设置是这样的:“config.logger = Logger.new(config.log_path, 14, 200000000)”,它只保留 1 天的日志,因为 14 个实例会根据负载全天上下旋转,每次创建一个新文件。他们几乎没有达到 200000000 的最大大小。使用 syslog。 请将艾迪的答案标记为正确答案。他的回答比我贴的要好。【参考方案2】:

logrotate 配置很容易搞定

/path/to/rails_apps/*/shared/log/*.log 
  daily
  missingok
  rotate 30
  compress
  delaycompress
  copytruncate

copytruncate 基本上将内容复制到新文件并截断​​旧文件。这消除了重新启动的需要。

【讨论】:

我想知道为什么没有 postrotate 脚本可以告诉。这有什么问题吗? 我的生产服务器采用这种配置......一切运行良好。 谢谢大家,如果需要指定日志文件的大小,请使用size 100M

以上是关于可以在不重启的情况下使用 nginx 乘客登录 rails 应用程序吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不延迟任务的情况下优雅地重启 Celery

我们可以在不重新加载页面的情况下重置 r 中的页面或对象吗

如何在不使用命令的情况下以编程方式关闭/重启 linux 机器(运行时)

如何在不重启Yarn服务的情况下启用DEBUG日志记录

nginx重启命令方法(linux,centos,ubuntu)总结

在不关闭 MacOS 的情况下重启终端