mod_wsgi: Unable to stat Python home and ImportError: No module named 'encodings'
&我正在尝试在Apache2.4上使用Django和mod_wsgi在python 3.5.2上构建一个网站。但是,当启动apache守护进程httpd时,以下错误消息将输出到/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'
&因此,我浏览了一些关于类似问题的文章,例如
Django+Apache+Mod wsgi权限被拒绝
mod_wsgi:importError:没有名为'encodings'的模块
但上述错误信息的原因尚未解决。
请指出一些要检查的点或要阅读的文档等。
我的开发环境如下。
(1)主机和操作系统
- 托管服务:亚马逊AWS EC2
- 操作系统:Amazon Linux AMI版本2016.03
(2)Django项目
&我在目录/home/ec2 user/django站点中创建了名为testprj的django项目,用户帐户为ec2 user。
1 2 3 4 5 | [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 |
已设置testprj使用的数据库。因此,Django中提供的开发服务器成功启动,没有出现错误,如下所示。
1 2 3 4 5 6 7 8 | [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)Python环境
&我安装了
1 2 3 4 5 6 7 8 9 | [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 |
&我通过pip命令安装了以下模块。
1 2 3 4 5 6 7 8 9 | [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服务器
&我使用的Web服务器是Apache2.4,如下所示。
1 2 3 | [ec2-user@MyEC2 ~]$ httpd -v Server version: Apache/2.4.23 (Amazon) Server built: Jul 29 2016 21:42:17 |
&执行apache的用户和组都是apache,作为/etc/httpd/conf/httpd.conf中的下一行。
1 2 | User apache Group apache |
(5)Django项目testprj的additinal conf文件
&我打算配置这样的URL
1 | http://[MyEC2 domain]/testprj/ |
可以访问位于/home/ec2 user/django sites/testprj的django项目的首页。
&上面的[myec2域]如下
1 | ec2-XX-XX-XX-XX.us-west-2.compute.amazonaws.com |
所以,我在/etc/httpd/conf.d中编写了testprj.conf,如下所示。
1 2 3 | [ec2-user@MyEC2 conf.d]$ pwd /etc/httpd/conf.d [ec2-user@MyEC2 conf.d]$ cat -n testprj.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 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 |
1 | [ec2-user@MyEC2 conf.d]$ |
最好的问候。
有几件事要检查。
默认情况下,pyenv工具不使用共享库安装python。这可能会导致一些问题,因为mod wsgi想要一个共享库。您需要显式地告诉pyenv使用共享库构建python。
许多Linux系统上的主目录对其他用户不可读。初始化mod_wsgi时,它作为apache用户运行,将无法看到主目录的内部。当mod wsgi模块由Apache加载时,没有问题,因为Apache在此时以根用户身份运行。
您的配置还存在其他问题,这些问题不遵循最佳实践,但上述问题,尤其是第二个问题可能是您的问题的原因。