mod_wsgi:无法统计Python home和ImportError:没有名为'encodings'的模块

时间:2016-09-16 10:45:40

标签: python django apache mod-wsgi

我正在尝试使用Django和Python 3.5.2上的mod_wsgi在Apache 2.4上构建一个网站。但是当启动apache守护程序httpd时,会在/ var / log / httpd / error_log上输出以下错误消息。

  

[Fri Sep 16 17:44:57.145900 2016] [wsgi:warn] [pid 20593](13)权限被拒绝:mod_wsgi(pid = 20593):无法统计Python home /home/ec2-user/.pyenv /versions/3.5.2。 Python解释器可能无法正确初始化。验证整个路径的提供路径和访问权限。   
致命Python错误:Py_Initialize:无法获取语言环境编码   
ImportError:没有名为'encodings'的模块

所以,我探讨了一些关于类似问题的文章,例如

但上述错误消息的原因尚未解决。
请说明要检查的要点或要阅读的文件等。

我的开发环境如下。

(1)主持人和操作系统

  • 托管服务:亚马逊AWS EC2
  • 操作系统:Amazon Linux AMI版本2016.03

(2)Django项目

我使用 ec2-user 的用户帐户在 / home / ec2-user / django-sites 目录中创建名为 testprj 的Django项目

[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中提供的开发服务器已成功启动,没有任何错误。

[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的环境

我通过pyenv install 3.5.2安装了Python 3.5.2。然后我就设定了 pyenv virtualenv 3.5.2 django-sites。 我将本地的/ home / ec2-user / django-sites设置为env django-sites 如下所示。

[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命令安装了以下模块。

[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服务器是Apache 2.4,如下所示。

[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中的下一行。

User apache
Group apache 

(5)Django项目testprj的附加conf文件

我打算配置这样的URL

http://[MyEC2 domain]/testprj/

可以访问位于/ home / ec2-user / django-sites / testprj的Django项目的首页。
上面的[MyEC2域名]就像

ec2-XX-XX-XX-XX.us-west-2.compute.amazonaws.com

所以,我在 /etc/httpd/conf.d 中写了 testprj.conf ,如下所示。

[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]$

最好的问候。

1 个答案:

答案 0 :(得分:3)

要检查的几件事。

  • 默认情况下,pyenv工具不会使用共享库安装Python。由于mod_wsgi需要共享库,这可能会导致问题。您需要明确告诉pyenv使用共享库构建Python。

  • 许多Linux系统上的主目录对其他用户不可读。初始化mod_wsgi时,它以Apache用户身份运行,无法查看主目录内部。当Apache加载mod_wsgi模块时没有问题,因为Apache在那时以root身份运行。

您的配置还有其他问题,不遵循最佳做法,但上述情况,尤其是第二项可能是导致问题的原因。

相关问题