在 mod_wsgi 中为 Django 设置环境变量

在 mod_wsgi 中为 Django 设置环境变量

我在 Apache/mod_wsgi 下的 RHEL 实例上运行 Django,在为 Python 进程设置一些环境变量时遇到问题。所有组件(Apache、Python、mod_wsgi、外部库)都是从源代码构建的,而不是从存储库安装的。

具体问题是对 Oracle 支持的支持。如果我在启动 Python 时自己在命令行上设置ORACLE_HOME和,我就可以毫无问题地连接到 OracleLD_LIBRARY_PATH实例,但我似乎无法将这些变量传递到 WSGI 进程。

我在 Apache 日志中收到的具体错误消息是:

ImproperlyConfigured: Error loading cx_Oracle module: libclntsh.so.11.1: cannot open shared object file: No such file or 

目录

我尝试在 VirtualHost (使用SetEnv)、Apache 的 envvars 文件、apache 用户的 .bashrc 文件和 .wsgi 文件 (使用os.environ['ORACLE_HOME']='...') 中设置变量,但均无效。在前三种情况下,变量似乎根本没有作用到 Python——打印os.environ['ORACLE_HOME']表明未设置任何值。

我还尝试LD_RUN_PATH根据此处的建议,使用 evn var 设置从源代码重建 mod_wsgi.so:http://groups.google.com/group/modwsgi/browse_thread/thread/91dfa97330dfca2/474f818304d741d4 但这种方法也是无效的。

我遗漏了什么?如何才能成功传递这些环境变量?提前致谢!

答案1

在 Ubuntu 中,放置

export ORACLE_HOME=<your oracle home>
export LD_LIBRARY_PATH=<your library path>

似乎/etc/apache2/envvars可以达到目的。

如果没有其他帮助,您可以编辑 Apache 启动脚本并在 Apache 守护进程启动之前放置上述导出行(我记得我很久以前在 Debian 上做过类似的事情)。

答案2

由于您是从源代码构建 Apache,因此您可以将以下行添加到与“httpd”可执行文件位于同一目录中的“envvars”文件中:

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/some/path/to/oracle/lib/directory
export LD_LIBRARY_PATH

编译 mod_wsgi 时,LD_RUN_PATH 方法也应该有效,但由于您没有展示您使用的确切方法(即执行的命令)来尝试实现该方法,因此无法评论为什么它不起作用。但它的形式如下:

make distclean
./configure
LD_RUN_PATH=some/path/to/oracle/lib/directory make
sudo make install

因此,在运行“make”时在同一行中设置 LD_RUN_PATH。如果在运行“make”之前将其单独设置为环境变量,则必须“导出”环境变量,否则 make 将不会将其传递给编译器。

答案3

关键似乎是将 Oracle 库添加到ld.so.conf

答案4

另一个可能的解决方案是在启动脚本中设置 LD_LIBRARY_PATH——例如/etc/init.d/httpd

export ORACLE_HOME=<your oracle home>
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib

相关内容