我在Apache / mod_wsgi下的RHEL实例上运行Django,并且在为Python进程设置一些环境variables时遇到了问题。 所有组件(Apache,Python,mod_wsgi,外部库)都是从源码构build的,而不是从仓库安装的。
具体问题是对Oracle支持的支持。 我能够连接到Oracle实例没有问题,如果我自己启动Python时在命令行上设置ORACLE_HOME和LD_LIBRARY_PATH ,但我似乎无法将这些variables传递给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']='...' )设置variables,所有没有效果。 在前三种情况下,这些variables似乎对Python没有任何作用 – 打印os.environ['ORACLE_HOME']表示没有设置值。
我也尝试从LD_RUN_PATH evn var set的源代码重buildmod_wsgi.so,根据这里的build议: http ://groups.google.com/group/modwsgi/browse_thread/thread/91dfa97330dfca2/474f818304d741d4但是,这也是无效的。
我错过了什么? 我怎样才能让这些环境成功通过? 提前致谢!
在Ubuntu中,放置
export ORACLE_HOME=<your oracle home> export LD_LIBRARY_PATH=<your library path>
在/etc/apache2/envvars似乎做的伎俩。
如果没有其他的帮助,你可以编辑你的Apache启动脚本,并在Apache守护进程启动之前放置上面的输出行(我记得我之前在Debian上做过这样的事情)。
由于您是从源代码构buildApache的,因此您可以将“envvars”文件添加到与“httpd”可执行文件相同的目录中:
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/some/path/to/oracle/lib/directory export LD_LIBRARY_PATH
在编译mod_wsgi时,LD_RUN_PATH方法也可以,但是由于你没有显示你使用的确切的方法,也就是执行的命令,试图去做这个工作,所以不能评论为什么它不起作用。 这将是如此的forms:
make distclean ./configure LD_RUN_PATH=some/path/to/oracle/lib/directory make sudo make install
因此,在运行'make'时,将LD_RUN_PATH设置在同一行。 如果在运行“make”之前将其单独设置为环境variables,则必须“导出”环境variables,否则make将不会将其传递给编译器。
关键似乎是将Oracle库添加到ld.so.conf 。
另一个可能的解决scheme是在启动脚本中设置LD_LIBRARY_PATH – 例如在/etc/init.d/httpd :
export ORACLE_HOME=<your oracle home> export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib