Ruby on Rails应用迁移至Debian10后写入/tmp目录异常求助
Debian 10下Rails+Passenger写入/tmp文件不可见的排查思路
检查systemd私有tmp目录设置
Debian 10开始部分服务默认启用PrivateTmp=true,会给Apache/Passenger进程分配独立的私有/tmp,和系统全局/tmp不共享:- 查看Apache的systemd服务文件:
cat /lib/systemd/system/apache2.service,查找PrivateTmp配置项 - 若存在
PrivateTmp=true,注释该行后执行systemctl daemon-reload && systemctl restart apache2 - 可在Rails代码中临时添加调试代码确认实际tmp路径:
puts Dir.tmpdir,查看输出是否为全局/tmp
- 查看Apache的systemd服务文件:
排查AppArmor权限限制
Debian 10默认启用AppArmor,可能限制Apache进程对/tmp的访问:- 检查AppArmor状态:
aa-status,确认是否存在apache2的profile - 查看Apache的AppArmor规则文件:
cat /etc/apparmor.d/usr.sbin.apache2,确认是否允许对/tmp/** rw,的访问权限,若缺失则添加后重启AppArmor:systemctl restart apparmor
- 检查AppArmor状态:
检查Passenger的tmp目录配置
Passenger可能自定义了临时目录,导致写入的文件不在系统/tmp:- 查看Apache配置文件(如
/etc/apache2/sites-available/your_app.conf或passenger.conf),查找PassengerTempDir配置项 - 若设置了该参数,进程会使用指定目录而非系统/tmp,可修改为
/tmp或直接注释该行后重启Apache
- 查看Apache配置文件(如
验证进程的chroot环境
若Apache或Passenger配置了chroot,进程看到的/tmp是chroot根目录下的子目录:- 检查Apache配置中是否有
Chroot指令,或Passenger配置是否有PassengerChroot参数 - 若启用了chroot,需在chroot目录内创建可写的/tmp目录,或取消chroot配置
- 检查Apache配置中是否有
排除系统自动清理机制
Debian 10的systemd-tmpfiles会定期清理/tmp文件,默认清理10天未访问的文件,若刚创建的文件就消失可排除此情况;若需确认,查看清理规则:cat /etc/tmpfiles.d/tmp.conf,检查是否有异常的清理策略
内容的提问来源于stack exchange,提问作者me1960
相关产品推荐
相关产品推荐

