centos7 apache無法寫入它擁有的文件
我在新的 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 會更安全。