我正在尝试使用 wsgi_mod 和 apache2 运行 django 应用程序。但由于某些奇怪的原因它无法导入 django。
# /etc/apache2/apache2.conf
WSGIDaemonProcess django_apps python-home=/home/swacker/miniconda3/envs/django/
WSGIProcessGroup django_apps
WSGIScriptAlias /koala /var/www/production/Koala/Koala/wsgi.py process-group=django_apps
<Directory /var/www/production/Koala/>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
应用程序位于 /var/www/products/Koala。 我的 conda 环境安装在 /home/user/miniconda3/envs/django 中。 我在conda环境中安装了wsgi。
我尝试了不同的方法,但没有任何效果。这就是我为让 wsgi 运行所做的事情。
sudo apt-get install libapache2-mod-wsgi
pip install mod_wsgi
conda install -c https://conda.binstar.org/travis uwsgi
看起来 wsgi 不适用于 conda 环境,我必须使用 virtualenv? Wsgi 可以工作,我可以很好地渲染测试文件。
但是,当我转到
localhost/koala
时,/var/log/apache2/error.log
显示:
从 django.core.wsgi 导入 get_wsgi_application 导入错误:没有名为“django”的模块
我搜索了很多,但找不到正确解决此问题的答案。
我使用 Flask 而不是 Django,使用 Miniforge3 发行版而不是 Anaconda,但我认为设置应该相对相同,因为 Miniforge3 基本上是社区驱动的(例如免费,因为它默认从 conda-forge 通道提取包) 版本的 Anaconda。以下是我如何在 Apache 中设置两个 Flask 应用程序,每个应用程序使用不同的虚拟环境。作为 root:
WSGIProcessDaemon
指令中设置的用户)可以访问它。我选择将 Miniforge3 安装在名为 /opt/miniforge3
的目录中。我也将 /opt/miniforge3/bin/
导出到我的 PATH
变量(老实说,我不是 100% 确定这是必要的)。pip install mod_wsgi
(我认为 conda
或 mamba
install mod_wsgi
也可以)。现在将针对 base环境中找到的 python 版本编译
mod_wsgi
包(这非常重要!!)conda create -n myNewEnv
mod_wsgi
将不起作用。当我安装Miniforge3发行版时,自动安装的python是3.12.6。这意味着我的虚拟环境还必须安装 python 3.12.6(不是 3.12.2、3.12.7 或任何其他 3.12.x - 它必须是 3.12.6)。在虚拟环境中安装您需要的任何其他 python 包。LoadModule
mod_wsgi-express module-config
指令并将其粘贴到 /etc/httpd/conf.modules.d
中的新文件中(我使用的是 RHEL 9,您的 Apache 配置的完成方式可能会有所不同,具体取决于您使用的 Linux 发行版)重新使用)。我的模块配置文件最终看起来像这样,注意它说 py312 因为它是为 python 版本 3.12 编译的,如 miniforge3 基础环境中所示:
# Only load the wsgi_module if it's not already loaded
<IfModule !wsgi_module>
LoadModule wsgi_module /opt/miniforge3/lib/python3.12/site-packages/mod_wsgi/server/mod_wsgi-py312.cpython-312-x86_64-linux-gnu.so
</IfModule>
WSGIProcessDaemon
python-home
更新您的 Apache 虚拟主机配置,以指向您的应用程序的虚拟 Python 环境。由于我有两个 Flask 应用程序,因此我有两个虚拟环境,并且有两个要在 Apache 中配置的虚拟主机。我的虚拟主机配置的相关部分(在/etc/httpd/conf.d
中创建)如下所示:
<VirtualHost *:443>
ServerName domainOne.com
## Logging
ErrorLog "/var/log/httpd/domainOne-error.log"
LogLevel info
CustomLog "/var/log/httpd/domainOne-access.log" combined
## WSGI configuration
WSGIApplicationGroup %{GLOBAL}
WSGIDaemonProcess domainOne display-name=%{GROUP} home=/var/www/vhosts/domainOne python-home=/opt/miniforge3/envs/domainOneVenv threads=1 user=hydro
WSGIProcessGroup domainOne
WSGIScriptAlias / "/var/www/vhosts/domainOne/wsgi.py"
</VirtualHost>
<VirtualHost *:443>
ServerName domainTwo.com
## Logging
ErrorLog "/var/log/httpd/domainTwo-error.log"
LogLevel info
CustomLog "/var/log/httpd/domainTwo-access.log" combined
## WSGI configuration
WSGIApplicationGroup %{GLOBAL}
WSGIDaemonProcess domainTwo display-name=%{GROUP} home=/var/www/vhosts/domainTwo python-home=/opt/miniforge3/envs/domainTwoVenv threads=1 user=hydro
WSGIProcessGroup domainTwo
WSGIScriptAlias / "/var/www/vhosts/domainTwo/wsgi.py"
</VirtualHost>
不要忘记重新启动 Apache 以使更改生效:
systemctl restart httpd
。
将LogLevel
设置为
info
时,如果您尝试加载网站并收到 500 或其他错误,您应该能够在 mod_wsgi
中的 /etc/httpd/logs
中看到特定虚拟主机日志的一些信息以及通用 Apache 日志(通常命名为 error_log
,除非您已在 /etc/httpd/conf/httpd.conf
文件中重命名它)。