1. 程式人生 > >Ubuntu環境下部署Django+uwsgi+nginx總結

Ubuntu環境下部署Django+uwsgi+nginx總結

## 前言 這是我在搭建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!