如下图,在开发调试的时候会遇到这么一个问题。
file_put_contents时,$tmp_file显示的目标文件是/tmp/xxx.而这个文件实际放在linux的目录却是/tmp/systemd-private-xxxxx-php-fpm.service/xxx(见图二)
为什么会出现这种情况?
只要使用Systemd这个进程作为启动进程的linux系统,其子进程都会有PrivateTmp这么一个属性,用于设置是否使用私有的tmp目录。
那么只要设置使用这个属性的service,都会使用私有的tmp目录。
比如说:
nginx会有一个systemd-private-xxx-nginx.service/tmp目录
php-fpm会有一个systemd-private-xxx-php-fpm.service/tmp目录
使用PrivateTmp属性有什么好处吗?
1. 见下图,/tmp目录一般是所有用户和所有service都共享的,对于所有用户和service来说,都会有写和读的权限。
那么这里会存在安全性的问题。把各个service的tmp目录隔离开的话,可以保证一定的安全性。
2.见下图, 对于每个service的tmp目录,会在服务启动(start)时创建该目录,并且在关闭(stop)服务时删除该目录。如果我们是使用自己定义的临时目录路径的话,就需要我们自己定义相关的维护机制了(如:定期删除这些临时文件等),而使用这个PrivateTmp的话,就不需要我们自己去维护了。
怎么设置这个PrivateTmp属性呢?
打个比方,现在我们要开启 or 关闭 php-fpm 的这个属性。
1. 利用systemctl找到对应的service路径。
2 找到PrivateTmp并修改之。
ps:xx.service这种文件叫做unit文件,systemd把一个服务相关的启动脚本叫做一个unit文件,如果要查看更多service文件的编写规则,可以搜索"systemd unit" or "systemd unit 文件编写" 这类的关键字 or man systemd.unit 。
相关参考:
man systemd.exec 查找PrivateTmp关键字
https://lists.centos.org/pipermail/centos/2015-April/151589.html
http://0pointer.de/blog/projects/security.html