2016-04-10 110 views
3

我對使用基於Django的應用程序以及嘗試使用以下配置來部署django項目感到陌生,這些配置幾乎與django文檔中給出的默認配置類似。Django部署:配置正確的python以供apache/mod_wsgi使用

apache2.conf

# WSGI Configuration 
WSGIDaemonProcess demo python-path=/home/inian/Documents/demo 
WSGIProcessGroup demo 

WSGIScriptAlias//home/inian/Documents/demo/demo/wsgi.py process-group=demo 

<Directory /home/inian/Documents/demo/demo> 
<Files wsgi.py> 
    Require all granted 
</Files> 
</Directory> 

# Serving static files 
Alias /static/ /home/inian/Documents/demo/static/ 

<Directory /home/inian/Documents/demo/static> 
    Require all granted 
</Directory> 

當我啓動Apache服務器,能正常開機,但給運行時錯誤加載,因爲表示爲波紋管Python版本不匹配,我的項目。

/var/log/apache2/error.log

[Sun Apr 10 20:38:16.165536 2016] [wsgi:warn] [pid 22959] mod_wsgi: Compiled for Python/2.7.11. 
[Sun Apr 10 20:38:16.165551 2016] [wsgi:warn] [pid 22959] mod_wsgi: Runtime using Python/2.7.10. 
[Sun Apr 10 20:38:16.166787 2016] [mpm_prefork:notice] [pid 22959] AH00163: Apache/2.4.7 (Ubuntu) OpenSSL/1.0.1f mod_wsgi/4.5.1 Python/2.7.10 configured -- resuming normal operations 

我想我的應用程序使用安裝在位置/usr/local蟒是2.7.11版本,這是我用來編譯和安裝一個mod_wsgi,但爲了安全起見,我還檢查了/usr/bin/python -V,它給出的輸出爲Python 2.7.6。這使得使用兩個問題:

  1. 我怎麼可以指向apache的使用Python 2.7.11從安裝位置/usr/local/bin/python(我一直在使用默認的服務器上所有的東西)。

  2. 我不記得以前安裝過或者做過任何2.7.10的工作,所以我不知道如何以及從哪裏加載和使用apache。如果有人能指引我,那麼它也會很棒。

+0

這些僅僅是警告,並且這兩個版本是如此接近,你可以簡單地忽略它們。 – Zorgmorduk

+0

呃沒有那些不只是警告,那些是以後運行時錯誤的原因。因爲我不知道2.7.10版本是從哪裏進來的,所以該版本沒有正確編譯'pyUnicodeUCS4_AsEncodedString',我在2.7.11安裝時已經注意到了這一點。所以是的,我需要使用正確的python版本,我已經安裝位置'/ usr/local'位置 – bawejakunal

+0

我指的是:[wsgi:warn]。所以你可以真正的接受它。當然這就是警告的原因,如果你在這兩個版本中使用不同的東西,那麼你可能會遇到問題。機會很低。 – Zorgmorduk

回答

1

這是在針對特定Python安裝編譯mod_wsgi,然後升級Python安裝的情況下的警告消息。由於共享庫的工作原理,通常不應該擔心。這是中記錄:

在你的情況,雖然問題是,你的mod_wsgi的是不反對的Python安裝它在運行時發現Python的共享庫的編譯。這可能會導致各種問題,其中一個就是兩個Python安裝沒有安裝兼容的編譯器標記集,比如那些Unicode字符寬度的安裝位置。

所以基本上這個問題在我看來像你從源代碼編譯mod_wsgi反對在/ usr/local中的Python安裝,但是因爲它是如何構建的對於這種情況是不正確的,所以在運行時找到Python用於安裝到/ usr的版本的共享庫。

有關如何Python中應正確安裝在Linux系統上的大討論去閱讀:

接下來,當你從源代碼編譯的mod_wsgi,確保您設置的LD_RUN_PATH環境變量以包含安裝備用Python安裝的Python共享庫的庫目錄。該環境變量將允許mod_wsgi在運行時找到正確的庫,而不使用/ usr/lib中的版本。

您可以驗證它是通過在按照文檔的說明,尋找錯誤/右一個:

最後,一旦你已經mod_wsgi的安裝並找到正確的共享庫,可能還必須在Apache配置中設置WSGIPythonHome指令,以便它爲運行時文件找到正確的Python安裝。這是在文檔中描述在:

+0

我已經提到我使用Python 2.7.11的全部原因是我用unicode 4支持編譯它,這也是我用來編譯mod_wsgi的原因,因此錯誤日誌正確顯示了'mod_wsgi:Compiled for Python/2.7.1'。因此,直到編譯和安裝'mod_wsgi'的時候,所有的東西都是完美的,就像你所建議的那樣。讓我感到困惑的是'Python 2.7.10',因爲'/ usr/local/bin/python'的UCS4標誌是2.7.11,而UCS2的'/ usr/bin/python'是2.7.6。我已經在我的問題中提到過了。 – bawejakunal

+0

我也嘗試在[你的博客](http://blog.dscpl.com.au/2014/09/using-python-virtual-environments-with.html)上使用'WGIPythonHome',但那不符合' t似乎正在使用'WSGIDaemonProcess'。我甚至試着把'python-home =/usr/local'放在'WSGIDaemonProcess'中,但是即使這樣也行不通,可能是因爲最新版本的mod_wsgi 4.5.1已經停止了。主要的恐懼點是python 2.7.10版本,它甚至不應該在那裏,我不知道它是從哪裏來的。它應該是2.7.6或2.7.11:| – bawejakunal

+0

'ldd/usr/lib/apache2/modules/mod_wsgi.so'給出'/ usr/local/lib/libpython2.7.so.1.0' – bawejakunal