1、部署前的專案配置
Django專案中會有一些CSS,JavaScript等靜態檔案,為了能夠方便地讓Nginx處理這些靜態檔案的請求,我們把專案中的全部靜態檔案收集到一個統一的目錄下,這個目錄通常位於Django專案的根目錄,並且命名為static。為了完成這些任務,需要在專案的配置檔案settings.py
裡做一些必要的配置:
# 加入下面的配置
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_ROOT指明瞭靜態檔案的收集目錄,即專案根目錄(BASE_DIR)下的靜資料夾。
為了安全起見,在生產環境下需要關閉 DEBUG 。以及選項對話設定網求允許訪問的域名開啟的settings.py檔案,找到 DEBUG 狀語從句: ALLOWED_HOSTS 這兩個選項對話,將它們設定成如下的值:
DEBUG = False
ALLOWED_HOSTS = ['127.0.0.1', 'localhost ', 'bgods.cn']
2、設定伺服器目錄結構
- 上傳專案程式碼之前,先設定一下伺服器的檔案結構:
/home/bg/
sites/
bgods.cn/
env/
mysite/
一臺伺服器可能部署多個網站,所有網站程式碼都放在sites /目錄下.bgods.cn /這個資料夾以網站的域名命名,便於區分.env /是python虛擬環境目錄.mysite /是Django部落格專案目錄。
注意:目錄名替換為你自己的域名,涉及以後到 bgods.cn的地方通常都要替換你自己的域名
- 建立目錄
bg@localhost:~$ mkdir -p ~/sites/bgods.cn
bg@localhost:~$ mkdir -p ~/sites/bgods.cn/mysite
- 建立虛擬環境
bg@localhost:~$ cd ~/sites/bgods.cn
bg@localhost:~/sites/bgods.cn$ virtualenv --python=python3.6 env
- 上傳Django的專案程式碼到伺服器
方法有多種,我這裡使用的是XFTP5上傳,方便簡單,不懂的自行百度
3、安裝專案依賴
在之前先啟用虛擬環境,安裝專案的全部依賴。
- 啟用虛擬環境
bg@localhost:~/sites/bgods.cn$ source env/bin/activate
(env) bg@localhost:~/sites/bgods.cn$ cd mysite/
- 進入專案路徑,並使用PIP安裝專案全部依賴
(env) bg@localhost:~/sites/bgods.cn/mysite$ pip3 install -r requirements.txt
關於以上命令,請檢視 requirements.txt
4、收集靜態檔案
虛擬環境下繼續執行python manage.py collectstatic命令收集靜態檔案到靜目錄下:
(env) bg@localhost:~/sites/bgods.cn/mysite$ python manage.py collectstatic
5、生成資料庫
虛擬環境下繼續執行python manage.py migrate命令建立資料庫檔案:
(env) bg@localhost:~/sites/bgods.cn/mysite$ python manage.py migrate
- 建立超級使用者
虛擬環境下繼續執行python manage.py createsuperuser命令建立一個超級使用者,方便我們進入Django管理後臺。這和本地開發時是一樣的,具體請參照:在Django Admin後臺文章。
(env) bg@localhost:~/sites/bgods.cn/mysite$ python manage.py createsuperuser
接下來配置Nginx來處理使用者請求。先在伺服器的/ etc / nginx / sites-available /目錄下新建一個配置檔案,檔名設定為我的域名:
# /etc/nginx/sites-available/bgods.cn
server {
charset utf-8;
listen 80;
server_name bgods.cn;
location /static {
alias /home/bg/sites/bgods.cn/mysite/static;
}
location /media {
alias /home/bg/sites/bgods.cn/mysite/media;
}
location / {
proxy_set_header Host $host;
proxy_pass http://unix:/tmp/bgods.cn.socket;
}
}
我們在 /etc/nginx/sites-available/ 放置了配置檔案,接下來需要建立一個符號連結,把這個配置檔案加入到啟用的網站列表中去,被啟用網站的目錄在 /etc/nginx/sites-enabled/,你可以理解為從 sites-available/ 目錄下傳送了一個配置檔案的快捷方式到 sites-enabled/ 目錄。具體命令如下:
(env) bg@localhost:~/sites/bgods.cn/mysite$ sudo ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/bgods.cn
Gunicorn 一般用來管理多個程式,有程式掛了Gunicorn 可以把它拉起來,防止伺服器長時間停止服務,還可以動態調整 worker 的數量,請求多的時候增加 worker 的數量,請求少的時候減少。
- 在虛擬環境下,安裝 Gunicorn:
(env) bg@localhost:~/sites/bgods.cn/mysite$ pip3 install gunicorn
- 在 settings.py 檔案中新增 gunicorn 應用
# /home/bg/sites/bgods.cn/mysite/mysite/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
'ckeditor',
'ckeditor_uploader',
'gunicorn', #新增 gunicorn 應用
]
- 用 Gunicorn 啟動伺服器程式:
(env) bg@localhost:~/sites/bgods.cn/mysitel$ gunicorn --bind unix:/tmp/bgods.cn.socket mysite.wsgi:application
注意:mysite.wsgi:application這裡的mysite對應的是/home/bg/sites/bgods.cn/mysite/mysite,根據自己的修改,在瀏覽器輸入域名,可以看到訪問成功了!
現在 Gunicorn 是我們手工啟動的,萬一哪天伺服器崩潰重啟了又得重新手工啟動。為此我們寫一個自動啟動指令碼,這樣當伺服器重新啟動後,指令碼會幫我們重啟 Gunicorn。先按 Ctrl + c 停止剛才啟動的伺服器程式。
這裡以Ubuntu16.04為例:
1、建立指令碼
首先在/lib/systemd/system/目錄下,建立一個指令碼 bg.service(字尾是service)
# /lib/systemd/system/bg.service
[Unit]
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
# 你的使用者
User=bg
# 你的目錄
WorkingDirectory=/home/bg/sites/bgods.cn/mysite
# gunicorn啟動命令
ExecStart=/home/bg/sites/bgods.cn/env/bin/gunicorn --bind unix:/tmp/bgods.cn.socket mysite.wsgi:application
Restart=on-failure
[Install]
WantedBy=multi-user.target
2、啟動指令碼
(env) bg@localhost:~/sites/bgods.cn/mysitel$ sudo systemctl start bg.service # 執行指令碼
(env) bg@localhost:~/sites/bgods.cn/mysitel$ sudo systemctl enable bg.service # 設定開機自啟動指令碼
以後如果更新了程式碼,只要執行下面的命令重啟一下 Nginx 和 Gunicorn 就可以使新的程式碼生效了:
sudo systemctl restart bg.service nginx.service
3、systemctl常用命令
以下是systemctl的一些命令,以上面建立的bg.service為例(如果是普通使用者需要在前面加須藤再執行)
- 重新載入服務檔案:systemctl daemon-reload
- 啟動一個服務:systemctl start bg.service
- 關閉一個服務:systemctl stop bg.service
- 重啟一個服務:systemctl restart bg.service
- 顯示一個服務的狀態:systemctl status bg.service
- 在開機時啟用一個服務:systemctl enable bg.service
- 在開機時禁用一個服務:systemctl disable bg.service
- 檢視服務是否開機啟動:systemctl is-enabled bg.service
- 檢視已啟動的服務列表:systemctl list-unit-files | grep enabled
- 檢視啟動失敗的服務列表:systemctl --failed
本作品採用《CC 協議》,轉載必須註明作者和本文連結