Ram*_*hum 2 linux python django mod-wsgi apache-2.2
我是 Linux 新手。
我正在管理一个(Linux - Apache - mod_wsgi - Django)服务器,其中有多个 Python 安装。该站点目前正在运行,但我想找出使用哪个 Python 可执行文件来运行它。我知道这不是默认的。
另外,mod_wsgi 如何知道要使用哪个 Python 安装?该.wsgi脚本没有shebang行。
这 #!行未被使用,通常不会被放入 mod_wsgi 使用的 WSGI 脚本文件中。
要确定使用哪个版本/安装的 Python,它有两个部分。
其他人指出的第一个是确定链接到哪个 Python 库 mod_wsgi.so。在大多数 UNIX 系统上,这是使用“ldd”命令完成的。
ldd mod_wsgi.so
Run Code Online (Sandbox Code Playgroud)
在安装到正在使用的 Apache 模块目录中的实际 mod_wsgi.so 上运行它。这将告诉您确定是针对哪个版本的 mod_wsgi 编译的。
如果您没有看到对 libpythonX.Y.so 文件的引用,那么您的 mod_wsgi.so 是针对 Python 库静态链接的。尽管这会起作用,但只要 mod_python 没有加载到同一个 Apache 中,依赖它是一个非常糟糕的主意,因为使用 Python 库的静态链接会由于运行时代码重定位而导致 Apache 进程不必要的膨胀在使用静态链接的 Python 库加载 mod_wsgi.so 时完成。
请注意,在 mod_wsgi 下运行时 'sys.executable' 的值没有意义,不能用作确定使用哪个 Python 版本的方法。这是因为没有使用命令行 Python。相反,正在运行的可执行文件实际上是 Apache,而 sys.executable 很可能会反映这一点。只有在运行 Apache 并加载 mod_wsgi.so 之后,Python 才会使用嵌入式 Python API 进行初始化。同样,运行“which python”也无助于确定正在使用的 Python 的确切安装。
第二部分是确定运行时实际使用了哪些 Python 安装。为此,您应该使用 WSGI hello world 程序并修改它以转储“sys.prefix”的值。这会告诉您 Python 安装所在的根目录。根据使用的 Python 共享库的版本,您将知道正在使用该根目录下的哪个实际“lib/pythonX.Y”目录。版本很重要,因为很可能在该根目录下安装了多个版本。
请注意,您从 'sys.prefix' 获得的内容实际上可能与根目录不同,因为您认为它可能基于 mod_wsgi.so 文件的 libpythonX.Y.so 依赖项。这是因为 Python 在初始化时试图找到它的“lib”目录的方式。
例如,如果您在“/usr/local”下安装了 Python 2.6,在“/usr”下安装了另一个,但是您针对“/usr/local”下的那个编译了 mod_wsgi,您可能仍然会发现“sys.prefix”解析为'/usr'。这是因为在嵌入式系统中,默认情况下 Python 会查看 'PATH' 环境变量的值以获取搜索路径以找到一个 'python' 可执行文件作为计算根目录的基点,即使该 'python' 可执行文件不用于开始这个过程。
在 Apache 下,因为它通常以 'root' 启动,所以它不一定在您的 'PATH' 中有 '/usr/local/bin',因此可能会找到 '/usr/bin/python' 并因此使用 '/ usr' 为 'sys.prefix'。
在后一种场景中,它找到与您要使用的根目录不同的根目录,可以使用 Apache 配置中的 WSGIPythonHome 指令来覆盖自动计算的“sys.prefix”。
请注意,您不能使用 WSGIPythonHome 来引用不同版本的 Python,它必须引用包含相同主要/次要版本的 Python 安装的根目录。如果您需要使用不同版本的 Python,则必须重新编译并重新安装 mod_wsgi,以便针对不同版本进行编译。编译时要使用的 Python 的实际版本/安装可以在构建时使用 mod_wsgi 配置脚本的“--with-python”选项指定。
除了使用 WSGIPythonHome 指令来覆盖使用的 Python 安装之外,还有其他方法,但建议您坚持使用 WSGIPythonHome。
| 归档时间: |
|
| 查看次数: |
6165 次 |
| 最近记录: |