[Cầu cứu] Hỏi về lỗi storage/logs/laravel.log" could not be opened: failed to open stream: Permission denied trong Laravel
Chào các anh chị.
Em tiến hành deploy trên centos 8.
Webserver em dùng Nginx
Như nhiều tutorial, em có tiến hành chown quyền cho user nginx, chmod các thư mục trong storage...
Nhưng khi em chạy lên vẫn gặp lỗi
storage/logs/laravel.log" could not be opened: failed to open stream: Permission denied.
Em thử ls -la
Thì thấy không hề có vấn đề về chmod.
Mò thêm 1 lúc, em thấy centos của em đang enable mode SELinux, em thử disable thì nó chạy.
E đang hơi khó hiểu về SELinux, em đã đọc qua về SELinux nhưng vẫn chưa tự giải thích được.
Anh chị nào hiểu vấn đề này, mong chỉ giáo giúp em ạ.
Em xin cảm ơn.
1 CÂU TRẢ LỜI
SELinux có 3 chế độ là
- Enforcing: SELinux allows access based on SELinux policy rules.
- Permissive: SELinux only logs actions that would have been denied if running in enforcing mode.
- Disabled: No SELinux policy is loaded.
Mặc định trên CentOS sẽ bật SELinux ở chế độ Enforcing, ở chế độ này nó mặc định chặn quyền ghi vào thư mục storage của Laravel, vậy nên bạn tắt nó đi thì sẽ hết bị lỗi, tuy nhiên bạn không nên tắt SELinux như vậy, khá là nguy hiểm.
Thay vì bạn tắt SELinux thì bạn cần cấu hình lại cho SELinux với thư mục storage của Laravel
Sử dụng module httpd_sys_rw_content_t
của SELinux sẽ cho phép ghi log trong Laravel thông qua http
sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/site/laravel/storage(/.*)?"
sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/site/laravel/bootstrap/cache(/.*)?"
Về module kia bạn có thể đọc thêm tại https://www.disk91.com/2015/technology/systems/move-your-httpd-apache-files-on-centos-7/ Chúc may mắn
Cảm ơn câu trả lời của @minhtuan.nguy
Mặc định trên CentOS sẽ bật SELinux ở chế độ Enforcing, ở chế độ này nó mặc định chặn quyền ghi vào thư mục storage của Laravel
Cái này thì mình có đọc trên stackoverflow cũng hiểu qua và fix theo cách la lá của bạn rồi.
Tham khảo: https://stackoverflow.com/questions/37257975/permissions-issue-with-laravel-on-centos
Nhưng do chưa hiểu kĩ lắm nên mình mới đăng lên để nhờ giải đáp.
Bạn có thể nói rõ hơn tại sao SELinux lại chặn. và chỉ chặn storage ko?
Nói rộng ra một chút, mình muốn hiểu rõ hơn là đối tượng nào(folder và file ) dạng như thế nào sẽ bị chặn ghi bạn nhỉ.
@benkyou vì SELinux được bật có 1 cái gọi là httpd_selinux
, cái này mặc định nó sẽ cho phép đọc nội dung của tệp nhưng mà lại không cho phép ghi, ngay cả khi bạn cấp quyền ghi trên Linux. SELinux policy sẽ quy định tiến trình nào có thể ghi vào tệp hay không. Vậy nên mình cần phải cấu hình SELinux policy để đảm bảo hệ thống được an toàn
Bạn có thể đọc thêm tại đây nhé https://linux.die.net/man/8/httpd_selinux