使用 apache2 运行的 Django 找不到 app.settings 模块

问题描述 投票:0回答:0

Django 在使用

python manage.py
运行时工作。 当我使用 apache 运行时,出现 500 内部服务器错误,apache 错误日志文件指出:

AH01215: ModuleNotFoundError: /var/www/app/myproject/wsgi.py
AH01215: : : /var/www/app/myproject/wsgi.py
AH01215: No module named 'myproject': /var/www/app/myproject/wsgi.py
AH01215: : /var/www/app/myproject/wsgi.py

所以我检查了我的 wsgi.py 文件,看看

sys.path
是否在正确的位置(检查后删除了
exit
语句):

#!/usr/bin/env python3
import os
import sys
exit(sys.path)
from django.core.wsgi import get_wsgi_application

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

application = get_wsgi_application()

注意 shebang,我不得不添加它来修复早期的错误。 apache 错误日志文件现在显示:

AH01215: ['/var/www/app/myproject', '/usr/lib/python310.zip', '/usr/lib/python3.10', '/usr/lib/python3.10/lib-dynload', '/usr/local/lib/python3.10/dist-packages', '/usr/lib/python3/dist-packages']: /var/www/app/myproject/wsgi.py

sys.path
不包括
/var/www/app
所以我查看相关站点可用文件并检查是否没有其他具有相同 ServerName 的 conf 文件:

<VirtualHost *:80>
        ServerName app.example.com
        ServerAlias www.app.example.com 
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/app

    Alias /static /var/www/app/static
    <Directory /var/www/app/static>
        Require all granted
    </Directory>

    WSGIDaemonProcess myproject python-home=/var/www/app/myprojectenv python-path=/var/www/app
    WSGIProcessGroup myproject
    WSGIScriptAlias / /var/www/app/myproject/wsgi.py

    <Directory /var/www/app>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/your-project-name-error.log
    CustomLog ${APACHE_LOG_DIR}/your-project-name-access.log combined

</VirtualHost>

可以看到

python-path
变量设置为
/var/www/app
,但是
sys.path
中没有出现这个
wsgi.py

所以我回到

wsgi.py
并将
/var/www/app
附加到
sys.path

#!/usr/bin/env python3

import os
import sys
sys.path.insert(0, '/var/www/app/')
from django.core.wsgi import get_wsgi_application

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

application = get_wsgi_application()

我重新启动 apache 并再次运行,我收到 500 错误,在错误日志中我看到:

End of script output before headers: wsgi.py

wsgi 可能是为与我的 virtualenv 不同的版本编译的,所以我检查发现情况并非如此。

$ grep 'wsgi_module' /etc/apache2/mods-available/wsgi.load
LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi.so
$ ldd /usr/lib/apache2/modules/mod_wsgi.so
...
libpython3.10.so.1.0 => /lib/x86_64-linux-gnu/libpython3.10.so.1.0 (0x00007f455cc00000)
...
$ source /var/www/app/myprojectenv/bin/activate
Python 3.10.6

考虑到这可能是权限问题,我运行以下命令,但错误仍然存在。

sudo chmod -R 777 /var/www/app
sudo chmod a+x /var/www/app

我在这里错过了什么?

python django apache mod-wsgi wsgi
© www.soinside.com 2019 - 2024. All rights reserved.