2011-09-08 26 views
9

我正在將我的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多次並重新啓動服務器以及

回答

13

請記住,爲了達到文件,所有父目錄必須可以通過www-data讀取。你strace輸出似乎表明,即使訪問/var/log/apache2/writetest失敗。確保WWW的數據對以下目錄權限:

  • / (r-x)
  • /var (r-x)
  • /var/log (r-x)
  • /var/log/apache2 (r-x)
  • /var/log/apache2/writetest (rwx)
  • /var/log/apache2/writetest/writetest.log (rw-)
+1

那是我忽略的。 '/ var/log/apache'丟失(r-x),其餘都是正確的。非常感謝。 – Gregyski

+1

得愛這些直覺。 –

0

執行寫作的PHP文件是否有適當的權限設置?嘗試改變這些,看看是否是這個問題。

+0

權限是'0666',如他的strace所示 – Cyclone

+0

我在帖子中沒有看到?我發現.log文件是0666和包含文件夾,但沒有寫入.php文件的權限。 – Adam

+0

如果php文件可以運行,它應該不能寫入文件,那麼如果其他文件的權限是準確的? – Cyclone

0

可能是SELinux問題,即使Debian沒有在默認安裝中發佈它,您的提供者可能已啓用它。尋找在/var/log消息與

grep -i selinux /var/log/{syslog,messages} 

如果是這樣的原因,你需要禁用它,這裏有說明:查找文件/etc/selinux/config,在這裏它的默認內容。將SELINUX指令更改爲disabled並重新引導系統。

# This file controls the state of SELinux on the system. 
# SELINUX= can take one of these three values: 
# enforcing - SELinux security policy is enforced. 
# permissive - SELinux prints warnings instead of enforcing. 
# disabled - SELinux is fully disabled. 
SELINUX=disabled 
# SELINUXTYPE= type of policy in use. Possible values are: 
# targeted - Only targeted network daemons are protected. 
# strict - Full SELinux protection. 
SELINUXTYPE=targeted 
+0

謝謝你的建議和如何檢查的絕佳解釋,但selinux絕對沒有安裝。我曾經檢查過,但忘記在我的問題中提到它。但我已經看到其他人是誰的原因,所以希望你的回答將在未來幫助其他人。 – Gregyski

相關問題