Centos8 使用 Nginx 架設 Laravel 錯誤 Permission denied

Jerry Chen
Sep 13, 2021

想說 Permission denied 是常見的錯誤所以沒有想太多,認為更改權限就可以解決,但這一次的 Permission denied 跟 SELinux 有關係,所以花了一些時間處理。

Nginx、Laravel 安裝完成後,想說先將更改 storage 權限讓網站可以運行,但下完目錄權限命令後仍然顯示錯誤 Permission denied,於是朝 SELinux 方向找答案。

chown -R nginx:nginx storage bootstrap/cache
chgrp -R nginx storage bootstrap/cache
chmod -R 775 storage bootstrap/cache

查詢 SELinux 是否為開啟狀態以及目前的模式

sestatus

SELinux 模式可區分為 Enforcing (強制模式)、Permissive (寬容模式) 以及 Disabled (停用模式),預設狀況下應該是 Enforcing,所以在伺服器上有比較多的限制。

當然錯誤 Permission denied 可以直接將 SELinux 改成 Disabled 就解決,不過這種方式有比較多的安全隱患,建議不要這樣修改。

那該怎麼解決?因為 Nginx 對應的 user、group 均為 nginx,其預設目錄為 /usr/share/nginx/html/,我們需要先將預設目錄改成專案架設的目錄 /var/www/html/。

chcon -R --reference=/usr/share/nginx/html/ /var/www/html/
chcon -R -t httpd_sys_content_t /var/www/html/

將 httpd_t 添加到許可網域列表,瀏覽網站可以看到錯誤 Permission denied 消失囉。

semanage permissive -a httpd_t

註一. 想直接關閉 SELinux 怎麼關?
修改 /etc/selinux/config 狀態為 Disabled 然後重新開機即可。

註二. 有修改 SELinux 不用重新開機的方式嗎?
有,但相對的修改僅限於此次開機,下次重開機後 SELinux 仍然會恢復預設值,使用 setenforce 切換 0 (暫時停用) / 1(暫時啟用)。

註三. 如何從許可網域列表移除 httpd_t?
輸入 semanage permissive -d httpd_t

註四. 都照做了還是 Permission denied 怎麼辦?
如果是 Nginx 的話請檢查 /etc/php-fpm.d/www.conf 內的 user 跟 group 是否設定為 nginx

--

--