apache 使用virtualenv或版本不同于系统默认值的Python运行mod_wsgi

snz8szmq  于 2022-11-25  发布在  Apache
关注(0)|答案(4)|浏览(123)

我正在尝试让我的Flask应用程序在CentOS服务器上运行。基本上问题是我在/usr/bin中安装了系统默认的Python 2.6,而在/usr/local/bin中安装了Python 3.4。我希望使用Python 3.4 virtualenv或至少Python 3.4解释器来运行我的应用程序。
我已经在~/virtualenvs/flask中创建了virtualenv。
我有这个WSGI脚本:

import os
import sys
from logging import Formatter, FileHandler

APP_HOME = r"/home/fenikso/Album"

activate_this = os.path.join("/home/fenikso/virtualenvs/flask/bin/activate_this.py")
execfile(activate_this, dict(__file__=activate_this))

sys.path.insert(0, APP_HOME)
os.chdir(APP_HOME)

from app import app

handler = FileHandler("app.log")
handler.setFormatter(Formatter("[%(asctime)s | %(levelname)s] %(message)s"))
app.logger.addHandler(handler)
application = app

以及Apache中的以下配置:

<VirtualHost *:80>
        ServerName album2.site.cz
        Alias /static "/home/fenikso/Album/static"
        Alias /photos "/home/fenikso/Album/photos"
        Alias /thumbs "/home/fenikso/Album/thumbs"
        WSGIScriptAlias / "/home/fenikso/Album/wsgi.py"
        <Directory "/home/fenikso/Album">
            AllowOverride None
            Allow from all
        </Directory>
        <Directory "/home/fenikso/Album/static">
            AllowOverride None
            Allow from all
        </Directory>
        <Directory "/home/fenikso/Album/photos">
            AllowOverride None
            Allow from all
        </Directory>
        <Directory "/home/fenikso/Album/thumbs">
            AllowOverride None
            Allow from all
        </Directory>
</VirtualHost>

但是,在尝试运行应用程序时,我收到一个错误:

Apache/2.2.15 (Unix) DAV/2 mod_wsgi/3.2 Python/2.6.6 mod_fcgid/2.3.7 PHP/5.3.3 mod_ssl/2.2.15 OpenSSL/1.0.1e-fips SVN/1.6.11 mod_perl/2.0.4 Perl/v5.10.1 configured -- resuming normal operations
mod_wsgi (pid=14627): Target WSGI script '/home/fenikso/Album/wsgi.py' cannot be loaded as Python module.
mod_wsgi (pid=14627): Exception occurred processing WSGI script '/home/fenikso/Album/wsgi.py'.
Traceback (most recent call last):
   File "/home/fenikso/Album/wsgi.py", line 15, in <module>
     from app import app
   File "/home/fenikso/Album/app.py", line 1, in <module>
     from flask import Flask
 ImportError: No module named flask

我已经注意到,Python 2.6正在运行,而我的virtualenv没有被激活。什么是正确的方法来使其工作,并仍然将Python 2.6作为系统默认值?

t5zmwmid

t5zmwmid1#

您必须在apache.conf中添加以下行,以便给予正确的可执行文件和virtualenv的路径。

WSGIPythonHome /usr/local/bin
WSGIPythonPath /home/fenikso/virtualenv/lib/python3.4/site-packages

您可以在mod_wsgi文档中找到这两个命令的所有选项
请注意,mod_wsgi的版本必须与python可执行文件兼容,在您的情况下,可能需要安装mod_wsgi3.4并配置apache使用它,而不是标准的mod_wsgi模块。
整个配置文件应为:

WSGIPythonHome "/usr/local/bin"
WSGIPythonPath "/home/fenikso/virtualenv/lib/python3.4/site-packages"

<VirtualHost *:80>
        ServerName album2.site.cz
        Alias /static "/home/fenikso/Album/static"
        Alias /photos "/home/fenikso/Album/photos"
        Alias /thumbs "/home/fenikso/Album/thumbs"
        WSGIScriptAlias / "/home/fenikso/Album/wsgi.py"
        <Directory "/home/fenikso/Album">
            AllowOverride None
            Allow from all
        </Directory>
        <Directory "/home/fenikso/Album/static">
            AllowOverride None
            Allow from all
        </Directory>
        <Directory "/home/fenikso/Album/photos">
            AllowOverride None
            Allow from all
        </Directory>
        <Directory "/home/fenikso/Album/thumbs">
            AllowOverride None
            Allow from all
        </Directory>
</VirtualHost>
iqxoj9l9

iqxoj9l92#

查看WSGIPythonHome和WSGIPythonPath指令。也有可能你已经安装了python2.6 mod_wsgi,mod_wsgi必须为预期的python版本和does not support multiple python versions编译。所以检查你的mod_wsgi是否与py3.4兼容,并设置上面的指令。
或者,你也可以在gunicorn这样的python服务器上运行flask应用程序,以及从apache到gunicorn的proxypass。

bvk5enib

bvk5enib3#

另一个选择,我相信是更干净,逻辑,和灵活的,是简单地从你的venv引用python解释器在你的wsgi文件的开始.这样,它很容易改变(没有摆弄系统配置文件),并打开了多个应用程序运行在不同的python环境的可能性,如下所示:

#!/path/to/your/venv/bin/python
jgwigjjp

jgwigjjp4#

如果系统上安装的python版本与虚拟环境中使用的python版本不同,则mod_wsgi将无法工作,因为mod_wsgi始终针对特定的python版本进行编译。
在这种情况下,您需要在虚拟环境中安装mod_wsgi

pip install mod_wsgi-standalone

那么应该加载这样一个模块,而不是系统中安装的默认模块。
以Ubuntu为例,修改/etc/apache2/mods-available/wsgi.load中模块的路径

LoadModule wsgi_module /home/user/etc/.venv/lib/python3.9/site-packages/mod_wsgi/server/mod_wsgi-py39.cpython-39-x86_64-linux-gnu.so

然后,为了避免错误“no such file or directory: mod_wsgi (pid=XXXX): Couldn't bind unix domain socket '/usr/local/opt/httpd/logs/wsgi.xxxxx.11.1.sock“,应将其添加到httpd.conf文件中:

WSGISocketPrefix /var/run/wsgi

重新启动apache后,一切都应该正常工作

相关问题