it-swarm.com.ru

Php имеет свой собственный/tmp в/tmp/systemd-private-nABCDE/tmp при доступе через nginx

Я обнаружил странное поведение в отношении папок php и /tmp. Php использует другую папку, когда работает с /tmp. Php 5.6.7, nginx, php-fpm. 

Я выполняю один и тот же скрипт двумя способами: через браузер и через оболочку. Но когда он запускается через браузер, файл не находится в реальной папке /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)

Где файл? В/тмп

$ 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?

17
shukshin.ivan

Потому что systemd настроен так, чтобы дать nginx приватный/tmp . Если вы по какой-то причине должны использовать system/tmp, вам нужно изменить файл .service так, чтобы он читал "PrivateTmp = no".

31
Ignacio Vazquez-Abrams

Если вы используете несколько сайтов на сервере, то я думаю, что вы захотите оставить PrivateTmp = yes, чтобы каждый сайт оставался разделенным даже при использовании временных файлов. В противном случае я мог бы представить себе проблему безопасности.

1
Artis