项目部署流程
- 項(xiàng)目部署是指在軟件開發(fā)完畢后,將開發(fā)機(jī)器上運(yùn)行的開發(fā)板軟件實(shí)際安裝到服務(wù)器上進(jìn)行長(zhǎng)期運(yùn)行
- 部署要分以下幾個(gè)步驟進(jìn)行
1. 在安裝機(jī)器上安裝和配置同版本的數(shù)據(jù)庫
1. django 項(xiàng)目遷移(在安裝機(jī)器上配置與開發(fā)環(huán)境相同的python版本及依懶的包)scp /路徑/a.jpg root@127.0.0.1:/qweer/.
? ?xshell ?finalshell(本土版)
1. 在安裝機(jī)器上安裝和配置同版本的數(shù)據(jù)庫
1. django 項(xiàng)目遷移(在安裝機(jī)器上配置與開發(fā)環(huán)境相同的python版本及依懶的包)scp /路徑/a.jpg root@127.0.0.1:/qweer/.
? ?xshell ?finalshell(本土版)
1. 用 uwsgi 替代`python3 manage.py runserver` 方法啟動(dòng)服務(wù)器
1. 配置 nginx 反向代理服務(wù)器
1. 用nginx 配置靜態(tài)文件路徑,解決靜態(tài)路徑問題
1.安裝同版本的數(shù)據(jù)庫
2.django 項(xiàng)目遷移
1. 安裝python
? ?- `$ sudo apt install python3`
2. 安裝相同版本的包
? ?- 導(dǎo)出當(dāng)前模塊數(shù)據(jù)包的信息:
? ? ?- `$ pip3 freeze > package_list.txt `
? ?- 導(dǎo)入到另一臺(tái)新主機(jī)
? ? ?- `$ pip3 install -r package_list.txt`
3. 將當(dāng)前項(xiàng)目源代碼復(fù)制到遠(yuǎn)程主機(jī)上(scp 命令)
? ?- $ sudo scp 當(dāng)前項(xiàng)目源代碼 遠(yuǎn)程主機(jī)地址和文件夾
sudo scp /home/tarena/django/mysite1 root@88.77.66.55:/home/root/xxx 請(qǐng)輸入root密碼:遠(yuǎn)程計(jì)算機(jī)密碼### WSGI Django工作環(huán)境部署
- WSGI (Web Server Gateway Interface)Web服務(wù)器網(wǎng)關(guān)接口,是Python應(yīng)用程序或框架和Web服務(wù)器之間的一種接口,被廣泛使用
- 它實(shí)現(xiàn)了WSGI協(xié)議、http等協(xié)議。Nginx中HttpUwsgiModule的作用是與uWSGI服務(wù)器進(jìn)行交換。WSGI是一種Web服務(wù)器網(wǎng)關(guān)接口。
### uWSGI 網(wǎng)關(guān)接口配置 (ubuntu 18.04 配置)
- 使用 `python manage.py runserver` 通常只在開發(fā)和測(cè)試環(huán)境中使用。
- 當(dāng)開發(fā)結(jié)束后,完善的項(xiàng)目代碼需要在一個(gè)高效穩(wěn)定的環(huán)境中運(yùn)行,這時(shí)可以使用uWSGI
- uWSGI是WSGI的一種,它可以讓Django、Flask等開發(fā)的web站點(diǎn)運(yùn)行其中.
- 安裝uWSGI
? - 在線安裝 uwsgi
$ sudo pip3 install uwsgi -i http://mirrors.aliyun.com/pypi/simple/pip3更換國內(nèi)源:我的是:sudo pip3 install uwsgi -i https://pypi.tuna.tsinghua.edu.cn/simplesudo pip3 freeze|grep -i 'uwsgi'離線安裝
1. 在線下載安裝包:?
$ pip3 download uwsgi下載后的文件為 `uwsgi-2.0.18.tar.gz`
離線安裝
$ tar -xzvf uwsgi-2.0.18.tar.gz$ cd uwsgi-2.0.18$ sudo python3 setup.py install配置uWSGI
- 添加配置文件 `項(xiàng)目文件夾/uwsgi.ini`
? - 如: mysite1/uwsgi.ini
[uwsgi]# 套接字方式的 IP地址:端口號(hào)# socket=127.0.0.1:8000# Http通信方式的 IP地址:端口號(hào)http=127.0.0.1:8000# 項(xiàng)目當(dāng)前工作目錄chdir=/home/tarena/.../my_project 這里需要換為項(xiàng)目文件夾的絕對(duì)路徑# 項(xiàng)目中wsgi.py文件的目錄,相對(duì)于當(dāng)前工作目錄wsgi-file=my_project/wsgi.py# 進(jìn)程個(gè)數(shù)process=4# 每個(gè)進(jìn)程的線程個(gè)數(shù)threads=2# 服務(wù)的pid記錄文件pidfile=uwsgi.pid# 服務(wù)的目志文件位置daemonize=uwsgi.log# 開啟主進(jìn)程管理模式master=true?- - 修改settings.py將 DEBUG=True 改為DEBUG=False
? - 修改settings.py 將 ALLOWED_HOSTS = [] 改為 ALLOWED_HOSTS = ['網(wǎng)站域名'] 或者 ['服務(wù)監(jiān)聽的ip地址']
- uWSGI的運(yùn)行管理
? - 啟動(dòng) uwsgi
$ cd 項(xiàng)目文件夾 $ sudo uwsgi --ini 項(xiàng)目文件夾/uwsgi.ini停止 uwsgi
$ cd 項(xiàng)目文件夾 $ sudo uwsgi --stop uwsgi.pid說明:
- 當(dāng)uwsgi 啟動(dòng)后,當(dāng)前django項(xiàng)目的程序已變成后臺(tái)守護(hù)進(jìn)程,在關(guān)閉當(dāng)前終端時(shí)此進(jìn)程也不會(huì)停止。
- 若執(zhí)行 stop 操作失敗,則需要執(zhí)行如下操作殺死進(jìn)程
ps aux|grep 'uwsgi' -> 查看uwsgi進(jìn)程tarena 103408 0.0 0.9 137172 39984 ? S 10:02 0:01 uwsgi --ini uwsgi.ini tarena 103410 0.0 0.9 436200 38552 ? Sl 10:02 0:00 uwsgi --ini uwsgi.inips -ef | grep 'uwsgi' | grep -v grep | awk '{print $2}' | xargs kill -9- 測(cè)試:
? - 在瀏覽器端輸入<http://127.0.0.1:8000> 進(jìn)行測(cè)試
? - 注意,此時(shí)端口號(hào)為8000
### nginx 反向代理配置
- Nginx是輕量級(jí)的高性能Web服務(wù)器,提供了諸如HTTP代理和反向代理、負(fù)載均衡、緩存等一系列重要特性,在實(shí)踐之中使用廣泛。
- C語言編寫,執(zhí)行效率高
- nginx 作用
? - 負(fù)載均衡, 多臺(tái)服務(wù)器輪流處理請(qǐng)求
? - 反向代理
- 原理:
- 客戶端請(qǐng)求nginx,再由nginx 請(qǐng)求 uwsgi, 運(yùn)行django下的python代碼
- ubuntu 下 nginx 安裝
? $ sudo apt install nginx
nginx 配置?
- 修改nginx 的配置文件 /etc/nginx/sites-enabled/default
# 在server節(jié)點(diǎn)下添加新的location項(xiàng),指向uwsgi的ip與端口。 server {...location / {uwsgi_pass 127.0.0.1:8000; # 重定向到127.0.0.1的8000端口include /etc/nginx/uwsgi_params; # 將所有的參數(shù)轉(zhuǎn)到uwsgi下}... }nginx服務(wù)控制
$ sudo /etc/init.d/nginx start|stop|restart|status # 或 $ sudo service nginx start|stop|restart|status進(jìn)入127.0.0.1/admin/ 若返回 502 -ps aux|grep 'uwsgi'若返回 500-sudo vim uwsgi.log通過 start,stop,restart,status 可能實(shí)現(xiàn)nginx服務(wù)的啟動(dòng)、停止、重啟、查撲克狀態(tài)等操作
修改uWSGI配置?
- **修改`項(xiàng)目文件夾/uwsgi.ini`下的Http通信方式改為socket通信方式**
[uwsgi] # 去掉如下 # http=127.0.0.1:8000 # 改為 socket=127.0.0.1:8000**重啟uWSGI服務(wù)**
$ sudo uwsgi --stop uwsgi.pid $ sudo uwsgi --ini 項(xiàng)目文件夾/uwsgi.ini測(cè)試:
- 在瀏覽器端輸入<http://127.0.0.1> 進(jìn)行測(cè)試
- 注意 :
? ? ? ?1,此時(shí)端口號(hào)為80(nginx默認(rèn)值)
? ? ? ?2,**Django中有任何修改 需要重啟 uwsgi , 否則修改不生效**
### nginx 配置靜態(tài)文件路徑
- 創(chuàng)建新路徑-主要存放Django所有靜態(tài)文件 如: /home/tarena/項(xiàng)目名_static/
- 在Django settings.py 中添加新配置
STATIC_ROOT = '/home/tarena/項(xiàng)目名_static/static #注意 此配置路徑為 存放所有正式環(huán)境中需要的靜態(tài)文件- 進(jìn)入項(xiàng)目,執(zhí)行 ?**python3 manage.py collectstatic** 。執(zhí)行該命令后,Django將項(xiàng)目重所有靜態(tài)文件 復(fù)制到 STATIC_ROOT 中 ,包括Django內(nèi)建的靜態(tài)文件【如admin后臺(tái)的樣式】
- Nginx配置中添加新配置(麻煩nginx去找靜態(tài)文件)
# file : /etc/nginx/sites-enabled/default # 新添加location /static 路由配置,重定向到指定的 第一步創(chuàng)建的路徑即可 server {...location /static {# root 第一步創(chuàng)建文件夾的絕對(duì)路徑,如:root /home/tarena/項(xiàng)目名_static; #在項(xiàng)目評(píng)級(jí)目錄中建一個(gè)文件夾:項(xiàng)目名_static}... }### 404/500 界面?
- 在模板文件夾內(nèi)添加 404.html 模版,當(dāng)視圖觸發(fā)Http404 異常時(shí)將會(huì)被顯示
- 404.html 僅在發(fā)布版中(即setting.py 中的 DEBUG=False時(shí)) 才起作用
- 當(dāng)向應(yīng)處理函數(shù)觸發(fā)Http404異常時(shí)就會(huì)跳轉(zhuǎn)到404界面
### 郵件告警
- 當(dāng)正式服務(wù)器上代碼運(yùn)行有報(bào)錯(cuò)時(shí),可將錯(cuò)誤追溯信息發(fā)至指定的郵箱
- 配置如下 settings.py中
#在基礎(chǔ)郵件配置之后 添加如下#關(guān)閉調(diào)試模式 DEBUG = False #錯(cuò)誤報(bào)告接收方 ADMINS = [('guoxiaonao', 'xxxx@example.com'), ('wanglaoshi', 'xxxx@example.com')]#發(fā)送錯(cuò)誤報(bào)告方,默認(rèn)為 root@localhost賬戶,多數(shù)郵件服務(wù)器會(huì)拒絕 SERVER_EMAIL = 'email配置中的郵箱'- 過濾敏感信息
報(bào)錯(cuò)郵件中會(huì)顯示一些錯(cuò)誤的追蹤,這些錯(cuò)誤追蹤中會(huì)出現(xiàn)如 password等敏感信息,Django已經(jīng)將配置文件中的敏感信息 過濾修改為 ? 多個(gè)星號(hào),但是用戶自定義的視圖函數(shù)需要用戶手動(dòng)過濾敏感信息
1,視圖函數(shù)中的局部變量
from django.views.decorators.debug import sensitive_variables@sensitive_variables('user', 'pw', 'cc') def process_info(user):pw = user.pass_wordcc = user.credit_card_numbername = user.name... #注意: #1 若報(bào)錯(cuò)郵件中牽扯到user,pw,cc等局部變量的值,則會(huì)將其替換成 *****, 而 name 變量還顯示其真實(shí)值 #2 多個(gè)裝飾器時(shí),需要將其放在最頂部 #3 若不傳參數(shù),則過濾所有局部變量的值2,POST提交中的數(shù)據(jù)
from django.views.decorators.debug import sensitive_post_parameters@sensitive_post_parameters('password', 'username') def index(request):s = request.POST['username'] + request.POST['abcd']#'abcd' 并不存在,此時(shí)引發(fā)error #POST中 username 及 password的值會(huì)被替換成 ******總結(jié)
- 上一篇: 3DMAX入门需要什么基础?中英文版本?
- 下一篇: 拯救者y7000p进入BIOS