I am trying to construct a web site on Apache 2.4 using Django and mod_wsgi on Python 3.5.2. But when apache daemon httpd is started, following error message is output on /var/log/httpd/error_log.
[Fri Sep 16 17:44:57.145900 2016] [wsgi:warn] [pid 20593] (13)Permission denied: mod_wsgi (pid=20593): Unable to stat Python home /home/ec2-user/.pyenv/versions/3.5.2. Python interpreter may not be able to be initialized correctly. Verify the supplied path and access permissions for whole of the path.
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ImportError: No module named 'encodings'
So, I explored some articles about similar problems, e.g.
Django + Apache + mod_wsgi permission denied
mod_wsgi: ImportError: No module named 'encodings'
but the causes of error message above are not yet resolved.
Please indicate some points to be checked or documents to read and so on.
My development environments are as follows.
(1) Host and OS
(2) Django Project
I made Django project named testprj in the directory /home/ec2-user/django-sites with user account of ec2-user.
[ec2-user@MyEC2 django-sites]$ pwd
/home/ec2-user/django-sites
[ec2-user@MyEC2 django-sites]$ ls -l
total 4
drwxrwxr-x 3 ec2-user ec2-user 4096 Sep 16 14:50 testprj
Database which the testprj uses is already set up. So, development server provided in Django is successfully started with no error as bellow.
[ec2-user@MyEC2 testprj]$ python manage.py runserver
Performing system checks...
System check identified no issues (0 silenced).
September 16, 2016 - 14:23:47
Django version 1.10.1, using settings 'testprj.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
(3) Environments of Python
I installed Python 3.5.2 by pyenv install 3.5.2
. And then I set
pyenv virtualenv 3.5.2 django-sites
.
And I set local of /home/ec2-user/django-sites to env django-sites as bellow.
[ec2-user@MyEC2 django-sites]$ pwd
/home/ec2-user/django-sites
[ec2-user@MyEC2 django-sites]$ pyenv versions
system
3.5.2
3.5.2/envs/django-sites
* django-sites (set by /home/ec2-user/django-sites/.python-version)
[ec2-user@MyEC2 django-sites]$ python -V
Python 3.5.2
And I installed following modules through pip command.
[ec2-user@MyEC2 django-sites]$ pwd
/home/ec2-user/django-sites
[ec2-user@MyEC2 django-sites]$ pip list
configparser (3.5.0)
Django (1.10.1)
mod-wsgi (4.5.7)
pip (8.1.2)
PyMySQL (0.7.9)
setuptools (27.2.0)
(4) Web server
Web server which I use is Apache 2.4 as bellow.
[ec2-user@MyEC2 ~]$ httpd -v
Server version: Apache/2.4.23 (Amazon)
Server built: Jul 29 2016 21:42:17
User and Group of executing Apache are both apache as next lines in /etc/httpd/conf/httpd.conf.
User apache
Group apache
(5) Additinal conf file for the Django project testprj
I intend to configure such that the URL
http://[MyEC2 domain]/testprj/
can access a top page of Django project located at /home/ec2-user/django-sites/testprj.
[MyEC2 domain] above is like
ec2-XX-XX-XX-XX.us-west-2.compute.amazonaws.com
So, I wrote testprj.conf in /etc/httpd/conf.d as bellow.
[ec2-user@MyEC2 conf.d]$ pwd
/etc/httpd/conf.d
[ec2-user@MyEC2 conf.d]$ cat -n testprj.conf
1 LoadModule wsgi_module /home/ec2-user/.pyenv/versions/django-sites/lib/python3.5/site-packages/mod_wsgi/server/mod_wsgi-py35.cpython-35m-x86_64-linux-gnu.so
2
3 WSGIPythonHome /home/ec2-user/.pyenv/versions/3.5.2
4 WSGIScriptReloading On
5 WSGIScriptAlias /testprj/ /home/ec2-user/django-sites/testprj/testprj/wsgi.py
6 WSGIPythonPath /home/ec2-user/django-sites/testprj:/home/ec2-user/.pyenv/versions/django-sites/lib/python3.5/site-packages
7
8 <VirtualHost *:80>
9
10 ServerName http://ec2-XX-XX-XX-XX.us-west-2.compute.amazonaws.com
11 SuexecUserGroup apache apache
12
13 <Directory /home/ec2-user/django-sites/testprj/testprj>
14 <Files wsgi.py>
15 Require all granted
16 </Files>
17 </Directory>
18
19 Alias /static/ "/home/ec2-user/django-sites/testprj/static/"
20
21 <Directory /home/ec2-user/django-sites/testprj/static>
22 <Files *>
23 Require all granted
24 </Files>
25 </Directory>
26
27 </VirtualHost>
28
[ec2-user@MyEC2 conf.d]$
Best regards.
A couple of things to check.
The pyenv tool doesn't install Python with a shared library by default. That could result in problems as mod_wsgi wants a shared library. You need to explicitly tell pyenv to build Python with a shared library.
A home directory on many Linux systems is not readable to other users. When mod_wsgi is being initialised, it is running as the Apache user and will not be able to see inside of the home directory. There isn't an issue when the mod_wsgi module is loaded by Apache as Apache is running as root at that point.
There are other issues with your configuration where don't follow best practices, but the above, especially the second item is likely the cause of your problem.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With