我正在將我的LAMP從我的Windows Server遷移到運行Debian 6的VPS。但是,大多數情況都可行,但其中一個PHP腳本無法寫入到其配置的日誌文件。我無法確定爲什麼,所以我寫了一個新的,簡單的,人爲的PHP腳本來測試這個問題。PHP fopen()即使擁有廣泛開放的權限也無法運行
<?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確實是www-data
下運行的Apache2的其中一個子進程。如您所見,我還在腳本中包含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
- 這是一個在OpenVZ下運行的VPS
- ls -l(file):
-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
下運行,而SELinux的沒有安裝下www-data
- 子進程(感謝法比奧提醒我提到這一點)
- 我有重新啓動Apache多次並重新啓動服務器以及
那是我忽略的。 '/ var/log/apache'丟失(r-x),其餘都是正確的。非常感謝。 – Gregyski
得愛這些直覺。 –