在云端Ubuntu機器上用Apache部署Django網站

只是自己的學習復習筆記。。。很多內容是基于其他資料的,寫下備忘。


終于畢業了,最近在unpaid實習,作為全職入職前的一個過渡。剛好要用到之前網頁應用開發課上學的知識,發現好多都記不清了,在這里復習一下吧。

目標:在AWS上的Ubuntu機器上,創建Django項目,并用Apache做成web server。

1. 安裝Django

更新apt-get:

$ sudo apt-get update

順便記錄一下自己總是記不清的 apt-get update 與 upgrade 的區別:update命令會更新所有可供下載的package條目以及它們的版本,而upgrade會根據現有的條目及版本升級更新所有你已經安裝的package。因此,當你想要更新自己所安裝的所有package時,一般先運行update命令,再運行upgrade命令。但感覺upgrade還是根據需要具體更新某個package比較好,所以update才是我們最經常需要用到的命令

安裝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. 創建Django project以及其下的網頁App

這一步是可選的。如果已經在本地環境創建好Django project, 也可以直接把源碼上傳,或者用Git來做version control來同步本地與云端服務器代碼。

首先創建Django project:

$ django-admin startproject mysite

在mysite中創建一個新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'^$') 會運行views中名為的index函數。r表示regular expression,后面的單引號中的內容表示正則表達式match的內容,^和$分別表示行開頭和行結尾,具體如果不清楚請進一步學習正則表達式regex。后面的name是在html template中鏈接此url的名稱,目的是為了更加簡單的match到這個url, 也可選擇不定義name而使用整個url字符串來鏈接此url。

同時,還需要更改mysite/urls.py使得網站的某些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中,并根據其中的url進一步進行匹配。

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

from django.http import HttpResponse

def index(request):

? ? return HttpResponse('Hello World')

該函數會生成并返回一條內容為“Hello World”的Http response。

最后,運行該server:

~/mysite$ python manage.py runserver

這時Django會默認在:8000端口運行該網站。現在,當該網站host/myapp:8000 的url收到訪問時,會收到該條Http回復。還可以添加參數來確定自己想在什么端口運行該程序,以及允許哪些IP訪問:

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

這樣會在80端口(HTTP)運行該網站,并接受任何IP地址的訪問。

3. 安裝并運行Apache, 并鏈接Apache與Django

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

首先安裝Apache:

$ sudo apt-get install apache2

Apache是目前最為廣泛應用的開源HTTP網站服務器軟件,世界上有超過60%的服務器是以Apache為基礎搭建的。

接著安裝mod_wsgi:

$ sudo apt-get install libapache2-mod-wsgi

mod_wsgi是Python的一個module,它是提供基于Python的網站在Apache運行的接口。注意這里是Python2的安裝包,Python3對應的包是libapache2-mod-wsgi-py3。

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

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忽略,因為此文件夾只需在Apache服務器上存在,并不是該Django項目的一部分。

接著,分別添加幾個Python文件的內容。__init__.py中不需要任何內容,有它只是為了讓python把當前目錄識別為一個package。

override.py中需要覆蓋部分Django project中settings.py中的設定,在ALLOWED_HOST中加入該server的域名。此處DEBUG選項設置為了True,在完成開發后應當改為False:

# override.py

from mysite.settings import *

DEBUG=True

ALLOWED_HOSTS=[

? ? 'mydomain.com',

]

添加wsgi.py中的設定:

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改成自己的系統用戶名就行。

設定好各個.py文件的內容后,把apache/文件夾的歸屬權轉讓給Apache的默認用戶www-data,使得Apache可以訪問此文件夾:

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

修改Apache的設定:

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

在文件中<VirtualHost*:80> 標簽中加入以下內容:

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

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

? ? Require all granted

</Directory>

WSGIScriptAlias會讓你的網站在根url下的/mypath/路徑運行。也就是說,現在當你訪問 http://mydomain.com/mypath/ 時就會訪問到你的Django根url。如果想讓網站的根url直接對應Django App, 可以將‘/mypath/’直接替換為'/'。

修改完后,需要重啟apache服務:

$ 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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容