Cách khắc phục Lỗi: không thể mở laravel.log?


183

Thực tế, tôi khá mới ở laravel và tôi đang cố gắng tạo dự án đầu tiên của mình. vì một số lý do tôi tiếp tục gặp lỗi này (tôi thậm chí chưa bắt đầu viết mã)

Error in exception handler: The stream or file "/var/www/laravel/app/storage/logs/laravel.log" could not be opened: failed to open stream: Permission denied in /var/www/laravel/bootstrap/compiled.php:8423

Tôi đã đọc điều này có liên quan đến quyền nhưng chmod -R 775 storagekhông giúp được gì cả.

Quyền


Bạn có chắc là bạn đang ở đúng thư mục khi chạy lệnh chmod đó? Hãy thử chmod -R 755 / var / www / laravel / app / Storage. Ngoài ra, người dùng và nhóm được đặt là gì? Hãy thử ls -al / var / www / laravel / app / Storage
Ryan LaBarre

cùng kết quả (Tôi đã cập nhật bài viết gốc của mình để hiển thị các quyền của thư mục)
FRR

: / vì một số lý do, nó vẫn không hoạt động. Tôi đã không đề cập đến nó trước đây, nhưng tôi đang sử dụng vagrant. vì vậy thư mục www của tôi nằm trên VM (apache, php và mọi thứ khác đang chạy trên nó). Tôi không chắc điều đó có liên quan gì không nhưng tôi nghĩ tôi sẽ đề cập đến nó trong trường hợp này. (Tôi đang tạo dự án của mình với vm, sử dụng trình soạn thảo)
FRR

13
Những người đề xuất 777, hãy thử google cụm từ này: "sản xuất db_password filetype: env inurl: com"
Tarasovych

1
Vô hiệu hóa SELINUX làm việc cho tôi.
Prakash P

Câu trả lời:


305

Không bao giờ đặt thư mục thành 777 . bạn nên thay đổi quyền sở hữu thư mục. vì vậy hãy đặt người dùng hiện tại của bạn rằng bạn đã đăng nhập với tư cách là chủ sở hữu và người dùng máy chủ web (www-data, apache, ...) làm nhóm. Bạn có thể thử điều này:

sudo chown -R $USER:www-data storage
sudo chown -R $USER:www-data bootstrap/cache

sau đó để thiết lập quyền thư mục hãy thử điều này:

chmod -R 775 storage
chmod -R 775 bootstrap/cache

Cập nhật:

Người dùng và nhóm máy chủ web phụ thuộc vào máy chủ web và hệ điều hành của bạn. để tìm ra những gì người dùng và nhóm máy chủ web của bạn sử dụng các lệnh sau. để sử dụng nginx:

ps aux|grep nginx|grep -v grep

để sử dụng apache:

ps aux | egrep '(apache|httpd)'


4
cảm ơn! Nói tóm lại, bạn cũng có thể làm:sudo chown -R {your current user}:www-data storage bootstrap/cache
Ramesh Pareek

2
@RameshPareek Bạn nói đúng nhưng tôi chỉ muốn rõ ràng hơn;)
Hamid Parchami

1
Điều này không làm việc cho tôi. Tôi chỉ nhận được chown: www-data: illegal group name. Đặt thư mục thành 777 là điều duy nhất hoạt động
Matt D

3
@MattD Tôi đoán nhóm apache trên mac đang _wwwthử cái này sudo chgrp -R _www bootstrap/cache. sẽ rất hữu ích khi xem bài đăng này: stackoverflow.com/a/6419695/2125114
Hamid Parchami

3
Đây phải là câu trả lời được lựa chọn, 100% đồng ý rằng sysadins không nên chỉ cho phép truy cập vào mọi thứ để tránh giải quyết vấn đề thực sự.
HyperionX

134

Không bao giờ sử dụng 777 cho các thư mục trên máy chủ trực tiếp của bạn, nhưng trên máy của riêng bạn, đôi khi chúng tôi cần thực hiện hơn 775, vì

chmod -R 775 storage

Có nghĩa

7 - Owner can write
7 - Group can write
5 - Others cannot write!

Nếu máy chủ web của bạn không chạy như Vagrant, nó sẽ không thể ghi vào nó, vì vậy bạn có 2 tùy chọn:

chmod -R 777 storage

hoặc thay đổi nhóm thành người dùng máy chủ web của bạn, giả sử nó www-data:

chown -R vagrant:www-data storage

Không cần chmod trong trường hợp của tôi vì nó đã được đặt ổn rồi, tuy nhiên trên Fedora 20 thì cần:chown -R apache:apache laravelproject
misterjaytee

Đã có vấn đề gắn thư mục thông qua samba / vagrant - chown -R vagrant:www-data storageđã làm điều đó cho tôi, cảm ơn.
Lewis

1
Chmod -R 777 lưu trữ làm việc cho tôi. Tôi đã cố gắng thay đổi nhóm, nhưng tôi vẫn nhận đượcwww-data: illegal group name
Matt D

57

Để khắc phục sự cố này, bạn cần thay đổi quyền sở hữu thư mục thành người dùng unix mà máy chủ web sử dụng.

  1. Thoát khỏi VM
  2. Sử dụng bảng điều khiển, đi đến thư mục được đồng bộ hóa của bạn (vagrant)
  3. sudo chown -R $ USER: lưu trữ dữ liệu www
  4. chmod -R 775 lưu trữ

Mặc dù tôi đã tạo dự án trong VM bằng người dùng VM, thư mục thuộc về người dùng trong máy tính thật; vì vậy, khi cố gắng

Bây giờ nó đang hoạt động.

Cảm ơn tất cả những người đã giúp tôi tìm ra điều này

BIÊN TẬP:

Trên thực tế, nó vẫn không hoạt động, nó vẫn cho tôi một vấn đề "cho phép bị từ chối".

Đây là những gì tôi đã làm, tôi đã sửa đổi Vagrantfile của mình như thế này:

config.vm.synced_folder "./app","/var/www/", create:true,
:owner => "vagrant",
:group => "www-data",
:mount_options => ["dmode=775","fmode=664"]

Tôi đã làm điều đó ... và tôi rất vui! Vẫn không hoạt động ... laravel 5 ... đã đổi tên tệp nhật ký, laravel đã tạo một lỗi mới ... cùng một lỗi
ied3vil

1
Tôi không có config.vm.synced_folder vì tôi đang sử dụng homestead, làm cách nào để khắc phục vấn đề này?
oleynikd

21
Bạn không nên sử dụng 777 tất cả willy nilly.
IIllIIll

Tôi không thấy vấn đề gì khi sử dụng 777 trên một thư mục Tôi biết chính xác những gì bên trong (một dự án mẫu giả)
FRR

2
Điều này tuyệt đối không nên là câu trả lời được chấp nhận. Kinh khủng thật. Không bao giờ đặt 777. Bao giờ.
CGriffin

39

Nó cũng có thể là TỰ TIN. (Centos, RedHat)

Xác định trạng thái của SElinux trên thiết bị đầu cuối:

$ sestatus

Nếu trạng thái được bật, hãy viết lệnh để tắt SElinux

$ setenforce Permissive

Hoặc bạn có thể thực thi lệnh này

$ sudo setenforce 0


6
Đây là điều duy nhất đã làm việc, bạn có thể vui lòng giải thích những gì nó làm?
hack4mer

2
@ hack4mer bạn có thể đọc thêm thông tin về seLinux. vi.wikipedia.org/wiki/Security-Enhified_Linux
Turan Zamanlı

Những điều kỳ lạ tôi từng thấy, tại sao nó hoạt động sau khi tìm kiếm hơn 6 giờ
Muhamad Yulianto

1
Giải pháp duy nhất hiệu quả với tôi .. cảm ơn bạn. Nhưng vấn đề trở lại mỗi khi máy chủ khởi động lại, bạn có biết làm thế nào để áp dụng nó ngay cả khi máy chủ được khởi động lại không?
Juan Angel

1
@JuanAngel bạn phải vô hiệu hóa vĩnh viễn dịch vụ. mở bằng trình chỉnh sửa vim / etc / sysconfig / selinux và sau đó thay đổi chỉ thị SELinux = thi hành thành SELinux = bị vô hiệu hóa
Turan Zamanlı

31

Bạn cần điều chỉnh các quyền của storagebootstrap/cache.

  • cd vào dự án Laravel của bạn.
  • sudo chmod -R 755 storage
  • sudo chmod -R 755 bootstrap/cache

Bạn có thể thử 777 nếu 755 không hoạt động. 777 không an toàn mặc dù!

Tùy thuộc vào cách thiết lập máy chủ web của bạn, bạn có thể có thể cụ thể hơn với các quyền của mình và chỉ cấp chúng cho người dùng máy chủ web của bạn. Google WEB SERVER NAME Laravel file permissionsđể biết thêm thông tin.

Tại thời điểm viết bài, đây là dành cho Laravel 5.4


14

Thêm vào composer.json

"scripts": {
    "post-install-cmd": [
          "chgrp -R www-data storage bootstrap/cache",
          "chmod -R ug+rwx storage bootstrap/cache"
     ]
}

Sau composer install


12

Chạy các lệnh sau và bạn có thể thêm sudokhi bắt đầu lệnh tùy thuộc vào hệ thống của bạn:

chmod -R 775 storage/framework
chmod -R 775 storage/logs
chmod -R 775 bootstrap/cache 

1
Không bao giờ sử dụng 777. Với quyền 777, bạn sẽ cấp cho bất kỳ ai có quyền truy cập đầy đủ vào các tệp hoặc thư mục có các quyền đó. Họ có thể thay đổi chúng theo bất kỳ cách nào họ chọn, kể cả độc hại. Nhiều sự cố hack tài khoản xuất phát từ quyền 777.
Odyssee

8

Đối với tất cả người dùng Centos 7 trên bối cảnh Laravel, không cần phải tắt Selinux, chỉ cần chạy các lệnh sau:

yum install policycoreutils-python -y # might not be necessary, try the below first

semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/laravel/storage(/.*)?" # add a new httpd read write content to sellinux for the specific folder, -m for modify
semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/laravel/bootstrap/cache(/.*)?" # same as the above for b/cache

restorecon -Rv /var/www/html/ # this command is very important to, it's like a restart to apply the new rules

Cuối cùng, hãy đảm bảo rằng các máy chủ, ips và máy chủ ảo của bạn đều chính xác để truy cập từ xa.

Selinux có ý định hạn chế quyền truy cập ngay cả đối với người dùng root, vì vậy chỉ có thể truy cập những thứ cần thiết, ít nhất là trên tổng quan chung, đó là bảo mật bổ sung, vô hiệu hóa nó không phải là một cách tốt, có nhiều liên kết để tìm hiểu Selinux, nhưng đối với điều này trường hợp nó thậm chí không được yêu cầu.


Mặc dù liên kết này có thể trả lời câu hỏi, tốt hơn là bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở nên không hợp lệ nếu trang được liên kết thay đổi. - Từ đánh giá
Patrick Mevzek

Liên kết là siêu rõ ràng, không cần một cơ chế như vậy, thậm chí còn có một phần cụ thể cho bối cảnh Laravel SELinux. Tôi nghĩ rằng ý kiến ​​của bạn nên được hỗ trợ bởi logic hơn một chút so với chỉ một quy tắc đơn giản. Trong khi đó, bạn đã đánh giá thấp một câu trả lời rất có thể sẽ khắc phục 99% các vấn đề mà không tuân theo các thực tiễn xấu như vô hiệu hóa Selinux.
Daniel Santos

Nó không phải là một vấn đề để được rõ ràng hay không. Ý tưởng của trang web này là nó chứa tất cả các thông tin liên quan, vì vậy bằng cách đọc một câu trả lời, chúng tôi nhận được tất cả. Liên kết bên ngoài có thể bị thối và sau đó câu trả lời trở nên vô giá trị. Điều này được giải thích trong trung tâm trợ giúp tại stackoverflow.com/help/how-to-answer : "Liên kết đến các tài nguyên bên ngoài được khuyến khích, nhưng vui lòng thêm ngữ cảnh xung quanh liên kết để người dùng đồng nghiệp của bạn sẽ biết được đó là gì và tại sao nó lại ở đó . Luôn luôn trích dẫn phần có liên quan nhất của một liên kết quan trọng, trong trường hợp trang đích không thể truy cập được hoặc ngoại tuyến vĩnh viễn. "
Patrick Mevzek

Câu hỏi của bạn đã được gắn cờ để xem xét, đó là tất cả. Và nó mâu thuẫn với những gì được viết trong Trung tâm trợ giúp mà tôi đã trích dẫn. Tất cả các câu trả lời chỉ với liên kết và không có mô tả nào bị hạ cấp và thậm chí bị xóa. Hãy chỉnh sửa câu trả lời của bạn để cung cấp phần giải thích có liên quan ở đây. Và bạn được tự do hạ thấp tất cả các câu trả lời mà bạn cho là xấu. Bạn có thể thấy từ liên kết đánh giá rằng tôi không đơn độc trong việc đề nghị câu trả lời của bạn được đóng lại. Không phải về giá trị kỹ thuật, chỉ vì một liên kết là không đủ.
Patrick Mevzek

Cảm ơn đã làm rõ, tôi không biết những loại hướng dẫn đó tồn tại, hoặc ngay cả khi trong quá trình đăng ký, bạn nhận được một mẹo để đọc tài nguyên, tôi không nhớ nó. Những gì bạn nói có thể đúng, liên kết có thể bị thối, nhưng câu trả lời có thể đạt được mà không cần nỗ lực, bất kể, tôi sẽ chỉnh sửa nó.
Daniel Santos

6

Nếu bạn sử dụng cmd

sudo chown -R $USER:www-data storage
sudo chown -R $USER:www-data bootstrap/cache

Nếu bạn sử dụng GUI

Đầu tiên hãy vào dự án và nhấp chuột phải vào bộ lưu trữ và kiểm tra các thuộc tính và đi đến tab Quyền

nhập mô tả hình ảnh ở đây

Thay đổi quyền sử dụng mã dưới đây

sudo chmod -R 777 storage

Sau đó, thuộc tính tệp của bạn có thể là

nhập mô tả hình ảnh ở đây

Sau đó kiểm tra cài đặt của bạn và thực hiện lệnh laravel nó sẽ hoạt động :)


Cảm ơn yoouuuuuu
viniciussvl

5

Trong Laravel, bạn nên đặt ACL storagecachethư mục để người dùng máy chủ web có thể đọc / ghi trên thư mục. Mở một thiết bị đầu cuối mới và chạy như sau:

HTTPDUSER=$(ps axo user,comm | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\  -f1)

sudo setfacl -dR -m u:"$HTTPDUSER":rwX -m u:$(whoami):rwX bootstrap/cache storage/
sudo setfacl -R -m u:"$HTTPDUSER":rwX -m u:$(whoami):rwX bootstrap/cache storage/

Người giới thiệu:

https://symfony.com/doc/3.4/setup/file_permissions.html#USE-acl-on-a-system-that-supports-setfacl-linux-bsd

https://linux.die.net/man/1/setfacl


5

Nó có thể bị trễ nhưng có thể giúp được ai đó, thay đổi quyền thư mục hoạt động với tôi.

Giả sử rằng dự án Laravel của bạn nằm trong /var/www/html/thư mục.

cd /var/www/html/

Sau đó thay đổi quyền của storage/bootstrap/cache/thư mục.

sudo chmod -R gu+w storage/
sudo chmod -R guo+w storage/
sudo chmod -R gu+w bootstrap/cache/
sudo chmod -R guo+w bootstrap/cache/

2

Giải pháp này dành riêng cho laravel 5.5

Bạn phải thay đổi quyền đối với một vài thư mục: chmod -R -777 lưu trữ / nhật ký chmod -R -777 lưu trữ / khung cho các thư mục trên 775 hoặc 765 không hoạt động cho dự án của tôi

chmod -R 775 bootstrap/cache 

Ngoài ra quyền sở hữu của thư mục dự án nên như sau (người dùng hiện tại) :( người dùng máy chủ web)



1

Tôi không thích thay đổi quyền truy cập thư mục của mình thành 777. Đây là cách tôi khắc phục sự cố này.

Đầu tiên, tôi đã thay đổi người dùng đang chạy máy chủ web trên máy cục bộ của mình (tôi chạy nginx, nhưng các nguyên tắc áp dụng ở mọi nơi):

$> sudo vim /etc/nginx/nginx.conf
user <my_user> #inside nginx.conf
service nginx reload

Sau đó, tôi đã tạo một index.phptệp khác trong public/thư mục để tìm ra ai đang chạy phiên bản php-fpm của tôi và nơi tôi sẽ thay đổi điều đó:

<?php
phpinfo();
?>

Đang tải lại trang, tôi phát hiện ra đó www-datalà người dùng (trong phần môi trường). Tôi cũng phát hiện ra mình đang chạy php 7.1. Tôi đã tiến hành thay đổi người dùng:

$> sudo vim /etc/php/7.0/fpm/pool.d/www.conf 
#Look for www-data or the following variables: user, group, listen.user, listen.group.

Cuối cùng, tôi đã cấp các quyền sau cho các thư mục:

sudo chmod -R 775 ./storage/

Bây giờ, tôi đã chắc chắn rằng mình là chủ sở hữu của các thư mục bằng cách sử dụng đơn giản:

ls -al

Nếu bạn đặt máy chủ và người dùng php-fpm cho chính mình và các thư mục được sở hữu bởi root chẳng hạn, thì bạn sẽ tiếp tục gặp phải vấn đề này. Điều này có thể xảy ra nếu bạn đã sudo laravel new <project>làm root. Trong trường hợp đó, đảm bảo bạn sử dụng chownlệnh đệ quy cho dự án của mình để thay đổi user:groupcài đặt. Trong hầu hết các trường hợp mặc định, www-datalà cài đặt chính cho máy chủ và php, trong trường hợp đó, vấn đề là đảm bảo thư mục không nằm ngoàiwww-data tầm với.

Dự án của tôi được thiết lập trong thư mục nhà của tôi. Trên Ubuntu 16.04 và Laravel 5.5.


1

thử cái này

  1. cd / var / www / html
  2. thiết lập lực lượng 0
  3. khởi động lại dịch vụ httpd

Bạn có thể giải thích điều này không?
Ngày càng ngu ngốc

1
Không cần thay đổi thư mục để sử dụng setenforcenhưng trong mọi trường hợp, việc vô hiệu hóa hoàn toàn SELinux chỉ là để khắc phục một vấn đề về quyền.
Patrick Mevzek

0

Trong trường hợp cụ thể của tôi, tôi đã có một tệp cấu hình được tạo và lưu vào bộ đệm bootstrap/cache/ thư mục để các bước của tôi trong đó:

  1. Xóa tất cả các tệp được lưu trong bộ nhớ cache: rm bootstrap/cache/*.php
  2. Tạo một laravel.logtệp mới và áp dụng cập nhật các quyền trên tệp bằng cách sử dụng:

    • chmod -R 775 storage

0

(trên Ubuntu ): Có thể được giải quyết bằng 2 bước đơn giản:

$ sudo chmod -R 777 storage 

$ sudo service apache2 restart

Bước 3: khiến máy chủ của bạn và / hoặc người dùng của bạn bị hack vì bạn đã mở các tệp của mình ra thế giới.
miken32

0

Xóa "/var/www/laravel/app/storage/logs/laravel.log"và thử lại:

rm storage/logs/laravel.log



-1

Lỗi này có thể được sửa bằng cách vô hiệu hóa Linux.

Kiểm tra xem nó đã được kích hoạt chưa

sestatus

Bạn thử..

thiết lập lực lượng 0


5
"Bằng cách vô hiệu hóa Linux "? Điều đó thực sự đi quá xa :-)!
Patrick Mevzek

-1

Đối với lỗi này:

Lỗi trong trình xử lý ngoại lệ: Không thể mở luồng hoặc tệp "/var/www/laravel/app/st Storage / logs /laravel.log": không thể mở luồng: Quyền bị từ chối trong / var / www / laravel / bootstrap / được biên dịch .php: 8423

sử dụng lệnh này trong terminal:

sudo chmod -R 777 storage

2
quá tệ cho sản xuất env
Ariful Haque

-1

Đã khắc phục sự cố của tôi với lệnh này trong centos 7.6 Server

chcon -R -t httpd_sys_content_t $SITE_PATH

chcon -R -t httpd_sys_rw_content_t $SITE_PATH
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.