只是自己的學習復習筆記。。。很多內容是基于其他資料的,寫下備忘。
終于畢業了,最近在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