当前位置: 首页 > 面试题库 >

使用virtualenv或以与系统默认版本不同的版本运行mod_wsgi

谯志诚
2023-03-14
问题内容

我试图使我的Flask应用程序在CentOS服务器上工作。基本上,问题是我安装了python 2.6,/usr/bin这是系统默认值,而Python
3.4则安装在/usr/local/bin。我想对mod_wsgi使用Python 3.4 virtualenv或至少Python
3.4解释器来运行我的应用程序。

我在中创建了virtualenv ~/virtualenvs/flask

我有这个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设置为系统默认值的正确方法?


问题答案:

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

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

您可以在mod_wsgi文档中找到这两个命令的所有选项。

请注意,您必须具有与python可执行文件兼容的mod_wsgi版本。在您的情况下,您可能必须安装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>


 类似资料:
  • 问题内容: 我有一个目前使用python 2.5.4运行的系统。我正确安装了,一切正常。我是否可以将与其他版本的Python一起使用? 我编译了Python 2.6.2,并希望将其与一些一起使用。覆盖二进制文件是否足够?还是我必须更改有关库的某些内容? 问题答案: 在创建实例时,只需使用(或)选项来指定要使用的Python可执行文件,例如:

  • 问题内容: 我想使用MAMP的PHP版本,而不是Mac上安装的默认版本。我尝试使用 但出现“文件存在”错误。解决此问题的最佳方法是什么,因此我可以只键入php而不是完整路径? 问题答案: 我不建议您尝试修改命令行上调用的PHP的默认版本。如果您决定升级操作系统,这样做可能会破坏系统的其他部分,并在将来给您带来问题。 有一种替代方案可以满足您的需求。您可以为MAMP的php 5.3副本创建别名。就我

  • 我最近安装了蟒蛇版本的Python。现在,当我在终端中键入python时,它会打开Anaconda发行版,而不是默认发行版。如何让它在windows上使用命令python的默认版本?我已经将分发添加到路径中,但当我键入python--version时,它显示的是conda版本,而不是系统版本。

  • 获取系统版本信息 参数说明 字段 类型 必须? 说明 deviceId String 是 设备Id completion 是 结果回调 接口定义 Swift: RokidMobileSDK.device.getVersion(deviceId: String, completion: @escaping (_ error: Error?, _ versionInfo: RKDeviceVersio

  • 获取系统版本信息 接口说明 获取当前设备的系统版本信息 返回的消息将以Event的形式向上抛。 返回值 只表示 获取系统版本信息是否已经发送成功。 参数说明 字段 类型 必须? 说明 deviceId String 是 设备ID 示例代码: Kotlin RokidMobileSDK.device.getVersionInfo(deviceId, object : IChannelPublishC

  • 首先也是最重要的是,我对Java知之甚少,对SWT更是知之甚少,所以我就到此为止。今天早些时候,我试着运行我在上找到的这个简单程序https://mkyong.com/swt/swt-hello-world-example 以下是代码: 当我运行它时,会出现以下错误: 我从中了解到的是,SWT正在用Java11编译,而它应该用Java8编译,但是——这是一个很大的BUT——我没有Java11我删除