0

这是我的应用环境:

Redhat 6.0
Apache 2.2
Django 1.3.0
Python 2.6.6
cx_Oracle 5.1
mod_wsgi 3.2
Oracle DBMS 11.2 (on a different machine)

问题:从 Web 浏览器访问我的 django 网站失败,因为 cx_Oracle 无法获取 Oracle 句柄。

测试:

  1. 运行 django-admin.py shell 来查询 db DOES WORK(从设置了 ORACLE_HOME 和 LD_LIBRARY_PATH 变量的 bash 会话运行)
  2. 运行自定义脚本,将 ORACLE_HOME 和 LD_LIBRARY_PATH 添加到 os.environ 并使用 cx_Oracle 连接到 DB,而不使用 django DOES WORK(从设置了 ORACLE_HOME 和 LD_LIBRARY_PATH 变量的 bash 会话运行)
  3. 使用“sudo -u apache”运行相同的自定义脚本不起作用
  4. 使用“sudo -u env ORACLE_HOME=foo LD_LIBRARY_PATH=foo myscript.py”运行相同的自定义脚本确实有效
  5. 修改 django.db.backends.oracle.base.py 以便在 Database.connect 语句之前,我将 os.environ 打印到一个文件中,显示我已经正确设置了 ORACLE_HOME 和 LD_LIBRARY_PATH
  6. 在 adhoc django wsgi.py 脚本中的 os.environment 中显式设置 ORACLE_HOME 和 LD_LIBRARY_PATH 不起作用
  7. 使用“sudo env ORACLE_HOME=foo LD_LIBRARY_PATH=foo /etc/init.d/httpd restart”重新启动 httpd 确实有效

我的问题是:为什么测试 7 与测试 2、5、6 不同?换句话说,为什么我必须将 env vars 传递给父 httpd 进程,而不仅仅是在 python/django 脚本中设置它们?

4

1 回答 1

0

LD_LIBRARY_PATH 必须在执行进程之前位于环境中。进程运行时加载器只会在启动时读取一次,在进程启动后更改环境的值没有任何区别。这就是事情的运作方式。

于 2011-09-18T03:23:44.020 回答