【问题标题】:'No module named 'encodings'' error when deploying django app on apache with mod_wsgi使用 mod_wsgi 在 apache 上部署 django 应用程序时出现“没有名为“编码”的模块”错误
【发布时间】:2019-07-30 16:43:16
【问题描述】:

版本列表:

Centos 7---django 2.1.7---Apache 2.4.6---Python 3.6强>

检查 EDIT 5 以获取最新的错误日志

在此处学习本教程:https://www.digitalocean.com/community/tutorials/how-to-serve-django-applications-with-apache-and-mod_wsgi-on-centos-7

我可以运行 sudo systemctl start httpd,当我转到该 url 时,我得到一个内部服务器错误(底部的日志)

我的文件结构

home
└── user
    └── projects
        └── myapp
            ├── app
            │   ├── <All Code for Webapp including static dir>  
            ├── env (virtualenv)
            ├── manage.py
            ├── new
            │   ├── settings.py
            │   ├── urls.py
            │   └── wsgi.py
            └── requirements.txt

我希望有人能在我的 httpd 文件夹中的 django.conf 中看到一个错误。并希望这些是我正在寻找的端点

编辑:此文件位于此处:/etc/httpd/conf.d/django.conf

django.conf

Alias /static /home/user/projects/myapp/app/static
<Directory /home/user/projects/myapp/app/static>
    Require all granted
</Directory>

<Directory /home/user/projects/myapp/new>
    <Files wsgi.py>
        Require all granted
    </Files>
</Directory>

WSGIApplicationGroup %{GLOBAL}
WSGIDaemonProcess myapp python-path=/home/user/projects/myapp python-home=/home/user/projects/myapp/env 
WSGIProcessGroup myapp
WSGIScriptAlias / /home/user/projects/myapp/new/wsgi.py

我不确定这些是否指向所有正确的地方,并希望有人可以再看看我。

我还没有接触过 wsgi.py,我想知道我是否遗漏了那里的任何逻辑。

我的 wsgi.py

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'new.settings')

application = get_wsgi_application()

EDIT2:我能够运行服务器,但出现 500 内部服务器错误,当我检查 error_logs 时,我得到了这个

更新日志

[Mon Mar 11 10:40:39.865611 2019] [core:notice] [pid 9371] SELinux policy enabled; httpd running as context system_u:system_r:httpd_t:s0
[Mon Mar 11 10:40:39.868149 2019] [suexec:notice] [pid 9371] AH01232: suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Mon Mar 11 10:40:39.918015 2019] [auth_digest:notice] [pid 9371] AH01757: generating secret for digest authentication ...
[Mon Mar 11 10:40:39.919681 2019] [lbmethod_heartbeat:notice] [pid 9371] AH02282: No slotmem from mod_heartmonitor
[Mon Mar 11 10:40:39.948303 2019] [mpm_prefork:notice] [pid 9371] AH00163: Apache/2.4.6 (CentOS) mod_wsgi/3.4 Python/2.7.5 configured -- resuming normal operations
[Mon Mar 11 10:40:39.948370 2019] [core:notice] [pid 9371] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND'
[Mon Mar 11 10:40:42.878806 2019] [mime_magic:error] [pid 9376] [client ip] AH01512: mod_mime_magic: can't read `/home/user/projects/myapp/new/wsgi.py'
[Mon Mar 11 10:40:42.879459 2019] [mime_magic:error] [pid 9376] [client ip] AH01512: mod_mime_magic: can't read `/home/user/projects/myapp/new/wsgi.py'
[Mon Mar 11 10:40:42.905048 2019] [:error] [pid 9372] (13)Permission denied: [remote ip] mod_wsgi (pid=9372, process='myapp', application='<url>|'): Call to fopen() failed for '/home/user/projects/myapp/new/wsgi.py'

EDIT3

在这个日志文件中,当我运行 python3.6 而不是 2.7.5 时,它会显示 Apache/2.4.6 (CentOS) mod_wsgi/3.4 Python/2.7.5 configured,也许改变它会有所帮助?

编辑 4

所以我将我的 WSGIDaemonProcess 更改为

WSGIDaemonProcess myapp python-path=/home/user/projects/myapp python-home=/home/user/projects/app/env/lib/python3.6/site-packages user=<user>

现在我收到这些错误

[Tue Mar 12 10:38:09.111397 2019] [mime_magic:error] [pid 18804] [client ip] AH01512: mod_mime_magic: can't read `/home/user/project/myapp/new/wsgi.py'
ImportError: No module named site
ImportError: No module named site
ImportError: No module named site

所以看起来我需要卸载 mod_wsgi 并重新安装以使用 python3.6 而不是 2.7 进行编译

我怎样才能成功地做到这一点?我卸载 mod_wsgi 并尝试使用 sudo pip3.6 install mod_wsgi 进行 mreinstall 现在它无法识别 mod_wsgi 的新安装并且由于 invalid command 'WSGIDaemonProcess' 而不会启动服务器这是因为新下载没有配置 httpd?我该怎么做?

编辑 5

成功安装了用正确的python版本编译的mod_wsgi并能够运行服务器,将SELinux设置为允许摆脱cant find '/route/to/wsgi/py。现在我没有收到重复的模块名称“编码”错误。

[Wed Mar 13 15:20:46.133597 2019] [core:notice] [pid 4403] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND'
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ModuleNotFoundError: No module named 'encodings'
[Tue Mar 12 14:11:57.520271 2019] [core:notice] [pid 866] AH00052: child pid 891 exit signal Aborted (6)
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ModuleNotFoundError: No module named 'encodings'

目前我的权限都在用户 apache 和组 apache 下,并且似乎它们都在正确的权限下,我也尝试将 root 用户/组更改为 apache,并在 Myapp 目录中运行 chmod -R 777 以使确保它具有适当的权限。

项目下的权限:

home/user/projects# ls -l

total 0
drwxrw-r-x. 7 apache apache 109 Mar 12 12:48 myapp

home/user/projects/myapp# ls -l

myapp 下的权限:

total 12
drwxrwxr-x. 7 apache apache 4096 Mar  7 13:18 app
drwxr-xr-x. 5 apache apache   56 Mar 12 12:48 env
-rwxrwxr-x. 1 apache apache  535 Mar  5 13:33 manage.py
drwxrwxr-x. 3 apache apache  110 Mar  7 14:27 new
-rw-rw-r--. 1 apache apache  869 Mar  7 14:42 requirements.txt

【问题讨论】:

  • 什么是“django.conf”?它是如何与您的 Apache 配置的其余部分相关联的?
  • 它位于 /etc/httpd/conf.d/django.conf ,老实说,我不能说这一切是如何工作的,我只知道它在启动 apache 服务器时使用该文件,因为我是之前在文件上出现错误.....我在这里按照本教程进行操作:digitalocean.com/community/tutorials/…
  • 添加日志检查编辑

标签: django apache mod-wsgi django-wsgi


【解决方案1】:

您必须为环境变量传递库位置。

WSGIDaemonProcess myapp python-path=/home/user/projects/myapp python-home=/home/user/projects/myapp/env/lib/<PYTHON VERSION>/site-packages/

【讨论】:

    【解决方案2】:

    根据 mod_wsgi 的文档:

    用户=名称 |用户=#uid 定义应该作为守护进程运行的用户的 UNIX 用户名或数字用户 uid。如果未提供此选项,则守护进程将以与 Apache 运行子进程相同的用户身份运行,如 User 指令所定义,您无需将其设置为 Apache 用户。

    我认为 apache 用户无法访问您的主目录。尝试将user=myUserdirective 添加到您的WSGIDaemonProcess 或将chown 您的目录添加到apache 用户。另一种可能的方法是将您的应用程序放在 apache 用户拥有的目录中。

    编辑

    我真的应该学习阅读。根据文档,您应该使用 python3.X 解释器重新编译 mod_wsgi 以运行 python3.X 应用程序(编译和应用程序环境使用相同的版本)

    如果你想使用不同版本的 Python,你需要重新安装 mod_wsgi,编译成你想要的版本。一个 mod_wsgi 实例不可能同时运行 Python 2 和 Python 3 的应用程序。

    编辑 2

    回答您的一个 cmets:yum 不会删除您通过 pip 安装的版本是正常的。无法猜测您是否通过其他包管理器 AFAIK 安装了包。我认为您应该将一些 .so(我认为是 mod_wsgi[version].so)文件复制到 pip 安装 mod_wsgi 的目录(我认为在您的 venv/global site_packages 中)到 Apache/ 所在的文件夹中Httpd 加载它的模块文件(它类似于 alpine/ubuntu 上的 /usr/lib/apache2/modules 所以我猜它是 CentOS 的 /usr/lib/httpd/modules,但可能会有所不同,抱歉我不能给你更具体的帮助)在移出这个文件夹后旧 mod_wsgi.so。在执行此操作之前不要忘记关闭 httpd,然后重新启动它。

    来源:https://modwsgi.readthedocs.io/en/develop/configuration-directives/WSGIDaemonProcess.html(python-home部分)

    【讨论】:

    • 您是否尝试在django.conf 内的WSGIDaemonProcess 指令中指定user=&lt;user&gt; 指令?因为仅将您的&lt;user&gt; 添加到apache 组不会告诉您的httpd 进程与此特定用户一起运行。另外,我建议至少给apache 组(chmod 740)的成员提供读取权限
    • 我在 WSGIDaemonProcess(check edit) 的末尾添加了 user=,这仍然给了我同样的权限被拒绝错误
    • 我刚刚看到你的最后一次编辑。尝试将 python-home=&lt;path/to/your/python/3.6/virtualenv&gt; 添加到您的 WSGIDaemonProcess 指令中。很抱歉没有给你确切的答案,我已经很长时间没有部署 Python webapps 了。
    • 不是,你设置了python-path 而不是python-home var,但没关系。我只是重新阅读了文档,它不相关。您在日志中找到的 python 版本是指用于构建 mod_wsgi 的 python 版本。我不认为这有关系。也许尝试使用您的目录chmod -R 777,然后如果可行,请尝试一次删除一个权限。如果这些都不起作用,你仍然可以尝试使用 python3.X 解释器重新编译你自己的 mod_wsgi(它并不像看起来那么乏味,相信我已经完成了)。
    • 我认为在 pip3.6 install mod_wsgi 之前运行 yum install httpd-devel 可能会成功
    【解决方案3】:

    您可以通过以下方式检查 apache 的用户和组

    egrep -i '^user|^group' /etc/httpd/conf/httpd.conf

    所以请确保您拥有/home/user/projects/myapp/new/wsgi.py 的权限

    ls -l复查

    例如,如果用户是apache,组是apache,请尝试

    sudo chown apache:apache /home/user/projects/myapp/new/wsgi.py

    【讨论】:

    • @Mfreeman 你不应该分配ls -l指定的用户和组你应该做egrep -i '^user|^group' /etc/httpd/conf/httpd.conf我不认为你应该做不同版本的项目和不同版本的包mod_wsgi跨度>
    • 你应该通过sudo chown apache:apache /home/user/projects/myapp/new/wsgi.py修改文件的所有权给用户和组apache
    • sudo chown -R apache:apache /home/user/projects/myapp/ 递归更改里面的所有文件和文件夹
    • 似乎文件权限是问题..您的虚拟环境是否已激活?参考此question 但请注意不要删除您的项目在 virtualenv 中备份项目
    • 您是先激活吗?通过 source bin/activate 在 vi​​rtualenv 项目中,您可以通过 virtualenv envname -p python3.6 @Mfreeman 为您的 python 版本创建
    【解决方案4】:

    尝试目录级别的权限而不是文件。

    <Directory /home/user/projects/myapp/new>
         Require all granted
    </Directory>
    

    【讨论】:

    • 与上述相同的错误,[Mon Mar 11 14:51:00.850439 2019] [mime_magic:error] [pid 18001] [client ip] AH01512: mod_mime_magic: can't read /home/user/projects/myapp/new/wsgi.py'
    猜你喜欢
    • 2011-10-28
    • 2012-12-20
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    • 2012-07-15
    • 2014-07-31
    • 1970-01-01
    相关资源
    最近更新 更多