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
我在这里错过了什么?