Apache是最流行的Web服務(wù)器之一,mod_wsgi是Apache的模塊之一,可用于把Python應(yīng)用程序托管到Apache服務(wù)器上。這種方法是部署Django應(yīng)用相對簡單的方法。
在Ubuntu 14.04版,默認安裝中包含了Python。下面開始利用mod_wsgi部署Django應(yīng)用。
二、創(chuàng)建Django應(yīng)用程序
在本節(jié)中,我們要安裝所需的軟件包,并構(gòu)建一個Hello World的Django應(yīng)用程序,并通過mod_wsgi模塊提供服務(wù)。這里假設(shè)你已經(jīng)登錄到新創(chuàng)建的虛擬機。
1、創(chuàng)建一個Ubuntu虛擬機
創(chuàng)建一個操作系統(tǒng)為Ubuntu 14.04 x64的Linux虛擬機,物理機也可以。步驟略。
2、安裝Python包管理器
使用Ubuntu的包管理器apt-get,安裝Python包管理器。注意,使用前需先對Ubuntu的包管理器進行更新。
#sudoapt-getupdate
Pip是Python語言的包管理器,它可以幫助我們安裝、修改、卸載Python包。要安裝pip非常簡單,執(zhí)行命令:
#sudoapt-getinstallpython-pip
apt-get工具會自帶安裝pip的最新穩(wěn)定版。但是,如果你想安裝指定版本的pip,可以考慮從源碼安裝。
參考:https://pip.pypa.io/en/latest/installing.html
還可以使用easy_install來替代pip,它有相似的功能。
3、安裝Django
要從頭創(chuàng)建項目,需要先安裝Django軟件包。執(zhí)行命令:
#sudopipinstallDjango
要想指定Django的安裝版本,比如1.5.5版,可以這樣:
#sudopipinstallDjango==1.5.5
當(dāng)然,你仍然可以使用Ubuntu的包管理器apt-get來安裝Django,但這可能安裝的不是最新穩(wěn)定版的Django。
4、安裝其他依賴
如果要部署一個已有的你大爺項目,可以遞歸運行pip來安裝項目的依賴。通常,在項目的源碼目錄存在一個名為requirements.txt的配置文件,它包含了運行項目所需的依賴包:
#pipinstall-rrequirements.txt
如果項目還包含了其他的Python項目,那么可能會有不同版本的Python包會造成彼此干擾。解決辦法是使用virtualenv,它可以讓每個Python項目在自己的虛擬Python環(huán)境中運行,彼此間是隔離的。
這里有一個virtualenv的教程:https://www.digitalocean.com/community/tutorials/common-python-tools-using-virtualenv-installing-with-pip-and-managing-packages
如果正在開發(fā)Django應(yīng)用程序,你可能想創(chuàng)建或更新配置文件,可以執(zhí)行命令:
#pipfreeze>requirements.txt
pip freeze命令會打印出當(dāng)前環(huán)境中已經(jīng)安裝了的Python包,大于符號“>”會把命令的執(zhí)行結(jié)果輸出到指定的requirements.txt配置文件中。
5、創(chuàng)建Hello World應(yīng)用程序
要創(chuàng)建名為helloworld的Django應(yīng)用,運行命令:
#django-admin.pystartprojecthelloworld
要注意,會創(chuàng)建一個名為helloworld的新目錄。要運行此項目,可以這樣:
#cdhelloworld/
#django-admin.pystartapphelloapp
在瀏覽器中可以看到Hello World的輸出。下面,接著在項目中添加settings.py,找到INSTALLED_APPS處,添加以下內(nèi)容:
INSTALLED_APPS=(
\\\’django.contrib.auth\\\’,
\\\’django.contrib.contenttypes\\\’,
\\\’django.contrib.sessions\\\’,
\\\’django.contrib.sites\\\’,
\\\’django.contrib.messages\\\’,
\\\’django.contrib.staticfiles\\\’,
\\\’helloapp\\\’
)
接著,在urls.py中添加URL路由模式,內(nèi)容如下:
urlpatterns=patterns(\\\’\\\’,
#Examples:
#url(r\\\’^$\\\’,\\\’helloworld.views.home\\\’,name=\\\’home\\\’),
url(r\\\’^\\\’,\\\’helloapp.views.home_view\\\’),
)
它會指示Django在views.py中尋找home_view函數(shù)。因此,修改views.py的內(nèi)容如下:
fromdjango.httpimportHttpResponse
defhome_view(request):
returnHttpResponse(\\\’HelloWorld\\\’)
下面,我們可以運行開發(fā)服務(wù)器了:
#pythonmanage.pyrunserver
在GitHub上有本項目的源碼:https://github.com/sdaityari/django-hello-world
三、使用Apache和mod_wsgi模塊運行Django應(yīng)用
Django項目的目錄結(jié)構(gòu)后面有說明,下面需要安裝并配置Apache服務(wù)器。
1、安裝Apache2
使用apt-get命令完成Apache2的安裝。
#sudoapt-getinstallapache2
2、安裝mod_wsgi模塊
仍然可以使用apt-get命令安裝mod_wsgi模塊。
#sudoapt-getinstalllibapache2-mod-wsgi
要注意,如果使用的是Python3,那么命令應(yīng)該是這樣的:
#sudoapt-getinstalllibapache2-mod-wsgi-py3
詳細的安裝過程可以參考:
https://www.digitalocean.com/community/tutorials/installing-mod_wsgi-on-ubuntu-12-04
3、修改目錄結(jié)構(gòu)
要使得Django應(yīng)用程序能通過mod_wsgi模塊提供服務(wù),我們還需要編寫WSGI腳本,用此腳本來完成Apache服務(wù)器和Django應(yīng)用之間的連接。Django應(yīng)用的目錄結(jié)構(gòu)如下所示:
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
myapp/
models.py
views.py
我們需要做一點修改,讓mysite目錄包含三個文件:
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
apache/
__init__.py
override.py
wsgi.py
myapp/
models.py
views.py
這樣的話,邏輯非比較清晰。
注意,如果使用了如Git之類的源碼控制工具,那么可以把apache目錄添加到忽略列表。
4、創(chuàng)建WSGI腳本
空文件init.py會告訴Python,把此目錄當(dāng)成是包來對待。override.py會導(dǎo)入所有的設(shè)置,并覆蓋任何用于生產(chǎn)狀態(tài)的設(shè)置。
比如生產(chǎn)狀態(tài)的數(shù)據(jù)庫設(shè)置和Debug設(shè)置可能會與開發(fā)狀態(tài)有所不同,要在源碼中區(qū)別開來,需要這樣:
#override.py
frommysite.settingsimport*
DEBUG=True
ALLOWED_HOSTS=[\\\’www.mydomain.com\\\’,\\\’mydomain.com\\\’]
最后,wsgi.py文件包含了WSGI的設(shè)置。假定根目錄是/home/myuser/:
#wsgi.py
importos,sys
#CalculatethepathbasedonthelocationoftheWSGIscript.
apache_configuration=os.path.dirname(__file__)
project=os.path.dirname(apache_configuration)
workspace=os.path.dirname(project)
sys.path.append(workspace)
sys.path.append(project)
#Addthepathto3rdpartydjangoapplicationandtodjangoitself.
sys.path.append(\\\’/home/myuser\\\’)
os.environ[\\\’DJANGO_SETTINGS_MODULE\\\’]=\\\’mysite.apache.override\\\’
importdjango.core.handlers.wsgi
application=django.core.handlers.wsgi.WSGIHandler()
還需要為Apache服務(wù)器的默認用戶www-data分配根目錄的所有權(quán),以便于Apache服務(wù)器有權(quán)限訪問此目錄:
#sudochownwww-data:www-dataapache/
5、配置Apache
要配置Apache使用剛才的WSGI腳本,需要編輯配置文件:
#sudovi/etc/apache2/sites-enabled/000-default.conf
添加以下內(nèi)容:
<VirtualHost*:80>
WSGIScriptAlias/mypath//home/myuser/mysite/apache/wsgi.py
<Directory/home/myuser/mysite/apache/>
Requireallgranted
</Directory>
</VirtualHost>
第一行為Django Web目錄添加一個mypath別名, 這樣項目就可以通過URL:http://www.mydomain.com/mypath/進行訪問。
如果想直接使用域名訪問,比如:http://www.mydomain.com/,那么可以直接指向Django應(yīng)用。代碼塊表示訪問指定的目錄有所有權(quán)限。
如果想自定義robots.txt和圖標(biāo),可以添加下面的內(nèi)容:
Alias/robots.txt/home/myuser/mysite/robots.txt
Alias/favicon.ico/home/myuser/mysite/favicon.ico
要提供靜態(tài)文件和媒體文件服務(wù),還需要分別這樣配置:
Alias/media//home/myuser/mysite/media/
Alias/static//home/myuser/mysite/static/
<Directory/path/to/mysite.com/static>
Requireallgranted
</Directory>
<Directory/path/to/mysite.com/media>
Requireallgranted
</Directory>
最后,保存配置文件并重啟Apache:
#sudoserviceapache2restart
注意Apache的版本:對于Apache 2.4之前的版本,上面的配置略有不同。
更多關(guān)于云服務(wù)器,域名注冊,虛擬主機的問題,請訪問三五互聯(lián)官網(wǎng):m.shinetop.cn