2011-09-28 51 views
0

這是一個很長的問題,詳細介紹了我從一開始就做的所有事情。希望能幫助到你。 我正在使用django應用程序,需要將其部署到生產服務器上。生產服務器是IT管理的虛擬服務器,我沒有root訪問權限。他們讓我有權管理/ swadm和/ home/swadm中的模塊安裝。 所以我打算做創建以下安排:在RHEL上配置和安裝python2.6.7和mod_wsgi3.3以進行生產

  • /swadm/etc/httpd/conf,我保持的httpd.conf
  • /swadm/etc/httpd/user-modules,我保持我的Apache模塊(mod_wsgi的)
  • /swadm/var/www/django/app,我保持我的Django的代碼
  • /swadm/usr/local/python/2.6在那裏我會保持我的Python 2.6.7安裝與模塊像Django,南等
  • /home/swadm/setup在那裏我將存儲所需的源tarballs並做所有的建設和安裝。
  • /home/swadm/workspace我將在哪裏維護正在開發的應用程序代碼。

該系統安裝了python2.4.3和python2.6.5,但IT建議我維護自己的python安裝,如果我需要大量的自定義模塊安裝(我會)。

於是我下載了python2.6.7源碼。我需要確保安裝了python,以便它的共享庫可用。當我只運行配置腳本--enable-shared--prefix=/swadm/usr/local/python/2.6時,它會被安裝,但令人驚訝地指向系統的安裝python2.6.5。

$ /swadm/usr/local/python/2.6/bin/python 
Python 2.6.5 (r265:79063, Feb 28 2011, 21:55:45) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-50)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 

於是我就從以下說明Building Python with --enable-shared in non-standard location配置腳本

./configure --enable-shared --prefix=/swadm/usr/local/python/2.6 LDFLAGS="-Wl,-rpath /swadm/usr/local/python/2.6/lib" 

而且確保我已經創建的目錄中事先(爲紐帶建議),以避免預期的錯誤。現在輸入/swadm/usr/local/python/2.6/bin/python將啓動正確的python版本2.6.7。所以我開始配置和安裝mod_wsgi。我配置它作爲

./configure --with-python=/swadm/usr/local/python/2.6/bin/python 

已創建嘗試將模塊安裝到/usr/lib64/httpd/modules Makefile中,我沒有寫權限那裏,所以我修改,以安裝到/swadm/etc/httpd/user-modules makefile文件。 (可能有一個命令參數,但我無法弄清楚)。模塊創建正常。我使用的測試腳本WSGI是

import sys 

def application(environ, start_response): 
    status = '200 OK' 
    output = 'Hello World!' 
    output = output + str(sys.version_info) 
    output = output + '\nsys.prefix = %s' % repr(sys.prefix) 
    output = output + '\nsys.path = %s' % repr(sys.path) 
    response_headers = [('Content-type', 'text/plain'), 
        ('Content-Length', str(len(output)))] 
    start_response(status, response_headers) 
    return [output] 

,並顯示輸出是,令人驚訝的

Hello World!(2, 6, 5, 'final', 0) 
sys.prefix = '/swadm/usr/local/python/2.6' 
sys.path = ['/swadm/usr/local/python/2.6/lib64/python26.zip', '/swadm/usr/local/python/2.6/lib64/python2.6/', '/swadm/usr/local/python/2.6/lib64/python2.6/plat-linux2', '/swadm/usr/local/python/2.6/lib64/python2.6/lib-tk', '/swadm/usr/local/python/2.6/lib64/python2.6/lib-old', '/swadm/usr/local/python/2.6/lib64/python2.6/lib-dynload']` 

所以你看莫名其妙的mod_wsgi的模塊仍然有配置與系統的蟒蛇2.6.5安裝,而不是我自定義一個。 我試圖在mod_wsgi documentation

  • WSGIPythonHome在httpd的詳細說明各種各樣的事情。CONF到/swadm/usr/local/python/2.6WSGIPythonPath/swadm/usr/local/python/2.6/lib/python2.6
  • 創建符號鏈接在Python config目錄指向libpython2.6.so文件

    $ LN -s ../../libpython2.6.so

當我做ldd libpython2.6.so這是我所看到的:

$ ldd libpython2.6.so 
linux-vdso.so.1 => (0x00007fffc47fc000) 
libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b666ed62000) 
libdl.so.2 => /lib64/libdl.so.2 (0x00002b666ef7e000) 
libutil.so.1 => /lib64/libutil.so.1 (0x00002b666f182000) 
libm.so.6 => /lib64/libm.so.6 (0x00002b666f385000) 
libc.so.6 => /lib64/libc.so.6 (0x00002b666f609000) 
/lib64/ld-linux-x86-64.so.2 (0x00000031aba00000) 

而且ldd mod_wsgi.so GI容器

$ ldd /swadm/etc/httpd/user-modules/mod_wsgi.so 
linux-vdso.so.1 => (0x00007fff1ad6e000) 
libpython2.6.so.1.0 => /usr/lib64/libpython2.6.so.1.0 (0x00002af03aec7000) 
libpthread.so.0 => /lib64/libpthread.so.0 (0x00002af03b270000) 
libdl.so.2 => /lib64/libdl.so.2 (0x00002af03b48c000) 
libutil.so.1 => /lib64/libutil.so.1 (0x00002af03b690000) 
libm.so.6 => /lib64/libm.so.6 (0x00002af03b893000) 
libc.so.6 => /lib64/libc.so.6 (0x00002af03bb17000) 
/lib64/ld-linux-x86-64.so.2 (0x00000031aba00000) 

我一直在嘗試重新安裝和重新配置python和mod_wsgi,但無濟於事。請讓我知道我出錯的地方。 (對不起,很長的帖子)

TLDR;非root用戶訪問的系統具有默認的python安裝。我維護我自己的Python和Python模塊。使用自定義python配置和構建的mod_wsgi仍然指向系統的python,當我運行一個打印出sys版本信息和路徑的測試腳本時。

UPDATE: 在通過計算器瀏覽(應該早做的話),我發現這個答案由格雷厄姆鄧普爾頓上mod_wsgi python2.5 ubuntu 11.04 problem這解決了錯誤我。現在,當我做ldd mod_wsgi.so我看到它鏈接到正確的共享庫的Python。我現在使用我的自定義python安裝來安裝Django和MySQLdb。現在我面臨着這樣的錯誤:

The following error occurred while trying to extract file(s) to the Python egg 
cache: 
[Errno 13] Permission denied: '/var/www/.python-eggs' 
The Python egg cache directory is currently set to: 
/var/www/.python-eggs 
Perhaps your account does not have write access to this directory? You can 
change the cache directory by setting the PYTHON_EGG_CACHE environment 
variable to point to an accessible directory. 

所以,我沒有做export PYTHON_EGG_CACHE=/swadm/var/www/.python-eggs改變PYTHON_EGG_CACHE值。但我仍然遇到同樣的錯誤。我正在調查更多。當我解決這個問題時會更新。

回答