宝剑锋从磨砺出,梅花香自苦寒来。这篇文章主要讲述'
使用mod_wsgi在apache上部署django app时,没有名为'
encodings'
'
的模块相关的知识,希望能为你提供帮助。
版本列表:
Centos 7 --- django 2.1.7 --- Apache 2.4.6 --- python 3.6
检查编辑5以获取最新的错误日志
按照本教程:https://www.digitalocean.com/community/tutorials/how-to-serve-django-applications-with-apache-and-mod_wsgi-on-centos-7
我能够运行qazxsw poi,当我转到网址时,我收到内部服务器错误(记录在底部)
我的文件结构
sudo systemctl start httpd
我希望有人可以在我的httpd文件夹中找到我的django.conf中的错误。并希望这些是我正在寻找的终点
编辑:此文件位于:/etc/httpd/conf.d/django.conf
django.conf
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
我不确定这些是否指向所有正确的地方,并希望有人可以给我第二眼。
我没有触及wsgi.py,并想知道我是否缺少任何逻辑。
我的wsgi.py
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
EDIT2:我能够运行服务器,但得到500内部服务器错误,当我检查error_logs我得到这个
更新了日志
import osfrom django.core.wsgi import get_wsgi_applicationos.environ.setdefault('DJANGO_SETTINGS_MODULE', 'new.settings')application = get_wsgi_application()
Aadita
在这个日志文件中,当我运行python3.6而不是2.7.5时,它说这个
[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'
,也许更改这会有帮助吗?编辑4
所以我将我的WSGIDaemonProcess改为
Apache/2.4.6 (CentOS) mod_wsgi/3.4 Python/2.7.5 configured
现在我得到这些错误
WSGIDaemonProcess myapp python-path=/home/user/projects/myapp python-home=/home/user/projects/app/env/lib/python3.6/site-packages user=<
user>
所以看起来我需要卸载mod_wsgi并重新安装以使用python3.6而不是2.7进行编译
我怎么能成功地做到这一点?我卸载mod_wsgi并尝试mreinstall使用
[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并且不会启动服务器因为sudo pip3.6 install mod_wsgi
这是bc新的下载没有配置httpd?我该怎么办?编辑5
成功安装mod_wsgi与正确的python版本编译并能够运行服务器,将SELinux设置为允许摆脱
invalid command 'WSGIDaemonProcess'
。现在我现在没有重复的模块名称'encoding'错误。cant find '/route/to/wsgi/py
目前我的权限都在用户apache和组apache下,似乎他们都在正确的权限下,我也尝试将root用户/组更改为apache,并在Myapp目录下运行
[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'
以确保它具有适当的权限。项目许可:
chmod -R 777
myapp下的权限:
home/user/projects# ls -ltotal 0
drwxrw-r-x. 7 apache apache 109 Mar 12 12:48 myapphome/user/projects/myapp# ls -l
答案尝试dir级别的权限而不是文件。
total 12
drwxrwxr-x. 7 apache apache 4096 Mar7 13:18 app
drwxr-xr-x. 5 apache apache56 Mar 12 12:48 env
-rwxrwxr-x. 1 apache apache535 Mar5 13:33 manage.py
drwxrwxr-x. 3 apache apache110 Mar7 14:27 new
-rw-rw-r--. 1 apache apache869 Mar7 14:42 requirements.txt
另一答案根据mod_wsgi的文档:
user = name | user = #uid定义应运行守护程序进程的用户的UNIX用户名或数字用户uid。如果未提供此选项,则守护程序进程将作为Apache运行子进程的同一用户运行,如User指令所定义,并且不必自行将此设置为Apache用户。我想apache用户无法访问您的主目录。要么尝试将
<
Directory /home/user/projects/myapp/new>
Require all granted
<
/Directory>
directive添加到您的WSGIDaemonProcess,要么将user=myUser
目录添加到apache用户。另一种可能的方法是将您的应用程序放在apache用户拥有的目录中。编辑
我真的应该学会阅读。根据文档,看起来您应该使用python3.X解释器重新编译mod_wsgi以运行python3.X应用程序(对编译和应用程序的环境使用相同的版本)
如果要使用不同版本的Python,则需要重新安装mod_wsgi,根据需要编译它。一个mod_wsgi实例不可能同时为Python 2和3运行应用程序。编辑2
【' 使用mod_wsgi在apache上部署django app时,没有名为' encodings' ' 的模块】回答你的一条评论:yum不会删除你通过pip安装的版本是正常的。它无法猜测您是否通过其他包管理器AFAIK安装了包。我认为你应该复制一些.so(我认为它是mod_wsgi [version] .so)文件,它位于pip安装mod_wsgi(我认为你的venv / global site_packages内)到Apache / Httpd加载它的文件夹的目录中模块文件(这是类似于alpine / ubuntu上的
chown
所以我猜它是CentOS的/usr/lib/apache2/modules
,但可能会有所不同,对不起我不能给你更具体的帮助)搬出这个文件夹之后的旧mod_wsgi.so。在执行此操作之前不要忘记关闭httpd,然后重新启动它。来源:
/usr/lib/httpd/modules
(python-home部分)另一答案您可以检查用户和组的apache
https://modwsgi.readthedocs.io/en/develop/configuration-directives/WSGIDaemonProcess.html
因此,请确保您拥有
egrep -i '^user|^group' /etc/httpd/conf/httpd.conf
的权限由
/home/user/projects/myapp/new/wsgi.py
重新检查例如,如果User是
ls -l
并且group是apache
,请尝试apache
另一答案您必须为env变量传递库位置。
sudo chown apache:apache /home/user/projects/myapp/new/wsgi.py
推荐阅读
- 适用于Android设备的Simulink支持包错误(“未被识别为内部或外部命令”)
- 具有可扩展列表视图项的Android列表视图
- 如何使用append / 3以递归方式在prolog中构建列表()
- 来自app.config的bindingRedirect不会在构建时更新exe.config
- Android Studio中的奇怪问题
- UIApplicationLaunchOptionsRemoteNotificationKey没有获取userinfo
- 中断的AVD系统路径。检查您的ANDROID_SDK_ROOT值
- 如何保存安卓系统中摄像头点击的图片()
- Android上的BLE(蓝牙低功耗蓝牙),创建并重新连接到并不总是存在的设备