前期本人完成了“編寫你的第一個 Django 應(yīng)用程序”,有了一個簡單的項目代碼,在本地window系統(tǒng)自測沒問題了,接下來就想辦法部署到服務(wù)器上,可以通過公網(wǎng)訪問我們的Django項目。將開發(fā)機器上運行的開發(fā)版軟件實際安裝到服務(wù)器上進(jìn)行長期運行,這是使用 Django 框架進(jìn)行開發(fā)的的最后一個環(huán)節(jié),也是非常重要的一部分。
本人在把Django項目部署到服務(wù)器過程中,發(fā)現(xiàn)對于新手來說還是比較難的,百度上實際可用的項目部署參考文檔鳳毛麟角,絕大多數(shù)參考文檔支離破碎,并不能真正指導(dǎo)一個新手完成一個項目的完整部署。為方便新手們順利完成項目部署,本人參考了許多文檔資料,將一個Django項目在云服務(wù)器上的部署全過程整理成詳細(xì)部署文檔,希望能夠?qū)椖啃率痔峁┮恍嶋H可用的幫助,總體部署是基于:centos7+nginx+uwsgi+python3+django 之上做的。。
在實際的工作中,線上環(huán)境的服務(wù)器主機大部分都購買自阿里云亦或是騰訊云(大型互聯(lián)網(wǎng)企業(yè)都是自己的服務(wù)器集群,而對于中小型公司來說成本太高,所以一般都采用購買云服務(wù)主機的方式)它們是現(xiàn)在主流的云虛擬主機提供方,如果你想自己搭建一個網(wǎng)站在線上環(huán)境下運行,你除了需要一個域名外還要有一臺云虛擬機用來部署你的項目,這些大家可以自行了解。
一、云服務(wù)器前提環(huán)境條件:
根據(jù)在本地window系統(tǒng)下開發(fā)環(huán)境,在服務(wù)器上也要保持同步環(huán)境。
1,安裝python3.7?,這塊不懂的網(wǎng)上自行搜索方法,因為服務(wù)器本身有python2 版本,所以安裝python3.7 版本后,執(zhí)行python3.7 的命令改成 python3 開頭。
2,安裝mysql?5.7.10?,記得新建相同名的數(shù)據(jù)庫,遷移本地數(shù)據(jù)庫表結(jié)構(gòu)和數(shù)據(jù),這塊不懂的網(wǎng)上自行搜索方法。
3,安裝Django?3.2.18 。
以上前提環(huán)境條件準(zhǔn)備好后開始部署“編寫你的第一個 Django 應(yīng)用程序”。
二、部署uwsgi服務(wù)器
1. 什么是WSGI協(xié)議:
Django 是 Python 語言編寫的 Web 框架,而我們使用 Django 編寫的項目稱為 Web 應(yīng)用,而一個 Web 項目的運行離不開 Web 服務(wù)器,所以就需要一種規(guī)范或者協(xié)議來定義 Web 應(yīng)用如何與 Web 服務(wù)器之間實現(xiàn)交互以及請求的接受與響應(yīng)的返回,這就引出了 WSGI 協(xié)議。
所以,我們就能夠了解到 WSGI 協(xié)議的主要工作職責(zé)是什么了。
1) 從定義層面理解WSGI協(xié)議
WSGI(Web Server Gateway Interface)即 Web 服務(wù)器網(wǎng)關(guān)接口,它是屬于一種規(guī)范協(xié)議,它定義了 Python Web 應(yīng)用程序與 Web 服務(wù)器通信的接口。為了讓大家更容易理解 WSGI 的作用,我們舉一個通俗易懂的例子,比如,世界上有很多國家,各個國家之間貨幣都不通用,當(dāng)你需要到韓國旅游的時候,就需要把我們的人民幣按照國際匯率標(biāo)椎兌換成韓元,這樣我們才可以在韓國消費,而國際匯率標(biāo)準(zhǔn)就是一套完整的規(guī)范協(xié)議準(zhǔn)則,也就相當(dāng)于本節(jié)講到的 WSGI 協(xié)議,需要各個國家遵守。
2) Python Web中WSGI協(xié)議
通過上面例子,再理解 WSGI 協(xié)議在 Python Web 中的作用就變的非常簡單。Python 語言有各種各樣的 Web 應(yīng)用框架,如果在沒有統(tǒng)一標(biāo)準(zhǔn)的情況下,可能需要針對每一個框架去實現(xiàn)各自的 Web 服務(wù)器??上攵?,如果這樣的話,會給我開發(fā)者帶來繁重的工作量。
WSGI 協(xié)議的出現(xiàn)恰恰解決了上述問題,它可以讓 Web 服務(wù)器知道如何去調(diào)用 Python 應(yīng)用程序;讓 Python 應(yīng)用程序知道客戶端在請求什么,以及如何返回結(jié)果給 Web 服務(wù)器,WSGI 實現(xiàn)了 Web 服務(wù)器與應(yīng)用程序之間的交互。
2. Django內(nèi)置WSGI服務(wù)器
在 WSGI 協(xié)議中定義了兩個角色:一個是 Web 服務(wù)器即 server,另一個是應(yīng)用程序即 application,server 需要接受來自客戶端的請求,然后根據(jù)協(xié)議定義調(diào)用應(yīng)用程序(application),應(yīng)用程序處理請求并返回結(jié)果給 server,最終響應(yīng)給客戶端。
Django 框架同時實現(xiàn)了 WSGI 的 server 和 application。其中內(nèi)置的?WSGI 服務(wù)器是基于 Python 的內(nèi)置模塊 wsgiref?實現(xiàn)的,主要是添加了一些異常處理和錯誤記錄,但是沒有考慮到運行效率,故不適合在生產(chǎn)環(huán)境中使用,它主要被使用在開發(fā)和測試過程中。在這里進(jìn)行一下簡單的講解,不作為本節(jié)的重點。
3. uWSGI生產(chǎn)環(huán)境的搭建與配置
上面介紹了 Django 的內(nèi)置 WSGI 服務(wù)器的實現(xiàn),但是由于 Django 并不專注于實現(xiàn)服務(wù)器,所以內(nèi)置的 WSGI 服務(wù)器無法滿足生產(chǎn)環(huán)境的需求,所以我們在這里要介紹另外一種 WSGI 服務(wù)器,即 uWSGI。
1) uWSGI服務(wù)器簡單介紹
uWSGI 是當(dāng)下最流行的一種 WSGI 服務(wù)器,同樣遵守 WSGI 協(xié)議。它可以與各種 Python Web 框架實現(xiàn)兼容,而且配置過程與使用方式都非常簡單。我們之前使用 runserver 命令啟動項目,通常只是在開發(fā)和測試環(huán)境中使用。當(dāng)開發(fā)結(jié)束后,完善的項目代碼需要在一個高效穩(wěn)定的環(huán)境中運行,這時候可以使用 uWSGI,它是 WSGI 服務(wù)器的一種,它可以讓 Django、Flask 等開發(fā)的 Web 應(yīng)用站點運行其中。
2) 安裝與配置uWSGI服務(wù)器
要使用 uWSGI,首先要對它進(jìn)行安裝,但是這里有一點需要注意,因為項目都是部署在 Linux 系統(tǒng)上,所以這些操作也要在Linux 系統(tǒng)上完成,學(xué)會配置 uWSGI 服務(wù)器。
pip3 install uwsgi
使用上述命令安裝 uWSGI,安裝完成后在 mysite?項目的根目錄下,新建 uwsgi.ini 配置文件(和 manage.py 文件同級目錄),并在該文件中進(jìn)行如下配置:
[uwsgi] # 套接字方式的 IP地址:端口號 socket=127.0.0.1:8000 # Http通信方式的 IP地址:端口號 # http=127.0.0.1:8000 #上述兩種方式選擇其一,在使用Nginx需要使用socket # 項目當(dāng)前工作目錄自行配置 chdir=/home/py_workspace/django_pro/mysite 這里需要換為項目文件夾的絕對路徑 #指定wsgi模塊下的application對象 module = mysite.wsgi:application #是否啟動主進(jìn)程來管理其他進(jìn)程 master=true # 以上4個是核心配置項 # 項目中wsgi.py文件的目錄,相對于當(dāng)前工作目錄 wsgi-file=mysite/mysite/wsgi.py # 進(jìn)程個數(shù),根據(jù)電腦配置設(shè)置 process=4 # 每個進(jìn)程的線程個數(shù) threads=2 # 服務(wù)的pid記錄文件 pidfile=uwsgi.pid # 服務(wù)的日志文件位置 daemonize=uwsgi.log
然后修改項目 ./mysite/settings.py 文件將其設(shè)置為適合線上生產(chǎn)環(huán)境使用,如下所示:
....
DEBUG=False #關(guān)閉調(diào)試模式
ALLOWED_HOSTS = ['*'] #任何ip都可以訪問
....
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'world', #服務(wù)器數(shù)據(jù)庫名
"USER": "root",
"PASSWORD": "123456", #服務(wù)器數(shù)據(jù)庫密碼
"HOST": "127.0.0.1", #服務(wù)器數(shù)據(jù)庫地址, 項目代碼部署的服務(wù)器和數(shù)據(jù)庫服務(wù)器一致可以用這個,不同的話使用實際數(shù)據(jù)庫地址
"PORT": "3306",
"OPTIONS": {"init_command": "SET default_storage_engine=INNODB",},
}
}
3) 啟動與測試uWSGI服務(wù)器
配置完成后,我們就可以使用下面的命令啟動 uWSGI 了:
#啟動 uwsgi 命令 $ cd ./mysite/mysite # 項目文件夾,uwsgi.ini 配置文件 下執(zhí)行 $ uwsgi --ini uwsgi.ini #停止 uwsgi 命令 $ uwsgi --stop uwsgi.pid
說明:當(dāng) uWSGI 啟動后,當(dāng)前 Django 項目的程序已變成后臺守護(hù)進(jìn)程,在關(guān)閉當(dāng)前終端時此進(jìn)程也不會停止。執(zhí)行完我啟動命令后,可以看到在項目的主目錄下又生成了兩個文件分別是 uwsgi.pid 與 uwsgi.log,它們分別用來記錄,uWsgi 的進(jìn)程號碼 pid 與 uWSGI 的相關(guān)運行日志。啟動成功的標(biāo)志如下所示:
[uWSGI] getting INI configuration from uwsgi.ini
此時 uWSGI.log 會幫助我們記錄 uWSGI 服務(wù)器的請求日志等等,有興趣可以自己看一看日志內(nèi)容。上述就是 uWSGI 服務(wù)器的完整部署與使用流程,不過如果這樣使用的話, uWSGI 會直接暴露給客戶端用戶,所以它通常會和 Nginx 搭配在一起進(jìn)行使用。
三、部署Nginx服務(wù)器
1. 什么是Nginx及其主要作用?
Nginx (engine x) 是一個高性能的 HTTP ,負(fù)載均衡和反向代理 Web 服務(wù)器。Nginx 的主要作用是作為 Web 服務(wù)器的反向代理服務(wù)器,實現(xiàn) Web 服務(wù)器的負(fù)載均衡以及站點資源的動靜分離。
你雖然知道了 Nginx 擁有強大的功能,并且在實際應(yīng)用中使用很廣泛,但是你可能仍然處于云里霧里的感覺,所以我們就要理解一些和相關(guān)概念,比如什么是反向代理、負(fù)載均衡以及動靜分離。
1) 反向代理服務(wù)器
反向代理服務(wù)器位于客戶端用戶與目標(biāo)服務(wù)器之間,但是對于用戶而言,反向代理服務(wù)器就相當(dāng)于目標(biāo)服務(wù)器,即用戶直接訪問反向代理服務(wù)器就可以獲得目標(biāo)服務(wù)器的資源。同時,用戶不需要知道目標(biāo)服務(wù)器的地址,也無須在用戶端作任何設(shè)定。反向代理服務(wù)器通??捎脕碜鳛?Web 加速,用來提升用戶訪問站點的速度,所以使用 Nignx 作為 Web 服務(wù)器的前置服務(wù)器可以降低網(wǎng)絡(luò)和服務(wù)器的負(fù)載,從而提高訪問效率。
2) 什么是負(fù)載均衡
負(fù)載均衡(Load Balance),它的意思就是將工作任務(wù)分?jǐn)偟蕉鄠€操作單元上進(jìn)行執(zhí)行,比如 Web 服務(wù)器、FTP 服務(wù)器、企業(yè)關(guān)鍵應(yīng)用服務(wù)器和其它關(guān)鍵任務(wù)服務(wù)器等,從而共同完成工作任務(wù)。單個服務(wù)器解決不了,我們增加服務(wù)器的數(shù)量,然后將請求分發(fā)到各個服務(wù)器上面,將原先請求到單個服務(wù)器上面的情況改為將請求分發(fā)到多個服務(wù)器上,將負(fù)載分發(fā)到不同的服務(wù)器,這就是負(fù)載均衡。
3) 理解動靜分離
所謂動靜分離就是為了加快網(wǎng)站的解析速度,可以把動態(tài)頁面和靜態(tài)頁面由不同的服務(wù)器來解析,加快解析速度,降低單個服務(wù)器的壓力。進(jìn)而提升整個服務(wù)訪問性能和可維護(hù)性。
4) Nginx應(yīng)用場景
主要有以下三大場景:
一、作為虛擬主機,它可以實現(xiàn)在一臺服務(wù)器虛擬出多個網(wǎng)站;
二、用來充當(dāng)?HTTP 服務(wù)器。Nginx 是一個 HTTP 服務(wù)器可以獨立提供 HTTP 服務(wù),也可以做網(wǎng)頁靜態(tài)服務(wù)器;
三、實現(xiàn)反向代理、負(fù)載均衡。當(dāng)網(wǎng)站的訪問量達(dá)到一定程度后,單臺服務(wù)器不能滿足用戶的請求,這時就需要用多臺服務(wù)器組成服務(wù)集群并把 Nginx 做為反向代理服務(wù)器,實現(xiàn)多臺服務(wù)器可以平均分擔(dān)負(fù)載的目的,這樣就不會造成某臺服務(wù)器負(fù)載過高而宕機,而集群中另一臺服務(wù)器閑置的情況。
?
2. 實現(xiàn)Nginx+uWSGI+Django項目部署
1) 項目部署原理分析
我們了解了 Nginx 的主要作用,在整個項目中起著關(guān)鍵的作用。在項目部署中,Nginx 作為“帶頭大哥”迎難而上來接收數(shù)客戶端的請求(一個Nginx服務(wù)器能夠同一時刻支撐 5 萬的并發(fā)量),并將請求分為動態(tài)請求與靜態(tài)請求,而 uWSGI 是排在第二位“二哥”將 Nginx 接收到的請求轉(zhuǎn)變?yōu)?Django Web 框架能看懂的形式并發(fā)送給 Django,根據(jù)客戶端請求,Django 返回響應(yīng)交給 uWSGIM 依次傳遞,最后由 Nginx 返回給客戶端響應(yīng),如下圖所示:
?
圖1:Django項目部署流程分析圖
?
簡圖如下所示,理解起來非常方便:
圖2:Django項目部署流程簡易圖
2) Nginx安裝與配置
理解了上面原理架構(gòu)圖,我們就正式開始安裝配置 Nginx ,使用如下命令在線安裝即可:
yum -y install nginx
安裝完了,我們要查找nginx 安裝到哪里了,有那些重要文件和路徑。
服務(wù)器上查看安裝路徑命令:
whereis nginx
/usr/sbin/naginx ---執(zhí)行路徑
/usr/lib64/nginx ---安裝路徑
/etc/nginx/ --- 配置路徑
/usr/share/nginx ---默認(rèn)站點目錄
1、修改nginx配置文件
cd?/etc/nginx? #進(jìn)入配置路徑
#先備份一個配置文件
cp nginx.conf nginx.conf.bak
#修改配置文件
vi nginx.conf
打開文件后,清空,復(fù)制如下配置信息,然后再根據(jù)實際情況修改部分?jǐn)?shù)據(jù)。
#user root;
#worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
gzip on;
server {
# 監(jiān)聽端口號
listen 80;
# 你的云服務(wù)器ip
server_name xx.xx.xx.xx;
charset utf-8;
client_max_body_size 75M; # adjust to taste
location / {
# 將nginx所有請求轉(zhuǎn)到uwsgi
include uwsgi_params;
# uwsgi的ip與端口,與之前的 uwsgi.ini 配置文件 地址端口一致
uwsgi_pass 127.0.0.1:8000;
}
location /static {
# 靜態(tài)文件目錄
alias /home/py_workspace/django_pro/mysite/static;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
2.、配置完成后,啟動nginx.
cd?/usr/sbin? #進(jìn)入執(zhí)行路徑
#啟動 nginx
./nginx
#重啟 nginx
./nginx -s reload
#停止 nginx
./nginx -s stop
ps -ef|grep nginx? ? 查端是否啟動成功
[root@ /usr/sbin]# ps -ef|grep nginx
root 7760 1 0 18:07 ? 00:00:00 nginx: master process ./nginx
nginx 7761 7760 0 18:07 ? 00:00:00 nginx: worker process
root 8449 8413 0 21:53 pts/0 00:00:00 grep --color=auto nginx
四、完成部署
經(jīng)過 uwsgi 服務(wù)器和??nginx 服務(wù)器 部署配置,啟動完成后,基本就結(jié)束部署了,打開瀏覽器,查看部署的第一個Django項目。
xx.xx.xx.xx? 代表你的云服務(wù)器對外訪問IP,因為nginx 配置默認(rèn)端口為 80 , 云服務(wù)器一般開通了80端口訪問權(quán)限,然后 uwsgi + Django 配置了 8000端口,需要在云服務(wù)器官網(wǎng),自己添加 8000 端口訪問權(quán)限,這塊自行網(wǎng)上搜索解決,網(wǎng)絡(luò)端口解決了,直接輸入下面網(wǎng)址查看部署結(jié)果。
--?進(jìn)入后臺管理網(wǎng)頁
http://xx.xx.xx.xx/admin
?--?進(jìn)入自建的 polls 網(wǎng)頁
http://xx.xx.xx.xx/polls
文章來源:http://www.zghlxwxcb.cn/news/detail-703973.html
--------------------------------------end------------------------------文章來源地址http://www.zghlxwxcb.cn/news/detail-703973.html
到了這里,關(guān)于云服務(wù)器下如何部署Django項目詳細(xì)操作步驟的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!