搭建服務器
本教程使用的本地環境爲 Windows 10,服務器環境爲 ubuntu 14.04(64 位)。若是你的環境和個人有所差別致使一些命令沒法執行,將這些命令轉換爲你所在環境的命令執行便可。
css
安裝軟件
順利鏈接到遠程服務器了。若是是一臺全新服務器的話,一般咱們是以 root 用戶登陸的。在 root 下部署代碼不安全,最好是建一個新用戶(若是你已經以非 root 用戶登陸的話能夠跳過這一步)。下面的一些列命令將建立一個擁有超級權限的新用戶:python
root@localhost:~# useradd -m -s /bin/bash jmp
# 把新建立的用戶加入超級權限組
root@localhost:~# usermod -a -G sudo jmp
# 爲新用戶設置密碼
# 注意在輸密碼的時候不會有字符顯示,不要覺得鍵盤壞了,正常輸入便可
root@localhost:~# passwd jmp
# 切換到建立的新用戶
root@localhost:~# su - jmp
# 切換成功,@符號前面已是新用戶名而不是 root 了
jmp@localhost:~$
新用戶建立並切換成功了。若是是新服務器的話,最好先更新一下系統,避免由於版本太舊而給後面安裝軟件帶來麻煩。運行下面的兩條命令:
jmp@localhost:~$ sudo apt-get update
jmp@localhost:~$ sudo apt-get upgrade
接下來就能夠安裝必要的軟件了,這裏咱們須要用到的軟件有 Nginx、Pytohn三、Git、pip 和 virtualenv。
jmp@localhost:~$ sudo apt-get install nginx
jmp@localhost:~$ sudo apt-get install git python3 python3-pip
jmp@localhost:~$ sudo pip3 install virtualenv
啓動 Nginx 服務
Nginx 是用來處理靜態文件請求的。好比當咱們訪問一個博客文章詳情頁面時,服務器會接收到下面兩種請求:nginx
- 顯示文章的詳情信息,這些信息一般保存在數據庫裏,所以須要調用數據庫獲取數據。
- 圖片、css、js 等存在服務器某個文件夾下的靜態文件。
對於前一種請求,博客文章的數據須要藉助 Django 從數據庫中獲取,Nginx 處理不了,它就會把這個請求轉發給 Django,讓 Django 去處理。而對於後一種靜態文件的請求,只須要去這些靜態文件所在的文件夾獲取,Nginx 就會代爲處理,再也不麻煩 Django。git
用 Django 去獲取靜態文件是很耗時的,但 Nginx 能夠很高效地處理,這就是咱們要使用 Nginx 的緣由(固然其功能遠不止這些)。github
經過前面的步驟咱們已經安裝了 Nginx,而且已經把服務器 IP 綁定了。運行下面的命令啓動 Nginx 服務:
jmp@localhost:~$ sudo service nginx start
在瀏覽器輸入域名,看到以下頁面說明 Nginx 啓動成功了。
部署代碼
部署前的項目配置
Django 項目中會有一些 CSS、JavaScript 等靜態文件,爲了可以方便地讓 Nginx 處理這些靜態文件的請求,咱們把項目中的所有靜態文件收集到一個統一的目錄下,這個目錄一般位於 Django 項目的根目錄,而且命名爲 static。爲了完成這些任務,須要在項目的配置文件裏作一些必要的配置:數據庫
blogproject/settings.py
# 其餘配置...
STATIC_URL = '/static/'
# 加入下面的配置
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_ROOT 指明瞭靜態文件的收集目錄,即項目根目錄(BASE_DIR)下的 static 文件夾。django
爲了安全起見,在生產環境下須要關閉 DEBUG
選項以及設置容許訪問的域名。打開 settings.py 文件,找到 DEBUG
和 ALLOWED_HOSTS
這兩個選項,將它們設置成以下的值:ubuntu
blogproject/settings.py
DEBUG = False
ALLOWED_HOSTS = ['127.0.0.1', 'localhost ', '你我的的IP地址或者域名']
項目還會依賴一些第三方 Python 庫,爲了方便在服務器上一次性安裝,咱們將所有依賴寫入一個叫 requirements.txt 的文本文件中。激活本地的虛擬環境(若是你使用了虛擬環境的話),並進入項目的根目錄,運行
pip freeze > requirements.txt
命令:
這時項目根目錄下會生成了一個 requirements.txt 的文本文件,其內容記錄了項目的所有依賴。
瀏覽器
將代碼上傳到 GitHub
將代碼上傳到 GitHub 等代碼託管平臺,這樣咱們就能夠方便地把代碼拉取到服務器了。Git 和 GitHub 的使用相信你已經很熟悉了,這裏就不贅述過程。若是不知道如何使用地話能夠自行百度相關教程。安全
注意數據庫文件不要上傳!
設置服務器目錄結構
接下來須要把代碼上傳到服務器了。我服務器上存放代碼的目錄結構通常是這樣的:
/home/jmp/
sites/
env/
blogproject/
接下來建立虛擬環境,先進入到 sites 目錄下,而後運行 virtualenv 命令建立虛擬環境:
jmp@localhost:~/sites$ virtualenv --python=python3 env
注意這裏使用 --python=python3 來指定克隆 Python3 的環境。由於 ubuntu 系統默認安裝了 Python2,若是不特別指定的話 Virtualenv 默認克隆的是 Python2 的環境。
檢查一下虛擬環境是否建立成功,運行 ls 命令列出當前目錄下的文件和文件夾,看到 env 這個文件夾說明虛擬環境建立成功。
接着再從代碼倉庫把項目代碼拉取過來,把 git clone 後的地址換成你本身的 GitHub 倉庫地址!
jmp@localhost:~/sites$ git clone https://github.com/jipeng1986/blogproject.git
多了 blogproject 文件夾(文件夾名稱由你的 GitHub 倉庫名決定),說明拉取成功了。
安裝項目依賴
激活虛擬環境,再進入到項目根目錄,即 requirements.txt 所在的目錄,安裝項目的所有依賴:
jmp@localhost:~/sites$ source env/bin/activate
(env) jmp@localhost:~/sites$ cd django-blog-tutorial/
(env) jmp@localhost:~/sites/blogproject$ pip install -r requirements.txt
收集靜態文件
虛擬環境下繼續運行 python manage.py collectstatic
命令收集靜態文件到 static 目錄下:
(env) jmp@localhost:~/sites/blogproject$ python manage.py collectstatic
生成數據庫
虛擬環境下繼續運行 python manage.py migrate
命令建立數據庫文件:
(env) jmp@localhost:~/sites/blogproject$ python manage.py migrate
建立超級用戶
虛擬環境下繼續運行 python manage.py createsuperuser
命令建立一個超級用戶,方便咱們進入 Django 管理後臺。
(env) jmp@localhost:~/sites/blogproject$ python manage.py createsuperuser
配置 Nginx
接下是配置 Nginx 來處理用戶請求。
先在服務器的 /etc/nginx/sites-available/ 目錄下新建一個配置文件。寫上下面的配置內容:
/etc/nginx/sites-available/blogproject
server {
charset utf-8;
listen 80;
server_name IP地址;
location /static {
alias /home/jmp/sites/blogproject/static;
}
location / {
proxy_set_header Host $host;
proxy_pass http://unix:/tmp/IP地址.socket;
}
}
咱們在 /etc/nginx/sites-available/ 放置了配置文件,接下來須要建立一個符號連接,把這個配置文件加入到啓用的網站列表中去,被啓用網站的目錄在 /etc/nginx/sites-enabled/,你能夠理解爲從 sites-available/ 目錄下發送了一個配置文件的快捷方式到 sites-enabled/ 目錄。具體命令以下:
(env) jmp@localhost:~/sites/blogproject$ sudo ln -s /etc/nginx/sites-available/blogproject /etc/nginx/sites-enabled/blogproject
而後須要刪除 /etc/nginx/sites-enabled/ 目錄下的 default,由於不刪除的話,默認找的是 default,致使配置不生效。
使用 Gunicorn
Gunicorn 通常用來管理多個進程,有進程掛了Gunicorn 能夠把它拉起來,防止服務器長時間中止服務,還能夠動態調整 worker 的數量,請求多的時候增長 worker 的數量,請求少的時候減小。
在虛擬環境下,安裝 Gunicorn:
(env) jmp@localhost:~/sites/blogproject$ pip install gunicorn
用 Gunicorn 啓動服務器進程:
(env) jmp@localhost:~/sites/blogproject$ gunicorn --bind unix:/tmp/IP地址.socket blogproject.wsgi:application
瀏覽器輸入域名,能夠看到訪問成功了!
自動啓動 Gunicorn
如今 Gunicorn 是咱們手工啓動的,萬一哪天服務器崩潰重啓了又得從新手工啓動。爲此咱們寫一個自動啓動腳本,這樣當服務器從新啓動後,腳本會幫咱們重啓 Gunicorn。先按 Ctrl + c 中止剛纔啓動的服務器進程。
寫一個啓動腳本,這樣當服務器重啓後能自動引導 Gunicorn 的啓動。腳本位於 /etc/init/ 目錄下,且腳本文件名必須以 .conf 結尾:
/etc/init/gunicorn-blogproject.conf
start on net-device-up
stop on shutdown
respawn
setuid jmp
chdir /home/jmp/sites/blogproject
exec ../env/bin/gunicorn --bind unix:/tmp/IP地址.socket blogproject.wsgi:application
① start on net-device-up 確保只在服務器聯網時才啓動 Gunicorn。
② 若是進程崩潰了(好比服務器重啓或者進程由於某些之外狀況被 kill),respawn 將自動重啓 Gunicorn。
③ setuid 確保以 jmp用戶的身份(換成你本身的用戶名)運行 Gunicorn 進程。
④ chdir 進入到指定目錄,這裏進入項目的根目錄。
⑤ exec 執行進程,即開啓服務器進程。
如今能夠用 start 命令啓動 Gunicorn 了:
sudo start gunicorn-blogproject
之後若是更新了代碼,只要運行下面的命令重啓一下 Nginx 和 Gunicorn 就可使新的代碼生效了:
sudo service nginx reload
sudo restart gunicorn-blogproject