В настоящее время я переношу свою LAMP с моего Windows Server на VPS с Debian 6. Почти все работает, однако один из сценариев PHP не смог записать в сконфигурированный файл журнала.Я не мог определить, почему, поэтому я написал новый, простой, PHP-скрипт для проверки проблемы.
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
echo exec('whoami');
$log = fopen('/var/log/apache2/writetest/writetest.log', 'a');
if ($log != NULL)
{
fflush($log);
fclose($log);
$log = NULL;
}
?>
Однако, это не дает результата:
www-data Warning: fopen(/var/log/apache2/writetest/writetest.log): failed to open stream: Permission denied in /var/www/_admin/phpwritetest.php on line 5
- Хотя я никогда не делал бы это нормально, чтобы помочь в диагностике, я установил
/var/log/apache2/writetest/writetest.log
на chmod 777. - И каталог, и файл принадлежат
www-data:www-data
. - Файл был создан с помощью
touch
.
Я запустил strace
, чтобы проверить, какой процесс выполнял открытие:
[pid 21931] lstat("/var/log/apache2/writetest/writetest.log", 0x7fff81677d30) = -1 EACCES (Permission denied)
[pid 21931] lstat("/var/log/apache2/writetest", 0x7fff81677b90) = -1 EACCES (Permission denied)
[pid 21931] open("/var/log/apache2/writetest/writetest.log", O_RDWR|O_CREAT|O_TRUNC, 0666) = -1 EACCES (Permission denied)
Я проверил иpid 21931 действительно был одним из дочерних процессов apache2, работающих под www-data
.Как вы можете видеть, я также включил echo exec('whoami');
в скрипт, который подтвердил, что скрипт запускался www-data
.
Другие примечания:
- PHP не работает в безопасном режимережим
- PHP
open_basedir
не установлен - Информация о версии:
Apache/2.2.16 (Debian) PHP/5.3.3-7+squeeze3 with Suhosin-Patch mod_ssl/2.2.16 OpenSSL/0.9.8o
- uname -a:
2.6.32-238.19.1.el5.028stab092.2 #1 SMP Thu Jul 21 19:23:22 MSD 2011 x86_64 GNU/Linux
- Это на VPSработает под OpenVZ
- ls -l (файл):
-rwxrwxrwx 1 www-data www-data 0 Sep 8 18:13 writetest.log
- ls -l (каталог):
drwxr-xr-x 2 www-data www-data 4096 Sep 8 18:13 writetest
- родительский процесс Apache2 работает под
root
,и дочерние процессы под www-data
- selinux не установлены (спасибо Фабио за напоминание мне упомянуть об этом)
- Я много раз перезапускал apache и также перезагружал сервер