frankelot
frankelot

Reputation: 14449

How to fix Error: laravel.log could not be opened?

I'm pretty new at laravel, in fact and I'm trying to create my very first project. for some reason I keep getting this error (I haven't even started coding yet)

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

I've read this has something to do with permissions but chmod -R 775 storage didn't help at all.

Permissions

Upvotes: 357

Views: 771520

Answers (21)

Antonio Carlos Ribeiro
Antonio Carlos Ribeiro

Reputation: 87789

Never use 777 for directories on your live server, but on your own machine, sometimes we need to do more than 775, because

chmod -R 775 storage

Means

7 - Owner can read, write, and execute
7 - Group can read, write, and execute
5 - Others can read and execute, but not write

If your webserver is not running as Vagrant, it will not be able to write to it, so you have 2 options:

chmod -R 777 storage

or change the group to your webserver user, supposing it's www-data:

chown -R vagrant:www-data storage

Upvotes: 197

Waad Mawlood
Waad Mawlood

Reputation: 898

In Linux

sudo chown -R www-data:root /var/www/name-project-Laravel
sudo chmod 755 /var/www/name-project-Laravel/storage

Upvotes: 0

Hamza Rashid
Hamza Rashid

Reputation: 1397

It might be late but may help someone, changing directory permissions worked for me.

Assuming that your Laravel project is in /var/www/html/ directory. Goto this directory.

cd /var/www/html/

Then change permissions of storage/ and bootstrap/cache/ directories.

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

If permission 775 does not work, try setting 777. (Warning! This is the most relaxed permission, use with care).

sudo chmod -R 777 storage/
sudo chmod -R 777 bootstrap/cache/

cPanel: If you are on cPanel and don't have terminal available you can change permission by right clicking on the mentioned directory and it's sub-directories.

Upvotes: 37

Sumit Wadhwa
Sumit Wadhwa

Reputation: 3227

This is what I do if I'm running Apache:

sudo chown -R $USER:www-data my_laravel_project/

sudo chmod -R 775 my_laravel_project/storage

sudo chmod -R 775 my_laravel_project/bootstrap/cache

cd my_laravel_project

php artisan optimize:clear

Upvotes: 4

Mehdi Daalvand
Mehdi Daalvand

Reputation: 661

1- ‍The nginx user and php-fpm user and app owner-user must be the same:

run command sudo vi /etc/nginx/nginx.conf change like bellow:

user nginx nginx;

run command sudo vi /etc/php-fpm.d/www.conf change like bellow:

listen.owner = nginx
listen.group = nginx
listen.mode = 0660
user = nginx
group = nginx

then restart nginx and php-fpm service

run below command

sudo chown nginx:nginx -R "your_project_path"

2- change file SELinux security context by run the following commands in the project path

chcon -R -t httpd_sys_content_t .
chcon -R -t httpd_sys_rw_content_t .

Upvotes: 15

Sanaulla
Sanaulla

Reputation: 1649

Just run the following command from Project root Directory -

sudo chmod -R 775 storage
sudo chown -R $USER:www-data storage

Upvotes: 10

Saddan
Saddan

Reputation: 1655

Maximum people's are suggesting to change file permission 777 or 775, which I believe not an appropriate approach to solve this problem. You just need to change the ownership of storage and bootstrap folder.

In below Image you can see all my files/folder are under the root user(except storage and bootstrap, because I changed the ownership ),but I logged in as a administrator(before changing ownership) that's why it always giving permission denied. So I need to change the ownership of this two folder to administrator

So how I did this, go to your project directory and run below commands. sudo chown -R yourusername:www-data storage, sudo chmod -R ug+w storage, sudo chown -R yourusername:www-data bootstrap, sudo chmod -R ug+w bootstrap

Upvotes: 6

Pronab Roy
Pronab Roy

Reputation: 1178

I stuck on this issue tried different commands but these will help to solve the problem

php artisan route:clear
php artisan config:clear
php artisan cache:clear

Hope it's helped others too.

Upvotes: 13

Daniel Dewhurst
Daniel Dewhurst

Reputation: 2603

You need to adjust the permissions of storage and bootstrap/cache.

  • cd into your Laravel project.
  • sudo chmod -R 755 storage
  • sudo chmod -R 755 bootstrap/cache

You can try 777 if 755 doesn't work. 777 is not secure though!

Depending on how your web server is setup, you may be able to be more specific with your permissions, and only grant them to your web server user. Google WEB SERVER NAME Laravel file permissions for more information.

At the time of writing, this is for Laravel 5.4

Upvotes: 48

Thilina Dharmasena
Thilina Dharmasena

Reputation: 2341

If you use cmd

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

If you use GUI

First go to the project and right click on the storage and check the properties and go to the Permissions tab

enter image description here

Change the permissions using below code

sudo chmod -R 777 storage

Then your file properties may be

enter image description here

Then check your settings and execute laravel command it will work :)

Upvotes: 13

Turan Zamanlı
Turan Zamanlı

Reputation: 3926

It also may be SELinux. (Centos, RedHat)

Determine status of SElinux on terminal:

$ sestatus

If status is enabled, write command to disable SElinux

$ setenforce Permissive

Or you may execute this command

$ sudo setenforce 0

Upvotes: 83

frankelot
frankelot

Reputation: 14449

To fix this issue, you need to change the ownership of the directory to the unix user that the webserver uses.

  1. Get out of the VM
  2. Using the console, go to your synced folder (vagrant)
  3. sudo chown -R $USER:www-data storage
  4. chmod -R 775 storage

Even though I created the project within the VM using the VM user, the folder belonged to the user in the real computer; so, when trying to

Now it's working.

Thanks to all those that helped me figure this thing out

EDIT:

Actually, it still wasn't working, it still gave me a "permission denied" problem.

Here's what I did, I modified my Vagrantfile like this:

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

Upvotes: 92

Pratik
Pratik

Reputation: 1071

In Laravel, you should set ACL on storage and cache directory so that web server user can read/write on the directory. Open a new terminal and run following:

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/

References:

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

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

Upvotes: 9

Hamid Parchami
Hamid Parchami

Reputation: 7689

Never set a directory to 777. you should change directory ownership. so set your current user that you are logged in with as owner and the webserver user (www-data, apache, ...) as the group. You can try this:

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

then to set directory permission try this:

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

Update:

Webserver user and group depend on your webserver and your OS. to figure out what's your web server user and group use the following commands. for nginx use:

ps aux|grep nginx|grep -v grep

for apache use:

ps aux | egrep '(apache|httpd)'

Upvotes: 670

Crisoforo Gaspar
Crisoforo Gaspar

Reputation: 3830

In my particular case I had a config file generated and cached into the bootstrap/cache/ directory so my steps where:

  1. Remove all generated cached files: rm bootstrap/cache/*.php
  2. Create a new laravel.log file and apply the update of the permissions on the file using:

    • chmod -R 775 storage

Upvotes: 0

Davron Achilov
Davron Achilov

Reputation: 621

Add to composer.json

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

After composer install

Upvotes: 22

Daniel Santos
Daniel Santos

Reputation: 457

For all Centos 7 users on a Laravel context, there is no need to disable Selinux, just run these commands:

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

Lastly, make sure your hosts, ips and virtual hosts are all correctly for remote accessing.

Selinux is intended to restrict access even to root users, so only the necessary stuff might be accessed, at least on a generalist overview, it's extra security, disabling it is not a good practise, there are many links to learn Selinux, but for this case it is not even required.

Upvotes: 13

Gauravbhai Daxini
Gauravbhai Daxini

Reputation: 2190

Run following commands and you can add sudo at starting of command depends on your system:

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

Upvotes: 18

Dan Christian Febra
Dan Christian Febra

Reputation: 59

try this

  1. cd /var/www/html
  2. setenforce 0
  3. service httpd restart

Upvotes: 5

s_user
s_user

Reputation: 644

This solution is specific for laravel 5.5

You have to change permissions to a few folders: chmod -R -777 storage/logs chmod -R -777 storage/framework for the above folders 775 or 765 did not work for my project

chmod -R 775 bootstrap/cache 

Also the ownership of the project folder should be as follows (current user):(web server user)

Upvotes: 1

Patrick.SE
Patrick.SE

Reputation: 4564

I wasn't too keen on changing my folder permissions to 777. Here's how I went about fixing this issue.

First, I changed the user who is running the web server on my local machine(I run nginx, but the principles apply everywhere):

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

Afterwards, I created another index.php file under the public/ folder to find out who was running my php-fpm version and where I would go about changing that:

<?php
phpinfo();
?>

Reloading the page, I found out that www-data was the user(under the environment section). I also found out I was running php 7.1. I proceeded to change the user:

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

Finally, I gave the following permissions to folders:

sudo chmod -R 775 ./storage/

Now, I made sure that I was the owner of the folders by using a simple:

ls -al

If you set the server and php-fpm users to yourself and the folders are owned by root for example, then you will keep encountering this issue. This can happen if you did a sudo laravel new <project> as root. In that case, make sure you use a recursive chown command on your project to change the user:group settings. In most default cases, www-data is the main setting for the server and php, in that case it's a matter of making sure the folder isn't out of www-data's reach.

My project is setup in my home directory. On Ubuntu 16.04 and Laravel 5.5.

Upvotes: 1

Related Questions