Django網站部署(Ubuntu16.04+uwsgi+nginx+supervisor)
個人網站(基於Django框架,標題圖片為關於本站界面):我的數據生活
這幾天在部署中遇到了很多問題和疑難,特通過此文總結Django網站部署過程。
本機的準備
1.本機多次測試,確認項目沒有bug。千萬不要留一些小bug到伺服器上去解決!
2.用pip freeze > requirements.txt
將當前環境的包導出到requirements.txt
文件中,方便部署的時候安裝。
3.使用代碼託管平台保存代碼,這裡推薦碼雲,在碼雲上註冊並創建一個項目。碼雲地址:https://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伺服器有以下好處:
- uwsgi對靜態文件資源處理並不好,包括響應速度,緩存等。
- nginx作為專業的web伺服器,暴露在公網上會比uwsgi更加安全一點。
- 運維起來更加方便。比如要將某些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庫。關於『歷史上的今天』功能實現可以看我另一篇文章:
文章詳情頁其他有趣API的調用:
貝特西:通過爬蟲爬取2000名明星照片進行顏值評測,你心中的男/女神有多少評分?貝特西:通過Python調用騰訊簡訊api實現註冊驗證碼發送如果對部署有什麼其他方案或細節補充,歡迎寫在評論區。
推薦閱讀:
※輕量級辦公平台開發實錄(11):FullCalendar
※【記錄】Django學習26
※十一、【用django2.0來開發】Django的ORM到底如何用——QuerySet
※Django實戰1-許可權管理功能實現-01:搭建開發環境
※Django實戰1-許可權管理功能實現-09:組織架構關聯用戶
TAG:Django(框架) | Ubuntu | 網站建設 |