Ubuntu環境下部署Django+uwsgi+nginx總結
阿新 • • 發佈:2020-04-01
## 前言
這是我在搭建Django專案時候的過程,拿來總結記錄,以備不時之需。
專案採用nginx+uwsgi的搭配方式。
專案依賴包採用`requirements.txt`檔案管理的方式。
## 本地準備工作
1. 確認專案能夠執行起來,沒有`bug`
2. 將當前環境的包匯出 `pip freeze > requirements.txt`
3. 將專案上傳到伺服器上的`/srv`目錄下。這裡以`git`的形式為例, 開啟終端, 依次輸入如下命令:
```bash
$ git init
$ git remote add origin xxx.git # 替換成你的專案git地址
$ git add .
$ git commit -m 'first commit'
$ git pull origin master --allow-unrelated-histories
$ git push origin master
```
## 部署專案到伺服器
### 安裝python
1. 安裝好專案用到的`python`。
```bash
$ sudo apt install python
$ sudo apt install python-pip
$ pip install --upgrade pip
```
2. 安裝`virtualenv`以及`virutalenvwrapper`,並建立虛擬環境。
```bash
$ pip install virtualenv
$ pip install virtualenvwrapper
$ sudo apt install vim
```
3. 編輯檔案`~/.bashrc`
```bash
$ vim ~/.bashrc
# 新增如下2行程式碼
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
# 儲存檔案,讓檔案成效
$ source ~/.bashrc
```
### 安裝git:
```bash
$ sudo apt install git
# 為了方便XShell或者CRT連線伺服器,建議安裝OpenSSH
$ sudo apt install openssh-server openssh-client
$ service ssh restart
```
### 安裝MySQL
```
$ sudo apt install mysql-server mysql-client
$ sudo apt-get install libmysqld-dev
```
### 測試配置
1. 安裝依賴包,進入虛擬環境 `workon ***`,進入專案根目錄,執行命令`pip install -r requirements.txt`
2. 建立資料庫,新開啟一個終端,登入資料庫,`mysql -uroot -p `, 建立相應的資料庫 `CREATE DATABASE IF NOT EXISTS my_db default charset utf8mb4;`
3. 遷移資料,`python manage.py migrate`
4. 收集靜態檔案, `python manage.py collectstatic`
4. 啟動伺服器,執行 `python manage.py runserver 0.0.0.0:8000`,然後在你自己電腦上,在瀏覽器中輸入`http://:8000`,訪問下網站所有頁面,確保所有頁面都沒有錯誤。
注意:
1. 設定 `ALLOW_HOST` 為你的域名或 `ip` 地址。
2. 設定 `DEBUG=False`。
### 安裝uwsgi
`uwsgi`是一個應用伺服器,非靜態檔案的網路請求就必須通過他完成,他也可以充當靜態檔案伺服器,但不是他的強項。
`uwsgi`是使用`python`編寫的,因此通過`pip install uwsgi`就可以了。(`uwsgi`必須安裝在系統級別的`Python`環境中,不要安裝到虛擬環境中)。
1. 命令列啟動`uwsgi`:
```bash
$ uwsgi --http :8000 --module test.wsgi --vritualenv=/root/.virtualenvs/django-env-py36
```
如果能夠在瀏覽器中訪問到測試的頁面,說明uwsgi可以載入專案了。
2. 配置檔案方式啟動`uwsgi`:
在專案的根路徑下面,建立一個檔案`djangotest.ini`,填寫以下程式碼:
```
[uwsgi]
# Django相關的配置
# 必須全部為絕對路徑
# 專案的路徑
chdir=/srv/djangotest
# Django的wsgi檔案
module=djangotest.wsgi
# Python虛擬環境的路徑
home=/root/.virtualenvs/django-env-py36
# 程序相關的設定
# 主程序
master=true
# 最大數量的工作程序
processes=10
# socket檔案路徑,絕對路徑
socket=/srv/djangotest/djangotest.sock
# 設定socket的許可權
chmod-socket=666
# 退出的時候是否清理環境
vacuum=true
然後使用命令uwsgi --ini djangotest.ini,看下是否還能啟動這個專案。
```
### 安裝nginx
`nginx`是一個`web`伺服器。用來載入靜態檔案和接收`http`請求的。
1. 通過命令`sudo apt install nginx`即可安裝。
2. `nginx`常用命令:
* 啟動nginx:service nginx start
* 關閉nginx:service nginx stop
* 重啟nginx:service nginx restart
3. 收集靜態檔案:
靜態檔案應該讓`nginx`來處理,而不是讓`django`來做。
首先確保你的`settings.py`檔案中有一個`STATIC_ROOT`配置,這個配置應該指定你的靜態檔案要放在哪個目錄下。
那麼我們可以執行以下命令:`python manage.py collectstatic`來收集所有靜態檔案(已經執行過請忽略)。
4. 編寫nginx配置檔案,在`/etc/nginx/conf.d`目錄下,新建一個檔案 `djangotest.conf`,然後將以下程式碼貼進去:
```
upstream djangotest {
server unix:///srv/djangotest/djangotest.sock;
}
# 配置伺服器
server {
# 監聽的埠號
listen 80;
# 域名
server_name 192.168.0.101;
charset utf-8;
# 最大的檔案上傳尺寸
client_max_body_size 75M;
# 靜態檔案訪問的url
location /static {
# 靜態檔案地址
alias /srv/djangotest/static_dist;
}
# 最後,傳送所有非靜態檔案請求到django伺服器
location / {
uwsgi_pass djangotest;
# uwsgi_params檔案地址
include /etc/nginx/uwsgi_params;
}
}
```
5. 測試配置檔案:`service nginx configtest`。注意:每次修改完配置需要重啟`nginx`: `service nginx restart`
### 使用supervisor
讓supervisor管理uwsgi,可以在uwsgi發生意外的情況下,自動重啟。
1. 安裝`supervisor`:在系統級別的python環境下 `pip install supervisor`。
2. 在專案根目錄下建立一個檔案`my_supervisor.conf`。編寫內容:
```
# supervisor的程式名字
[program:mysite]
# supervisor執行的命令
command=uwsgi --ini zlkt_uwsgi.ini
# 專案的目錄
directory = /srv/djangotest
# 開始的時候等待多少秒
startsecs=0
# 停止的時候等待多少秒
stopwaitsecs=0
# 自動開始
autostart=true
# 程式掛了後自動重啟
autorestart=true
# 輸出的log檔案
stdout_logfile=/srv/djangotest/log/supervisord.log
# 輸出的錯誤檔案
stderr_logfile=/srv/djangotest/log/supervisord.err
[supervisord]
# log的級別
loglevel=info
# 使用supervisorctl的配置
[supervisorctl]
# 使用supervisorctl登入的地址和埠號
serverurl = http://127.0.0.1:9001
# 登入supervisorctl的使用者名稱和密碼
username = admin
password = 123
[inet_http_server]
# supervisor的伺服器
port = :9001
# 使用者名稱和密碼
username = admin
password = 123
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
```
3. 執行`supervisor`,執行`supervisord -c my_supervisor.conf`。
4. 進入`supervisor`管理控制檯, `supervisorctl -c my_supervisor.conf`
5. `supervisor`管理控制檯常用命令
```
# 檢視狀態
status
# 啟動程式
start program_name
# 重新啟動程式
restart program_name
# 關閉程式
stop program_name
# 重新載入配置檔案
reload
# 退出控制檯
quit
```
Enjoy your code!