Linux下的服务使用根目录下tmp的问题
最近使用nginx-rtmp-module
测试录制直播视频时,怎么也保存不下来,以下是Nginx的rtmp模块配置:
rtmp {
server{
listen 1935;
# TV mode: one publisher, many subscribers
application mytv {
live on;
# record first 1K of stream
record all;
record_path /tmp/av;
record_max_size 1K;
# append current timestamp to each flv
record_unique on;
}
}
}
运行是没有报错, Nginx日志也是正常的。
原因
出现这个问题是由于 nginx.service
里设置了 PrivateTmp=true
。
关于 PrivateTmp 的设置
采用布尔参数。如果为true,则为执行的进程设置一个新的文件系统命名空间,并在其中装载一个私有/tmp目录,该目录不由命名空间之外的进程共享。这有助于确保对进程临时文件的访问安全,但会使进程之间无法通过/tmp进行共享。默认为false。
如果 PrivateTmp
设置为 true
在nginx启动后, 在/tmp
目录下会出现类似以下名称的文件假
systemd-private-xxxxxxxxxxxxxxxxxxxxxxxxxxx-nginx.service-xxxxxx
在nginx停止后, 该文件夹就会消失。
深层原因
关于为什么设置了 PrivateTmp=true
后, 不能保存到此目录下,找不到相关的文档。猜测是 /tmp
目录下的文件可以被其他进程共享, 从而引起安全性的问题。
解决方案
-
把文件保存到
/tmp
之外的目录。 -
设置
PrivateTmp=false
[Unit] Description=nginx - web server After=network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/usr/local/nginx/logs/nginx.pid ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s stop ExecQuit=/usr/local/nginx/sbin/nginx -s quit PrivateTmp=true [Install] WantedBy=multi-user.target
重启Nginx
# systemctl daemon-reload # systemctl start nginx
引申
如果其他服务 比如 php-fpm或者mysql等服务的文件不能保存到 /tmp
目录下, 也可参考此方法。
参考
https://www.redhat.com/zh/blog/new-red-hat-enterprise-linux-7-security-feature-privatetmp