You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails应用日志轮转后新日志属root而非apps用户的技术咨询

解决Rails日志轮转后新文件属主为root的问题

你的问题核心在于:Rails通过Passenger以apps用户运行,但日志轮转生成的新文件却归属root。这大概率是进程运行身份、目录权限或是否混用系统logrotate工具导致的,下面分情况给出解决方案:

先确认核心前提:Rails进程的运行用户

首先得确保Passenger真的在以apps用户运行你的Rails进程,否则后续配置都无效。你可以用这条命令检查:

ps aux | grep rails

看输出里的用户列,如果不是apps,需要先修正Passenger配置:在你的Nginx站点配置中添加passenger_user apps;,然后重启服务:

sudo systemctl restart nginx
passenger-config restart-app /path/to/your/rails/app

情况1:仅使用Rails自带的Logger轮转(你的当前配置)

Ruby标准库的Logger由Rails进程创建和管理,正常情况下新日志文件的属主应该和进程用户一致(即apps)。如果出现root属主,可能是以下原因:

日志目录/初始日志文件权限问题

如果log目录或初始的production.log是root用户创建的,可能会导致轮转时出现权限继承异常。你可以先修复目录和文件的属主:

# 递归修改log目录下所有文件的属主为apps
sudo chown -R apps:apps /path/to/your/rails/app/log
# 设置目录权限为755,确保apps用户能读写
sudo chmod 755 /path/to/your/rails/app/log

之后手动删除当前日志文件,重启Passenger让Rails重新创建日志,再触发轮转(比如往日志中写入大量内容),检查新文件属主是否正常。

额外:显式指定日志文件权限

你还可以在production.rb中配置Logger时,明确指定文件权限,避免后续出现权限问题:

config.logger = Logger.new(
  config.paths["log"].first,
  3,
  10.megabytes,
  mode: 0664  # 确保apps用户拥有读写权限
)

情况2:混用了系统logrotate工具

如果你的服务器上还配置了系统logrotate(比如/etc/logrotate.d/下有针对你应用的配置),由于logrotate默认以root用户运行,切割后的文件自然会归属root。这种情况下,你需要修改logrotate配置,让它以apps用户身份执行:

编辑对应的logrotate配置文件(比如/etc/logrotate.d/your-rails-app),添加su apps apps行:

/path/to/your/rails/app/log/production.log {
  daily
  rotate 7
  missingok
  notifempty
  compress
  delaycompress
  su apps apps  # 指定用apps用户执行切割,新文件属主即为apps
}

先测试配置是否正确:

sudo logrotate -d /etc/logrotate.d/your-rails-app

如果没有报错,手动执行一次切割验证效果:

sudo logrotate -f /etc/logrotate.d/your-rails-app

最后验证

完成上述步骤后,重启Passenger,然后触发一次日志轮转(比如写满10M日志,或手动修改日志文件大小模拟),检查新生成的日志文件属主:

ls -l /path/to/your/rails/app/log/

如果显示apps apps就说明问题解决了。

内容的提问来源于stack exchange,提问作者Luke Smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:52:50