Asked Oct 2nd, 2020 5:40 a.m. 954 1 1
  • 954 1 1
+4

[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

Share
  • 954 1 1

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 ANSWERS


Answered Oct 2nd, 2020 6:49 a.m.
+5

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 😄

Share
Avatar Quảng Ngô Văn @nvquang1312
Oct 2nd, 2020 7:39 a.m.
Avatar Quảng Ngô Văn @nvquang1312
Oct 2nd, 2020 7:40 a.m.
Avatar Quảng Ngô Văn @nvquang1312
Oct 2nd, 2020 7:41 a.m.
Avatar iamfresher @benkyou
Oct 2nd, 2020 1:39 p.m.

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ỉ.

0
| Reply
Share
Avatar Minh Tuấn Ngụy @minhtuan.nguy
Oct 2nd, 2020 2:58 p.m.

@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

+1
| Reply
Share
Viblo
Let's register a Viblo Account to get more interesting posts.