How To Fix "Stat() Failed (13: Permission Denied)" Error In Nginx?

Published July 20, 2024

Problem: Nginx Permission Denied Error

The "Stat() Failed (13: Permission Denied)" error in Nginx happens when the web server doesn't have the right permissions to access files or directories. This issue can stop Nginx from serving content or running scripts, which can cause website downtime or problems with how the site works.

Solving the Permission Denied Error

Adjusting file and directory ownership

To fix the Permission Denied error, adjust the ownership of files and directories. Use the chown command to change the owner of the files and directories to the Nginx user, usually www-data. For example:

sudo chown www-data:www-data /username/test/static

To apply ownership changes to all files and subdirectories, add the -R option:

sudo chown -R www-data:www-data /username/test/static

Tip: Verify ownership changes

After changing ownership, use the 'ls -l' command to check if the changes were applied correctly:

ls -l /username/test/static

This will display the file and directory permissions, owner, and group information.

Modifying directory permissions

Modify the directory permissions using the chmod command. Set the correct values to allow Nginx to access the files. A common permission setting is 755, which gives read, write, and execute permissions to the owner, and read and execute permissions to others:

sudo chmod 755 /username/test/static

Set proper access along the entire directory path. Each parent directory should have at least execute permission for the Nginx user:

sudo chmod 755 /username
sudo chmod 755 /username/test

Adding Nginx user to the required group

If changing ownership and permissions doesn't work, add the Nginx user to the necessary group. Use the gpasswd command to add the www-data user to the group that owns the directory:

sudo gpasswd -a www-data username

After adding the Nginx user to the group, update the group permissions for directory access:

sudo chmod g+x /username
sudo chmod g+x /username/test
sudo chmod g+x /username/test/static

This gives the group execute permission on each directory in the path, allowing Nginx to access the files.

Testing and Verifying the Solution

Running Nginx as the appropriate user

To test if Nginx can access the files with the new permissions, run a command as the Nginx user. Use sudo to switch to the www-data user and try to access the files:

sudo -u www-data stat /username/test/static/index.html

If this command runs without errors, Nginx can now access the files. If you see a "Permission denied" error, review the previous steps and make sure all permissions are set correctly.

Tip: Check File Ownership

To quickly check if the file ownership is set correctly, use the ls -l command:

ls -l /username/test/static/index.html

This will display the file's owner and group. Make sure they match the Nginx user (usually www-data).

Reloading Nginx configuration

After changing permissions or ownership, reload the Nginx configuration to apply the changes:

sudo systemctl reload nginx

This command restarts the Nginx service without interrupting active connections.

To check if the error is resolved, look at the Nginx error logs:

sudo tail -f /var/log/nginx/error.log

If you don't see the "Permission denied" errors in the log, the problem is solved. Your Nginx server should now serve the static files from the specified directory.