php通过nginx访问时在/tmp/systemd-private-nABCDE/tmp中有自己的/tmp

Posted

技术标签:

【中文标题】php通过nginx访问时在/tmp/systemd-private-nABCDE/tmp中有自己的/tmp【英文标题】:Php has its own /tmp in /tmp/systemd-private-nABCDE/tmp when accessed through nginx 【发布时间】:2015-08-07 07:44:29 【问题描述】:

我发现有关 php/tmp 文件夹的奇怪行为。当 PHP 与 /tmp 一起使用时,它会使用另一个文件夹。 php 5.6.7、nginx、php-fpm。

我以两种方式执行相同的脚本:通过浏览器和通过 shell。但是当它通过浏览器启动时,文件不在真正的/tmp文件夹中:

<?php
$name = date("His");

echo "File /tmp/$name.txt\n";

shell_exec('echo "123" > /tmp/'.$name.'.txt');

var_dump(file_exists('/tmp/'.$name.'.txt'));

var_dump(shell_exec('cat /etc/*release | tail -n 1'));

php -f script.php

File /tmp/185617.txt
bool(true)
string(38) "CentOS Linux release 7.0.1406 (Core)

文件在哪里?在 /tmp

$ find / -name 185617.txt
/tmp/185617.txt

如果通过http://myserver.ru/script.php 访问它,我会得到

File /tmp/185212.txt
bool(true)
string(38) "CentOS Linux release 7.0.1406 (Core)

但是文件在哪里?

$ find / -name 185212.txt
/tmp/systemd-private-nABCDE/tmp/185212.txt

为什么php认为/tmp应该在/tmp/systemd-private-nABCDE/tmp中?

【问题讨论】:

【参考方案1】:

因为systemd is configured to give nginx a private /tmp。如果您出于某种原因必须改用系统 /tmp,则需要修改 .service 文件以读取“PrivateTmp=no”。

【讨论】:

你是对的,但那是php-fpm,而不是nginx。我将文件/usr/lib/systemd/system/php-fpm.servicePrivateTmp=true 更改为PrivateTmp=false。现在 php 使用正确的/tmp 文件夹。 哇,这太棒了。正确的我们从 2 天开始搜索的内容:) 请考虑此更改的安全隐患。 /tmp 可能包含敏感信息,所有 php 脚本都可以突然访问该信息。 如果您的系统没有系统子文件夹怎么办?会不会是别的地方? @Scott find / -type f -name 'php-fpm.service'。您很可能需要以 sudo/root 身份运行它,但它会递归定位从名为 php-fpm.service 的根 (/) 目录开始的任何文件。【参考方案2】:

如果您在服务器上运行多个站点,那么我认为您希望保留 PrivateTmp=yes,以便每个站点即使在使用临时文件时也保持隔离。否则可能是一个安全问题,我想。

【讨论】:

【参考方案3】:

Ignacio Vazquez-Abrams 有正确答案,但让我添加我的功能解决方案。

我尝试了“multi-user.target.wants”解决方案,它可以工作,但在重新启动后,但在某些时候,PrivateTmp 会恢复为真。 就像我对 Apache2 的主要用途是 PHP 一样,我最终编辑了 php.ini 并取消了 sys_temp_dir 行的注释。

默认情况下,系统使用由函数 sys_get_temp_dir 分配的临时目录。函数 sys_get_temp_dir 将返回“/tmp”,但事实是您的 tmp 文件存储在某个路径,例如 /tmp/systemd-private-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-apache2.service-YYYYYY//tmp/*。所以,对我有用的是:

编辑 php.ini(路径可以在 PHP 版本之间更改)

sudo nano /etc/php/7.2/cli/php.ini

然后取消注释 sys_temp_dir 行

; Directory where the temporary files should be placed.
; Defaults to the system default (see sys_get_temp_dir)
sys_temp_dir = "/tmp"

【讨论】:

可以从/proc/sys/kernel/random/boot_id 读取XXX,但您从哪里获得YYY?

以上是关于php通过nginx访问时在/tmp/systemd-private-nABCDE/tmp中有自己的/tmp的主要内容,如果未能解决你的问题,请参考以下文章

plupload 运行时在尝试访问 upload.php 时返回 403 FORBIDDEN 错误

解析 PHP 文件时在浏览器中启用错误

在 Ubuntu 上使用 nginx 和Passenger 时在哪里放置环境变量

一台机linux器装nginx一台装PHP,怎么能够用nginx访问php页面?

linux环境下nginx链接不上fpm

安装nginx+php后,Php页面访问时提示404,但页面是存在的.