配置這個Python + wsgi + django, 可謂曲折。來看:
***********************
安裝環境:
Centos5.6
Python2.7
Mod_wsgi: mod_wsgi-4.4.13
Apache: httpd2.2
Django: Django-1.8.3
***********************
1. 安裝Python: Python2.7
本來系統裡已經內建了Python2.6, 為了我的追求極致,裝逼的完美主義,我又安裝了Python3.4. 並且把 /usr/local/bin/python 直接指向Python3.4. 將其設為python的主要程式。
此處就為悲劇的根源了。因為Python3 和 mod_wsgi 不相容 (註:至少到現在我還沒有找到能用使用python3 來安裝的wsgi),我安裝的時候直接使用 ./Configure make makeinstall 命令,導致系統先擇了將apache 的python版本設定成了python2.6. (註:wsgi: 即為 the python web server gateway interface, 其作用就是apache能通過它來串連並使用Python)
但是由於我的django是用Python3安裝的。最終導致apache根本就串連不上django, 我查詢httpd下的error_log來回無數遍,終於發現httpd使用的是python2.6。所以只能果斷使用python2了, 但是新的問題又出現了,因為下載的django版本過高,python2.6安裝不了,所以最終結果就是:安裝python2.7!
命令:
tar -xvf Python-2.7.10.tgz
cd Python-2.7
./configure --enable-shared
make
make install
可能遇到問題:python: error while loading shared libraries: libpython2.7.so.1.0:
cannot open shared object file: No such file
原因: python2.7 的庫找不到了
解決方案:1. 進入/etc/ld.so.conf.d/,
2. 建立檔案:vim python2.7.conf
3. 添加python2.7的庫的所在路徑: /usr/local/lib
4. 儲存並退出,然後執行命令:ldconfig
2. 安裝django: Django-1.8.3
直接進入安裝包檔案夾使用python安裝
tar xzvf Django-1.8.3 .tar.gz
cd Django-1.8.3
sudo python setup.py install
3. 安裝mod_wsgi: mod_wsgi-4.4.13
下載地址:https://pypi.python.org/pypi/mod_wsgi
安裝命令:
./configure --with-python=/usr/local/bin/python2.7
make
make install
可能遇到問題:
3-1. apxs: command not found
原因: apache 組件 httpd-devel 沒有安裝
解決辦法: yum install httpd-devel
3-2. 在make時編譯失敗。查看錯誤第一行,發現:Sorry, Python developer package does not appear to be installed.
原因:python組件 python-devel沒有安裝
解決辦法: yum install python-devel
4. 配置httpd(註:此目的為能讓httpd能通過wsgi來使用python,並訪問django的網站目錄) 非常重要,也很容易出問題:
4-1. 為httpd添加wsgi的動態連結程式庫.so檔案的連結:
1. vim /etc/httpd/conf/httpd.conf
2. 新增內容:LoadModule wsgi_module modules/mod_wsgi.so
3. 儲存退出。
4-2. 繼續修改httpd.conf, 添加django項目的路徑,比如我建立的django網站的路徑為:/var/www/html/mysite, 則配置為如下:
WSGIPythonPath /var/www/html/mysite
WSGIScriptAlias / "/var/www/html/mysite/mysite/wsgi.py"
<Directory "/var/www/html/mysite/mysite">
Order Allow,Deny
Allow from all
<Files wsgi.py>
Order allow,deny
Allow from all
</Files>
</Directory>
4-3. 配置wsgi檔案
一般django產生項目時會自動幫你配置好wsgi.py檔案。不需要自己配的,前提是你的wsgi得裝好了。我的/var/www/html/mysite/mysite/wsgi.py 內容如下:
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
5. 重啟httpd service: service httpd restart
至少則配置問題基本解決. 如果遇到新的問題,就得上stackoverflow再去查一下了。
apache+wsgi+django配置
WSGI是什嗎?
WSGI的官方定義是,the Python Web Server Gateway Interface。從名字就可以看出來,這東西是一個Gateway,也就是網關。網關的作用就是在協議之間進行轉換。
也就是說,WSGI就像是一座橋樑,一邊連著web伺服器,另一邊連著使用者的應用。但是呢,這個橋的功能很弱,有時候還需要別的橋來幫忙才能進行處理。
Django 是什嗎?
Django(發音:/ˈdʒæŋ?oʊ/ JANG-goh) 是用python語言寫的開源web開發架構(open source web framework),它鼓勵快速開發,並遵循MVC設計。Django遵守 BSD著作權,初次發佈於2005年7月, 並於2008年9月發布了第一個正式版本1.0 。最新發行版本是Django 1.3.1,於2011年09月10日發布.
Django 根據比利時的爵士音樂家Django Reinhardt命名,他是一個吉普賽人,主要以演奏吉它為主,還演奏過小提琴等。
設計哲學
Django的主要目的是簡便、快速的開發資料庫驅動的網站。它強調代碼複用,多個組件可以很方便的以“外掛程式”形式服務於整個架構,Django有許多功能強大的第三方外掛程式,你甚至可以很方便的開發出自己的工具包。這使得Django具有很強的可擴充性。它還強調快速開發和DRY(Do Not Repeat Yourself)原則。
Django基於MVC的設計十分優美:
對象關係映射 (ORM,object-relational mapping)
以Python類形式定義你的資料模型,ORM將模型與關聯式資料庫串連起來,你將得到一個非常容易使用的資料庫API,同時你也可以在Django中使用原始的SQL語句。
URL 指派
使用Regex匹配URL,你可以任意設計的URL,沒有架構的特定限定。象你喜歡的一樣靈活。
模版系統
使用Django強大而可擴充的範本語言,可以分隔設計、內容和Python代碼。並且具有可繼承性。
表單處理
你可以方便的產生各種表單模型,實現表單的有效性檢驗。可以方便的從你定義的模型執行個體產生相應的表單。
Cache系統
可以掛在記憶體緩衝或其它的架構實現超級緩衝 -- 實現你所需要的粒度。
會話(session),使用者登入與許可權檢查
快速開發使用者會話功能。
國際化
內建國際化系統,方便開發出多種語言的網站。
自動化的管理介面
不需要你花大量的工作來建立人員管理和更新內容。Django內建一個ADMIN site,類似於內容管理系統。
軟體版本:
作業系統:Archlinux Kernel 3.1.0-4-ARCH x86_64
WEB伺服器: Apache/2.2.21
Python: Python/2.7.2
Django: 1.3.1
wsgi: mod_wsgi/3.3
1. 安裝apache和python
在Archlinux上我已經用pacman安裝好了apahce和python,接下來安裝mod_wsgi
2. 安裝WSGI
pacman -S mod_wsgi
這裡是Archlinux,如果是其他動作系統,請google。
安裝好之後,會產生mod_wsgi的apache模組,位置在 /usr/lib/httpd/modules/mod_wsgi.so。
在apache的設定檔裡載入模組:
LoadModule wsgi_module modules/mod_wsgi.so
3. 配置apache虛擬機器主機
<VirtualHost *:80>
ServerName webpy.test.com
WSGIScriptAlias / /home/max/mysite/django.wsgi
<Directory "/home/max/mysite">
Options FollowSymLinks Indexes
AllowOverride all
Order Deny,Allow
Allow from all
</Directory>
ErrorLog "/var/log/httpd/webpy-error.log"
CustomLog "/var/log/httpd/webpy-access.log" combined
</VirtualHost>
上面紅色的一行是讓載入django的wsgi設定檔(django本身就支援WSGI協議)
4. 安裝django
shell> pacman -S django
也可以選擇下載源碼安裝,因為django本身全部用python編程,所以下載django的安裝包之後,進入到
django源碼目錄,執行以下命令即可安裝django:
shell> python setup.py install
5. 配置django
我們現在建立一個django的項目,建立好專案檔夾之後,django會自動產生一些專案檔:
shell> django-admin.py startproject mysite
django-admin.py是django本身的一個管理程式,除了用於建立項目之外,還有很多用途。
mysite是建立的項目名稱,這樣就會在目前的目錄下產生一個mysite的檔案夾。
__init__.py __init__.pyc manage.py settings.py urls.py
上面就是mysite目錄下的檔案,這是django項目的初始檔案。
6. 配置django的wsgi檔案
在mystei目錄下建立一個django.wsgi檔案,內容如下:
import os
import sys
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
path = '/home/max'
if path not in sys.path:
sys.path.append(path)
mysite.settings是mysite項目的設定檔,django項目的設定檔就是python代碼;在mysite目錄下可以看到settings.py檔案。
由於目前的目錄沒有在系統的PATH變數裡,所以mod_wsgi無法尋找到settings.py檔案,為了幫它找到,
我們把mysite目錄的上一級目錄,追加到PATH變數裡。
sys.path.append(path)
7. 啟動django項目
重啟apache伺服器
shell> apachectl restart
在瀏覽器開啟 http://webpy.test.com,即可看到django的歡迎頁面。
啟動django的項目其實還有一種更快的方式,就是在mysite項目的目錄下,執行:
shell> python manage.py runserver 8000
會出現以下資訊:
Django version 1.3.1, using settings 'mysite.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
這是瀏覽器開啟http://127.0.0.1:8000,即可看到django的淡藍色頁面。
這其實啟動程式開發伺服器,它每次只能伺服器一個使用者,所以不能在生產環境使用它。