我在 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