在anaconda环境下使用apache和django运行wsgi

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

我正在尝试使用 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”的模块

我搜索了很多,但找不到正确解决此问题的答案。

python django apache2 mod-wsgi
1个回答
0
投票

我使用 Flask 而不是 Django,使用 Miniforge3 发行版而不是 Anaconda,但我认为设置应该相对相同,因为 Miniforge3 基本上是社区驱动的(例如免费,因为它默认从 conda-forge 通道提取包) 版本的 Anaconda。以下是我如何在 Apache 中设置两个 Flask 应用程序,每个应用程序使用不同的虚拟环境。作为 root:

  1. 安装Miniforge3。如果我没记错的话,这将安装一个“基本”环境,其中预装了一些软件包,就像 Anaconda 一样。记下此处找到的 python 版本。我将 Miniforge3 安装在 root 用户的主目录之外,以便其他非特权用户(例如我在虚拟主机文件中定义的
    WSGIProcessDaemon
    指令中设置的用户)可以访问它。我选择将 Miniforge3 安装在名为
    /opt/miniforge3
    的目录中。我也将
    /opt/miniforge3/bin/
    导出到我的
    PATH
    变量(老实说,我不是 100% 确定这是必要的)。
  2. base 环境中,
    pip install mod_wsgi
    (我认为
    conda
    mamba
    install mod_wsgi
    也可以)。现在将针对
    base
    环境中找到的 python 版本编译 mod_wsgi 包(这非常重要!!)
  3. 创建虚拟环境:
    conda create -n myNewEnv
  4. 安装与基础环境中相同的Python版本。如果不完全匹配,mod_wsgi 将不起作用。当我安装Miniforge3发行版时,自动安装的python是3.12.6。这意味着我的虚拟环境还必须安装 python 3.12.6(不是 3.12.2、3.12.7 或任何其他 3.12.x - 它必须是 3.12.6)。
    在虚拟环境中安装您需要的任何其他 python 包。
  5. 从命令
  6. LoadModule
  7. 的输出中复制
    mod_wsgi-express module-config
    指令并将其粘贴到
    /etc/httpd/conf.modules.d
    中的新文件中(我使用的是 RHEL 9,您的 Apache 配置的完成方式可能会有所不同,具体取决于您使用的 Linux 发行版)重新使用)。我的模块配置文件最终看起来像这样,注意它说 py312 因为它是为 python 版本 3.12 编译的,如 miniforge3 基础环境中所示:
    
    
  8. # 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
  1. python-home
    更新您的 Apache 虚拟主机配置,以指向您的应用程序的虚拟 Python 环境。由于我有两个 Flask 应用程序,因此我有两个虚拟环境,并且有两个要在 Apache 中配置的虚拟主机。我的虚拟主机配置的相关部分(在
    /etc/httpd/conf.d
    中创建)如下所示:
    
    
  2. <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
文件中重命名它)。
    

© www.soinside.com 2019 - 2024. All rights reserved.