AH00035: access to / denied 403 Forbidden Django mod-wsgi
I am trying to configure apache with Django using mod-wsgi. But I am getting the following error
AH00035: access to / denied (filesystem path '/home/ec2-user/ezvoice') because search permissions are missing on a component of the path
URL is showing 403 forbidden
Here is the conf file
LoadModule wsgi_module "/home/ec2-user/venv/lib/python3.7/site-packages/mod_wsgi/server/mod_wsgi-py37.cpython-37m-x86_64-linux-gnu.so"
<VirtualHost *:80>
DocumentRoot /home/ec2-user/
Alias /static /home/ec2-user/ezvoice/sub_app/static
<Directory /home/ec2-user/ezvoice/sub_app/static>
Options FollowSymLinks
Order allow,deny
Require all granted
</Directory>
WSGIDaemonProcess ezvoice python-path=/home/ec2-user/ezvoice:/home/ec2-user/venv/lib/python3.7/site-packages
WSGIProcessGroup ezvoice
WSGIScriptAlias / /home/ec2-user/ezvoice/main_app/wsgi.py
ErrorLog /home/ec2-user/ezvoice/log-error.log
CustomLog /home/ec2-user/ezvoice/custom-error.log combined
<Directory /home/ec2-user/ezvoice/main_app>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
</VirtualHost>
The directory structure is as follow
home
-ec2-user
--ezvoice
---main_app
----asgi.py
----settings.py
---sub_app
----views.py
--venv
---bin
---include
---lib
I have tried to set permission as follow
sudo chown ec2-user ezvoice
sudo chown -R ec2-user /usr/local/lib/python3.7
sudo chown ec2-user /usr/local/bin
sudo chown ec2-user /usr/local/lib
"Search permissions are missing" means that the Apache user (probably apache, or www-data) doesn't have permission to traverse the directory tree all the way down to /home/ec2-user/ezvoice. You can debug this with namei -l
, which will show you a long listing of all of the directory paths down to a file or directory, starting from /. For example:
$ namei -l /home/testuser
f: /home/testuser
dr-xr-xr-x root root /
drwxr-xr-x root root home
drwx------ testuser users testuser
When you do this for /home/ec2-user/ezvoice, you'll probably see that one of the directories along the path - maybe /, judging from the error message - is missing the x
permission for group or other, which allows users to traverse the directory tree through that directory.
A simple solution is to give all users the traverse permission on all of those directories:
chmod go+x / /home /home/ec2-user /home/ec2-user/ezvoice
Then compare the output of namei -l
again to see what changed. If you don't want to grant such broad permissions, you could do it more carefully for just the Apache user, with a file ACL:
setfacl -m u:apache:x / /home /home/ec2-user /home/ec2-user/ezvoice
Note, changing the ownership of Python isn't a good idea. You should be able to fix the permissions of the files that Python and Apache read, rather than the programs themselves.