Permissions

centos7 apache無法寫入它擁有的文件

  • July 30, 2020

我在新的 centos7 上安裝了 httpd 和 php,並將一些文件放入 /var/www/html,包括我編寫的安裝腳本。該腳本需要寫入 /var/www/html 目錄中的配置文件。我創建了一個空的配置文件並將其改名為 apache:apache。但是,嘗試使用寫訪問權限打開此文件總是會出現錯誤:

fopen(/var/www/html/config-local.php): failed to open stream: Permission denied

在做研究時,我讀到了這句話:“為了訪問一個文件,所有父目錄都必須是可讀的。” 所以我檢查了,他們是。/、/var、/var/www 和 /var/www/html 所有人都可以閱讀。

那麼這裡發生了什麼?似乎 apache 使用者是某種特別受限的使用者,因為使用標準使用者測試相同的場景可以正常工作。

這可能是 SELinux 權限問題。/var/log/audit/audit.log應該可以確認。

SELinux 上下文可能是system_u:object_r:httpd_sys_content_t:s0,但應該是system_u:object_r:httpd_sys_rw_content_t:s0。這可以用 更改chcon


我對在DocumentRoot您的網路伺服器中擁有一個配置文件也不樂觀。我可能會誤認為您沒有提供足夠的詳細資訊,但如果您沒有更改預設值,情況就是如此。

花了很多時間尋找這個答案,但它都是零碎的,沒有人每個人都發布解決方案(大部分時間)所以這是我的解決方案,它也用於各種 Web 控制面板。

安裝和使用 MOD_RUID2

使用 CLI 安裝 PHP(這是較新版本的標準)

在虛擬主機的 HTTPD.CONF 文件中,您將添加以下內容,將 username 替換為使用者的登錄名,將 usergroup 替換為使用者組(這些通常相同)

<IfModule !mod_ruid2.c>
   SuexecUserGroup username usergroup
</IfModule>
<IfModule mod_ruid2.c>
   RMode config
   RUidGid username usergroup
   RGroups @none
</IfModule>

虛擬主機配置的一個範例是:

<VirtualHost *:443>
 DocumentRoot "/home/imtheuser/public_html"
 ServerName imtheuser.com
 <IfModule !mod_ruid2.c>
   SuexecUserGroup imtheuser imtheuser
 </IfModule>
 <IfModule mod_ruid2.c>
   RMode config
   RUidGid imtheuser imtheuser
   RGroups @none
 </IfModule>
 <Directory "/home/imtheuser/public_html">
   allow from all
   Options None
   Require all granted
 </Directory> 
</VirtualHost>

這將允許 apache/php 寫入使用者擁有的目錄。將 chmod 設置為 0777 會更安全。

引用自:https://serverfault.com/questions/858675