Django網站部署(Ubuntu16.04+uwsgi+nginx+supervisor)

個人網站(基於Django框架,標題圖片為關於本站界面):我的數據生活

這幾天在部署中遇到了很多問題和疑難,特通過此文總結Django網站部署過程。

本機的準備

1.本機多次測試,確認項目沒有bug。千萬不要留一些小bug到伺服器上去解決!

2.用pip freeze > requirements.txt將當前環境的包導出到requirements.txt文件中,方便部署的時候安裝。

3.使用代碼託管平台保存代碼,這裡推薦碼雲,在碼雲上註冊並創建一個項目。碼雲地址:gitee.com/

4.通過git把代碼上傳到伺服器上去。git官網 : https://git-scm.com

5.建立gitignore文件,篩選掉項目中不需要上傳的文件。

6.然後進入到項目中,使用以下命令做代碼提交:

# 初始化一個倉庫
git init
# 添加遠程的倉庫地址
git remote add origin xxx.git
# 添加所有的代碼到緩存區
git add .
# 將代碼提交到本地倉庫
git commit -m first commit
# 從碼雲倉庫上拉數據下來
git pull origin master --allow-unrelated-histories
# 將本地倉庫中的代碼提交到遠程伺服器的master分支上
git push origin master

然後我們就可以在碼雲的倉庫中看到我們的項目代碼。

伺服器的配置

我用的伺服器是在騰訊雲租的ubuntu 16.04。系統本來是centos7.2,但在部署中發現Centos7.2不支持Mysql,只能轉ubuntu。而且由於使用Ubuntu的人比較多,如果出現問題也更容易在網上找到解決方案。

1.通過xshell連接伺服器。

2.ubuntu開啟root用戶:

sudo passwd root
輸入密碼

3.我使用的資料庫是Mysql,安裝MySQL伺服器和客戶端:

sudo apt install mysql-server mysql-client

4.安裝memcached:apt install memcached

5.安裝python環境。可在xshell上輸入Python,伺服器上一般安裝了python版本,我的系統默認是python2.7,雖然項目編程環境是python3.7.6,但是後面用到了supervisor會用到 python 2.7,下面安裝python3:

sudo apt install python3
sudo apt install python3-pip
pip install --upgrade pip

後來發現這樣簡單的安裝python3,最終安裝的版本是python3.5,但項目部署後可以正常運行,就沒有去更新python3的版本.

6.安裝virtualenvwrapper,並創建好項目要用到的虛擬環境.

pip install virtualenvwrapper

安裝完virtualenvwrapper後,還需要配置virtualenvwrapper的環境變數。

  • 通過whereis virtualenvwrapper.sh命令查看virtualenvwrapper.sh文件所在的路徑。
  • 在當前用戶目錄下創建.virtualenv文件夾,用來存放所有的虛擬環境目錄。
  • 在當前用戶目錄下編輯.bashrc文件,添加以下代碼:

export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh

然後退出bashrc文件,輸入命令source ~/.bashrc。如果出現錯誤肯可能是找不到python3的路徑可以在中間加一行代碼:

export VIRTUALENVWRAPPER_PYTHON = /usr/bin/python3

7.下載git並用git下載代碼:

sudo apt install git
git init
git remote add origin xxxxx #這裡輸入碼雲中的項目地址
git pull origin master

8.進入虛擬環境中(workon 虛擬環境名字),然後進入到項目所在的目錄,執行命令:pip install -r requirements.txt,安裝項目依賴的包。如果提示OSError: mysql_config not found,那麼再安裝sudo apt install libmysqld-dev即可。

9.進入mysql資料庫中,創建好項目的資料庫。這裡推薦在本地操作資料庫,即通過Navicat遠程連接資料庫,連接前要在ubuntu中給資料庫設置遠程連接的許可權:

# mysql -u root -proot
mysql>GRANT ALL PRIVILEGES ON *.* TO root@% IDENTIFIED BY youpassword WITH GRANT OPTION;

#操作完後切記執行以下命令刷新許可權
FLUSH PRIVILEGES

10.執行python manage.py makemigrations/migrate將模型映射到資料庫中。

11.執行python manage.py runserver 0.0.0.0:8000,然後就可以訪問網站了,只是這時候還只是單純html的形式。

12.在settings.py中的ALLOWED_HOST添加網站的域名或者ip地址,切記從現在開始,即使是這樣很簡單的操作也必須在本地上修改再通過git上傳到伺服器中去。

13.在settings.py中配置STATIC_ROOT,用來存儲收集的靜態文件。收集靜態文件的命令如下:

python manage.py collectstatic

安裝Uwsgi

uwsgi是一個應用伺服器,非靜態文件的網路請求就必須通過它完成。uwsgi是使用python編寫的,因此通過pip3 install uwsgi就可以了。(uwsgi必須安裝在系統級別的Python環境中,不要安裝到虛擬環境中)。然後創建一個叫做uwsgi.ini的配置文件(為方便書寫,從此開始我們假設項目名為xm):

[uwsgi]

# 項目路徑
chdir = /srv/xm
# Django的wsgi文件,自己命名
module = xm.wsgi
# Python虛擬環境的路徑
home = /root/.virtualenvs/xxm
# 進程相關的設置
# 主進程
master = true
# 最大數量的工作進程
processes = 10

http = :8000

# 設置socket的許可權
chmod-socket = 666
# 退出的時候是否清理環境
vacuum = true

daemonize = /var/log/xm_uwsgi.log

然後通過命令uwsgi --ini uwsgi.ini運行,確保沒有錯誤。然後在瀏覽器中訪問http://ip地址:8000,如果能夠訪問到頁面(可能沒有靜態文件)說明uwsgi配置成功。

安裝和配置nginx:

雖然uwsgi可以正常的部署我們的項目了。但我們還是依然要採用nginx來作為web伺服器。使用nginx來作為web伺服器有以下好處:

  1. uwsgi對靜態文件資源處理並不好,包括響應速度,緩存等。
  2. nginx作為專業的web伺服器,暴露在公網上會比uwsgi更加安全一點。
  3. 運維起來更加方便。比如要將某些IP寫入黑名單,nginx可以非常方便的寫進去。而uwsgi可能還要寫一大段代碼才能實現。

通過 apt instal nginx即可安裝。

/etc/nginx/conf.d目錄下,新建一個文件,叫做zhiliaoketang.conf,然後將以下代碼粘貼進去:

upstream zhiliaoketang {
server unix:///srv/xm/xm.sock;
}

# 配置伺服器
server {
# 監聽的埠號
listen 80;
# 域名
server_name xxxxxxxx;
charset utf-8;

# 最大的文件上傳尺寸
client_max_body_size 75M;

# 靜態文件訪問的url
location /static {
# 靜態文件地址
alias /srv/xm/static_dist;
}

# 最後,發送所有非靜態文件請求到django伺服器
location / {
uwsgi_pass xm
# uwsgi_params文件地址
include /etc/nginx/uwsgi_params;
}
}

這裡設置的是http埠,如果配備了SSL證書可以通過443埠訪問,將相關密鑰傳入nginx的conf.d文件夾(可通過xftp實現,如果提示沒有許可權,可以 chmod 777 文件),進行如下改變:

# 配置伺服器
server {
# 監聽的埠號
listen 443;
# 域名
server_name www.beitexi.cn;
ssl on;
ssl_certificate /etc/nginx/conf.d/1_www.beitexi.cn_bundle.crt;
ssl_certificate_key /etc/nginx/conf.d/2_www.beitexi.cn.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
charset utf-8;

# 最大的文件上傳尺寸
client_max_body_size 75M;

# 靜態文件訪問的url
location /static {
# 靜態文件地址
alias /srv/xm/static_dist;
}

# 最後,發送所有非靜態文件請求到django伺服器
location / {
uwsgi_pass xm;
# uwsgi_params文件地址
include /etc/nginx/uwsgi_params;
}
}

寫完配置文件後,為了測試配置文件是否設置成功,運行命令:service nginx configtest,如果不報錯,說明成功。

每次修改完了配置文件,都要記得運行service nginx restart。

隨後收集靜態文件,其中包括了css,js等文件,如果這些文件改變了都要重新進行收集,項目不會自己改變。

使用supervisor管理uwsgi

supervisor可以使uwsgi進程更加穩定。

因為supervisor是用python寫成的,所以通過pip即可安裝。

並且因為supervisor不支持python3,因此需要把supervisor安裝在python2的環境中。

pip2 install supervisor

在項目的根目錄下創建一個文件叫做supervisor.conf,然後將以下代碼填入到配置文件中:

# supervisor的程序名字
[program:mysite]
# supervisor執行的命令
command=uwsgi --ini xm_uwsgi.ini
# 項目的目錄
directory = /srv/xm
# 開始的時候等待多少秒
startsecs=0
# 停止的時候等待多少秒
stopwaitsecs=0
# 自動開始
autostart=true
# 程序掛了後自動重啟
autorestart=true
# 輸出的log文件
stdout_logfile=/srv/xm/log/supervisord.log
# 輸出的錯誤文件
stderr_logfile=/srv/xm/log/supervisord.err

[supervisord]
# log的級別
loglevel=debug

[inet_http_server]
# supervisor的伺服器
port = :9001
# 用戶名和密碼
username = admin
password = 123

# 使用supervisorctl的配置
[supervisorctl]
# 使用supervisorctl登錄的地址和埠號
serverurl = http://127.0.0.1:9001

# 登錄supervisorctl的用戶名和密碼
username = admin
password = 123

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

隨後為避免日誌衝突,刪掉uwsgi.ini的最後一行,然後使用命令supervisord -c supervisor.conf運行就可以了。

以後如果想要啟動uwsgi,就可以通過命令supervisorctl -c supervisor.conf進入到管理控制台,然後可以執行相關的命令進行管理:

  • status # 查看狀態
  • start program_name #啟動程序
  • restart program_name #重新啟動程序
  • stop program_name # 關閉程序
  • reload # 重新載入配置文件
  • quit # 退出控制台

隨後網站就可以在互聯網上進行訪問了。

一些補充

由於網站搜索功能中使用了haystack,其views文件在自身的庫里,由於要使搜索界面嵌入』歷史上的今天『功能,對其views做了改變,故也只能在伺服器上手動改變haystack庫。關於『歷史上的今天』功能實現可以看我另一篇文章:

文章詳情頁?

www.beitexi.cn圖標

其他有趣API的調用:

貝特西:通過爬蟲爬取2000名明星照片進行顏值評測,你心中的男/女神有多少評分??

zhuanlan.zhihu.com圖標貝特西:通過Python調用騰訊簡訊api實現註冊驗證碼發送?

zhuanlan.zhihu.com圖標

如果對部署有什麼其他方案或細節補充,歡迎寫在評論區。

推薦閱讀:

輕量級辦公平台開發實錄(11):FullCalendar
【記錄】Django學習26
十一、【用django2.0來開發】Django的ORM到底如何用——QuerySet
Django實戰1-許可權管理功能實現-01:搭建開發環境
Django實戰1-許可權管理功能實現-09:組織架構關聯用戶

TAG:Django(框架) | Ubuntu | 網站建設 |