在云端Ubuntu機(jī)器上用Apache部署Django網(wǎng)站

只是自己的學(xué)習(xí)復(fù)習(xí)筆記电湘。隔节。。很多內(nèi)容是基于其他資料的寂呛,寫下備忘怎诫。


終于畢業(yè)了,最近在unpaid實(shí)習(xí)贷痪,作為全職入職前的一個過渡幻妓。剛好要用到之前網(wǎng)頁應(yīng)用開發(fā)課上學(xué)的知識,發(fā)現(xiàn)好多都記不清了劫拢,在這里復(fù)習(xí)一下吧肉津。

目標(biāo):在AWS上的Ubuntu機(jī)器上,創(chuàng)建Django項目舱沧,并用Apache做成web server妹沙。

1. 安裝Django

更新apt-get:

$ sudo apt-get update

順便記錄一下自己總是記不清的 apt-get update 與 upgrade 的區(qū)別:update命令會更新所有可供下載的package條目以及它們的版本,而upgrade會根據(jù)現(xiàn)有的條目及版本升級更新所有你已經(jīng)安裝的package熟吏。因此距糖,當(dāng)你想要更新自己所安裝的所有package時,一般先運(yùn)行update命令分俯,再運(yùn)行upgrade命令肾筐。但感覺upgrade還是根據(jù)需要具體更新某個package比較好,所以update才是我們最經(jīng)常需要用到的命令缸剪。

安裝python及pip:

$ sudo apt-get install python

$ sudo apt-get install python-pip

查看python版本:

$ python --version

Python 2.7.12

正確顯示版本號吗铐,說明Python安裝成功。也可以選擇安裝Python3杏节,同樣有Django. 本文用Python2舉例了唬渗。

用pip安裝Django:

$ sudo pip install django

安裝完成后典阵,可以查看Django版本

$ django-admin version

1.11.6

正確顯示版本號,說明安裝成功镊逝。

2. 創(chuàng)建Django project以及其下的網(wǎng)頁App

這一步是可選的壮啊。如果已經(jīng)在本地環(huán)境創(chuàng)建好Django project, 也可以直接把源碼上傳烙如,或者用Git來做version control來同步本地與云端服務(wù)器代碼灭衷。

首先創(chuàng)建Django project:

$ django-admin startproject mysite

在mysite中創(chuàng)建一個新app:

~$ cd mysite/

~/mysite$ python manage.py startapp myapp

在 mysite/settings.py中加入該app:

INSTALLED_APPS = [

? 'django.contrib.auth',

? 'django.contrib.contenttypes',

? 'django.contrib.sessions',

? 'django.contrib.sites','django.contrib.messages',

? 'django.contrib.staticfiles',

? 'myapp',

]

更改myapp/urls.py從而添加app的url:

fromdjango.conf.urls import url

from . import views

urlpatterns=[

? ? url(r'^$', views.index, name='index'),

]

這里加入的一條url使得root url (r'^$') 會運(yùn)行views中名為的index函數(shù)。r表示regular expression晋涣,后面的單引號中的內(nèi)容表示正則表達(dá)式match的內(nèi)容座菠,^和$分別表示行開頭和行結(jié)尾狸眼,具體如果不清楚請進(jìn)一步學(xué)習(xí)正則表達(dá)式regex。后面的name是在html template中鏈接此url的名稱浴滴,目的是為了更加簡單的match到這個url, 也可選擇不定義name而使用整個url字符串來鏈接此url拓萌。

同時,還需要更改mysite/urls.py使得網(wǎng)站的某些url能match到myapp中:

from django.conf.urls import include,url

from django.contrib import admin

urlpatterns=[

? ? url(r'^myapp/',include('myapp.urls')),

? ? url(r'^admin/',admin.site.urls),

]

此時以mysite/myapp/ 為開頭的url會被match到myapp/urls.py中升略,并根據(jù)其中的url進(jìn)一步進(jìn)行匹配微王。

由于我們將mysite/myapp/這個url匹配到了index這個函數(shù)中,此時需要在views.py中定義該index函數(shù)來實(shí)現(xiàn)功能:

from django.http import HttpResponse

def index(request):

? ? return HttpResponse('Hello World')

該函數(shù)會生成并返回一條內(nèi)容為“Hello World”的Http response品嚣。

最后炕倘,運(yùn)行該server:

~/mysite$ python manage.py runserver

這時Django會默認(rèn)在:8000端口運(yùn)行該網(wǎng)站。現(xiàn)在翰撑,當(dāng)該網(wǎng)站host/myapp:8000 的url收到訪問時激才,會收到該條Http回復(fù)。還可以添加參數(shù)來確定自己想在什么端口運(yùn)行該程序额嘿,以及允許哪些IP訪問:

~/mysite$ python manage.py runserver 0.0.0.0:80

這樣會在80端口(HTTP)運(yùn)行該網(wǎng)站瘸恼,并接受任何IP地址的訪問。

3. 安裝并運(yùn)行Apache, 并鏈接Apache與Django

利用Apache與mod_wsgi來搭建服務(wù)器是Django官方推薦的一種部署方式册养。

首先安裝Apache:

$ sudo apt-get install apache2

Apache是目前最為廣泛應(yīng)用的開源HTTP網(wǎng)站服務(wù)器軟件东帅,世界上有超過60%的服務(wù)器是以Apache為基礎(chǔ)搭建的。

接著安裝mod_wsgi:

$ sudo apt-get install libapache2-mod-wsgi

mod_wsgi是Python的一個module球拦,它是提供基于Python的網(wǎng)站在Apache運(yùn)行的接口靠闭。注意這里是Python2的安裝包,Python3對應(yīng)的包是libapache2-mod-wsgi-py3坎炼。

接下來我們需要寫一個wsgi.py腳本來作為鏈接Apache與Django的橋梁愧膀。為了方便版本管理,我們在mysite/mysite/目錄下新建一個名為apache/的文件夾谣光。原來的目錄結(jié)構(gòu)是這樣的:

mysite/

? ?manage.py? ?

? ? mysite/

? ? ? ? __init__.py

? ? ? ? settings.py?

? ? ? ? urls.py

? ? myapp/

? ? ? ? models.py

? ? ? ? views.py

新建后是這樣的:

mysite/

? ? manage.py

? ? mysite/

? ? ? ? __init__.py

? ? ? ? settings.py

? ? ? ? urls.py

? ? ? ? apache/

? ? ? ? ? ? __init__.py

? ? ? ? ? ? override.py

? ? ? ? ? ? wsgi.py

? ? myapp/

? ? ? ? models.py

? ? ? ? views.py

為什么說這樣方便版本管理呢檩淋?只用在Git中ignore掉apache這個文件夾,它便會被Git忽略萄金,因?yàn)榇宋募A只需在Apache服務(wù)器上存在蟀悦,并不是該Django項目的一部分媚朦。

接著,分別添加幾個Python文件的內(nèi)容日戈。__init__.py中不需要任何內(nèi)容询张,有它只是為了讓python把當(dāng)前目錄識別為一個package。

override.py中需要覆蓋部分Django project中settings.py中的設(shè)定浙炼,在ALLOWED_HOST中加入該server的域名份氧。此處DEBUG選項設(shè)置為了True,在完成開發(fā)后應(yīng)當(dāng)改為False:

# override.py

from mysite.settings import *

DEBUG=True

ALLOWED_HOSTS=[

? ? 'mydomain.com',

]

添加wsgi.py中的設(shè)定:

import os, sys

# Calculate the path based on the location of the WSGI script.

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)


# Add the path to 3rd party django application and to django itself.

sys.path.append('/home/myuser')

os.environ['DJANGO_SETTINGS_MODULE']? = 'webapps.apache.override'

from django.core.wsgi import get_wsgi_application

application = get_wsgi_application()

注意把myuser改成自己的系統(tǒng)用戶名就行弯屈。

設(shè)定好各個.py文件的內(nèi)容后半火,把a(bǔ)pache/文件夾的歸屬權(quán)轉(zhuǎn)讓給Apache的默認(rèn)用戶www-data,使得Apache可以訪問此文件夾:

$ sudo chown www-data:www-data apache/

修改Apache的設(shè)定:

$ sudo vim /etc/apache2/sites-enabled/000-default.conf

在文件中<VirtualHost*:80> 標(biāo)簽中加入以下內(nèi)容:

WSGIScriptAlias /mypath/ /home/myuser/mysite/apache/wsgi.py

<Directory "/home/myuser/mysite/mysite/apache/">

? ? Require all granted

</Directory>

WSGIScriptAlias會讓你的網(wǎng)站在根url下的/mypath/路徑運(yùn)行季俩。也就是說,現(xiàn)在當(dāng)你訪問 http://mydomain.com/mypath/ 時就會訪問到你的Django根url梅掠。如果想讓網(wǎng)站的根url直接對應(yīng)Django App, 可以將‘/mypath/’直接替換為'/'酌住。

修改完后,需要重啟apache服務(wù):

$ sudo service apache2 restart

到此為止阎抒,就可以通過“http://mydomain.com/mypath/”正式訪問你的Django App啦酪我!


參考資源:

https://www.sitepoint.com/deploying-a-django-app-with-mod_wsgi-on-ubuntu-14-04/

https://askubuntu.com/questions/94102/what-is-the-difference-between-apt-get-update-and-upgrade

https://docs.djangoproject.com/en/1.11/howto/deployment/wsgi/modwsgi/

https://stackoverflow.com/questions/35674590/what-is-the-difference-between-wsgi-python-wsgi-wsgi-server-and-mod-wsgi

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市且叁,隨后出現(xiàn)的幾起案子都哭,更是在濱河造成了極大的恐慌,老刑警劉巖逞带,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件欺矫,死亡現(xiàn)場離奇詭異,居然都是意外死亡展氓,警方通過查閱死者的電腦和手機(jī)穆趴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來遇汞,“玉大人未妹,你說我怎么就攤上這事】杖耄” “怎么了络它?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長歪赢。 經(jīng)常有香客問我化戳,道長,這世上最難降的妖魔是什么埋凯? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任迂烁,我火速辦了婚禮看尼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘盟步。我一直安慰自己藏斩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布却盘。 她就那樣靜靜地躺著狰域,像睡著了一般。 火紅的嫁衣襯著肌膚如雪黄橘。 梳的紋絲不亂的頭發(fā)上兆览,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機(jī)與錄音塞关,去河邊找鬼抬探。 笑死,一個胖子當(dāng)著我的面吹牛帆赢,可吹牛的內(nèi)容都是我干的小压。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼椰于,長吁一口氣:“原來是場噩夢啊……” “哼怠益!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瘾婿,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤蜻牢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后偏陪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抢呆,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年笛谦,在試婚紗的時候發(fā)現(xiàn)自己被綠了镀娶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡揪罕,死狀恐怖梯码,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情好啰,我是刑警寧澤轩娶,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站框往,受9級特大地震影響鳄抒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一许溅、第九天 我趴在偏房一處隱蔽的房頂上張望瓤鼻。 院中可真熱鬧,春花似錦贤重、人聲如沸茬祷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽祭犯。三九已至,卻和暖如春滚停,著一層夾襖步出監(jiān)牢的瞬間沃粗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工键畴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留最盅,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓起惕,卻偏偏與公主長得像涡贱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子疤祭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容