systemd
服务的PrivateTmp
php-fpm
选项会影响对文档根目录之外的文件的写访问。
例如红帽企业 Linux 9 和 PHP 8.2.13
例如,如果
var/tmp/myApp
(例如)用于需要在重新启动后继续存在的临时文件,则如果为 true,则将阻止写入访问,否则将允许写入访问。
systemd
手册描述了如何使用和安装特定于进程的子树,而不是普通的/tmp
。 它还指的是var/tmp
,但我还没有看到任何证据表明这种情况发生。 如果确实如此,这不是矛盾吗 - 因为 /tmp
在启动时被清除?
因为出于安全原因我希望文档根目录中的所有文件都是只读的,所以应该如何配置
php.ini
和 php-fpm
服务以允许对其他路径进行写访问,例如 /var/tmp/myApp
和 PrivateTmp
=真的吗?
在重新启动后仍然存在的临时文件
这是矛盾的。如果您需要文件在重新启动后仍然存在,那么根据定义,它们不是临时的。
解决此问题的一般机制是将文档根目录设置为项目根目录下一级,然后在项目根目录中使用特定于项目的“临时”目录。例如,考虑这个项目的目录布局:
.
├── log
│ └── 20240904.log
├── public
│ ├── images
│ │ └── logo.png
│ ├── index.php
│ └── js
│ └── app.js
├── src
│ ├── Model
│ │ └── User.php
│ └── Service
│ └── Foo.php
└── var
└── cache
└── abcde
如果您现在将文档根目录指向
public
子目录,那么 Web 服务器进程将只能访问该点以下的文件,这些文件将直接提供给客户端。其他所有内容,包括 PHP 源代码,都位于文档根目录之外,并且 Web 服务器甚至不知道它的存在。
但是 php-fpm 进程(至少应该)作为与 Web 服务器进程不同的用户运行,因此您现在可以单独控制访问。例如,Web 服务器用户仅具有对
public
的读取访问权限,而 php-fpm 用户将对 var/cache
具有写入访问权限。这将允许您的 PHP 代码任意读取/写入 var/cache
中的文件,这些文件将在重新启动后继续存在,但 Web 客户端将永远无法通过某些 url(如 http://yoursite.com/var/cache/abcde
)直接请求这些文件。