Python

Debian Lenny、Python 2.7 和 mod_wsgi

  • July 15, 2011

我正在執行一個 Debian Lenny 盒子,它帶有 Python 2.5.2。我只想為我的 WSGI 應用程序執行 Python 2.7 *,*將 2.5 作為系統的預設值,但我無法讓它工作。

首先,我將 Python 2.7.2 從原始碼安裝到/usr/local

Python-2.7.2 # ./configure --enable-shared
[…]
Python-2.7.2 # make
[…]
Python-2.7.2 # make altinstall
[…]

python2.7現在從命令行呼叫沒有任何問題。它還可以找到通過pipin安裝的軟體包/usr/local/lib/python2.7/packages

接下來,我手動建構mod_wsgi並將其複製到 Apache 模組目錄,以免觸摸apt-get.

mod_wsgi-3.3 # ./configure --with-python=/usr/local/bin/python2.7
[…]
mod_wsgi-3.3 # make
[…]
mod_wsgi-3.3 # cp .libs/mod_wsgi.so /usr/lib/apache2/modules/mod_wsgi.so-2.7
mod_wsgi-3.3 # cd /usr/lib/apache2/modules
modules # ln -sf mod_wsgi.so-2.7 mod_wsgi.so
modules # ldd mod_wsgi.so-2.7
       linux-vdso.so.1 =>  (0x00007fff08f53000)
       libpython2.7.so.1.0 => /usr/local/lib/libpython2.7.so.1.0 (0x00002b0317e1f000)
       libpthread.so.0 => /lib/libpthread.so.0 (0x00002b03181fd000)
       libdl.so.2 => /lib/libdl.so.2 (0x00002b031841a000)
       libutil.so.1 => /lib/libutil.so.1 (0x00002b031861e000)
       libm.so.6 => /lib/libm.so.6 (0x00002b0318821000)
       libc.so.6 => /lib/libc.so.6 (0x00002b0318aa5000)
       /lib64/ld-linux-x86-64.so.2 (0x00002b03179cd000)

然後我修改/etc/apache2/mods-available/wsgi.conf並添加了以下指令:

<IfModule mod_wsgi.c>
   […]
   WSGIPythonHome /usr/local
   […]
</IfModule>

(當然,wsgi.conf是符號連結的/etc/apache2/mods-enabled。)

最後,我重新啟動了 apache,但我的 WSGI 腳本無法執行。我在 Apache 的錯誤日誌中得到以下回溯:

mod_wsgi (pid=20746): Exception occurred processing WSGI script '/path/to/script.wsgi'.
Traceback (most recent call last):
 File "/usr/local/lib/python2.5/site-packages/Flask-0.7.2-py2.5.egg/flask/app.py", line 1306, in __call__
   return self.wsgi_app(environ, start_response)
 File "/usr/local/lib/python2.5/site-packages/Flask-0.7.2-py2.5.egg/flask/app.py", line 1295, in wsgi_app
   return response(environ, start_response)
 File "/usr/local/lib/python2.5/site-packages/Werkzeug-0.6.2-py2.5.egg/werkzeug/wrappers.py", line 1017, in __call__
   start_response(status, headers)
TypeError: expected byte string object for status, value of type str found

我還嘗試了在’s 文件的安裝問題部分中找到的測試 WSGI 腳本,但我在這裡得到了相同的結果。從回溯來看,我猜 Apache 現在執行 Python 2.5 和為 2.7 編譯的組合。mod_wsgi``TypeError``mod_wsgi

有任何想法嗎?

問題解決了。 mod_python也被載入了,禁用它就可以了。由於它是mod_pythonLenny 的 Apache 附帶的 vanilla,它是針對 Python 2.5.2 編譯的——自然,這不能與mod_wsgi針對不同版本的編譯結合使用。

tl;dr 確保PATHApache 繼承的使用者帳戶看到的是 Python2.7/bin而不是舊版本。

http://modwsgi.googlecode.com/svn/branches/mod_wsgi-1.X/README

“如果您安裝了多個 Python 版本並且您沒有使用預設版本,您可能必須組織 Apache 應用程序在執行時繼承的 PATH 將導致 Apache 找到備用版本。或者,WSGIPythonExecutable 指令應該用於指定與編譯的 Python 版本相對應的“python”執行檔的確切位置。如果不這樣做,則在 Apache 中執行的 Python 版本可能會嘗試使用來自錯誤 Python 版本的 Python 模組。

除此之外,除了在 debian 中執行另一個 debian 之外,沒有什麼可以做的。

http://www.eggdrop.ch/texts/uml/

擁有不同虛擬環境的 Nginx 反向代理。

引用自:https://serverfault.com/questions/290298