2011-09-17 29 views
0

這是我的應用環境:爲什麼Django會忽略一些env變量,除非我在重新啓動時將它們傳遞給httpd?

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) 

問題: 訪問我的Django的網站從Web瀏覽器,因爲cx_Oracle不能獲得甲骨文手柄失敗。

測試:

  1. 運行django-admin.py外殼查詢數據庫不工作(從ORACLE_HOME一個bash會話中運行以及LD_LIBRARY_PATH乏設置)
  2. 運行自定義腳本,將ORACLE_HOME和LD_LIBRARY_PATH到os.environ並使用cx_Oracle連接到數據庫,而不使用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」相同的自定義腳本DOES WORK
  5. 修改django.db.backends.oracle.base.py,以便在Database.connect語句之前,我有os。 ENVIRON打印到文件顯示我有ORACLE_HOME和LD_LIBRARY_PATH設置正確
  6. 明確設置ORACLE_HOME和LD_LIBRARY_PATH在裏面即興os.environment Django的wsgi.py腳本不起作用
  7. 重啓httpd,以「命令ENV ORACLE_HOME = FOO LD_LIBRARY_PATH = foo /etc/init.d/httpd restart「DOES WORK

我的問題是:爲什麼測試7與測試2,5,6不同?換句話說,爲什麼我必須將env vars傳遞給父httpd進程,而不是將它們設置爲python/django腳本?

回答

0

LD_LIBRARY_PATH必須位於執行進程之前的環境中。進程運行時加載程序只會在啓動時讀取一次,在啓動進程後更改環境值沒有區別。這只是事情的工作方式。

+0

我明白了,謝謝!那麼,有沒有更好的方法來啓動httpd傳遞env變量,除了通過env命令調用它? – ftartaggia

+0

如果您使用的Apache發行版遵循Apache軟件基金會的規定,您可以將環境變量設置設置爲與「envvars」文件位於Apache可執行文件相同的目錄中。其他發行版要求您將其粘貼到啓動腳本所提供的Apache init.d啓動文件或關聯的環境文件中。 –

+0

非常感謝您的幫助! – ftartaggia

相關問題