摘要:部署項(xiàng)目部署一個(gè)的開源框架。輪詢負(fù)載均衡在配置文件中添加如下配置,此配置有三臺(tái)服務(wù)器提供支付服務(wù)。缺省配置就是輪詢策略負(fù)載均衡支持和協(xié)議,只需要修改后面的協(xié)議即可支持的負(fù)載均衡只需將改為即可。
部署Django項(xiàng)目 Django+uWSGI+nginx 部署
django 一個(gè)pyhton的開源web框架。
uWSGI 一個(gè)基于自有的uwsgi協(xié)議、WSGI協(xié)議和http服務(wù)協(xié)議的web網(wǎng)關(guān)
nginx 常用的代理服務(wù)器
WSGI:一種實(shí)現(xiàn)python解析的通用接口標(biāo)準(zhǔn)/協(xié)議,是一種通用的接口標(biāo)準(zhǔn)或者接口協(xié)議,實(shí)現(xiàn)了python web程序與服務(wù)器之間交互的通用性。?項(xiàng)目流程
利用它,web.py或bottle或者django等等的python web開發(fā)框架,就可以輕松地部署在不同的web server上了;uwsgi:同WSGI一樣是一種通信協(xié)議?
uwsgi協(xié)議是一個(gè)uWSGI服務(wù)器自有的協(xié)議,它用于定義傳輸信息的類型,它與WSGI相比是兩樣?xùn)|西。uWSGI?:一種python web server或稱為Server/Gateway?
uWSGI類似tornadoweb或者flup,是一種python web server,uWSGI是實(shí)現(xiàn)了uwsgi和WSGI兩種協(xié)議的Web服務(wù)器,負(fù)責(zé)響應(yīng)python 的web請(qǐng)求。?
因?yàn)閍pache、nginx等,它們自己都沒有解析動(dòng)態(tài)語言如php的功能,而是分派給其他模塊來做,比如apache就可以說內(nèi)置了php模塊,讓人感覺好像apache就支持php一樣。?
uWSGI實(shí)現(xiàn)了wsgi協(xié)議、uwsgi協(xié)議、http等協(xié)議。 Nginx中HttpUwsgiModule的作用是與uWSGI服務(wù)器進(jìn)行交換。
首先客戶端請(qǐng)求服務(wù)資源,
nginx作為直接對(duì)外的服務(wù)接口,接收到客戶端發(fā)送過來的http請(qǐng)求,會(huì)解包、分析,
如果是靜態(tài)文件請(qǐng)求就根據(jù)nginx配置的靜態(tài)文件目錄,返回請(qǐng)求的資源,
如果是動(dòng)態(tài)的請(qǐng)求,nginx就通過配置文件,將請(qǐng)求傳遞給uWSGI;uWSGI 將接收到的包進(jìn)行處理,并轉(zhuǎn)發(fā)給wsgi,
wsgi根據(jù)請(qǐng)求調(diào)用django工程的某個(gè)文件或函數(shù),處理完后django將返回值交給wsgi,
wsgi將返回值進(jìn)行打包,轉(zhuǎn)發(fā)給uWSGI,
uWSGI接收后轉(zhuǎn)發(fā)給nginx,nginx最終將返回值返回給客戶端(如瀏覽器)。
*注:不同的組件之間傳遞信息涉及到數(shù)據(jù)格式和協(xié)議的轉(zhuǎn)換
? 作用:?
第一級(jí)的nginx并不是必須的,uwsgi完全可以完成整個(gè)的和瀏覽器交互的流程;?
在nginx上加上安全性或其他的限制,可以達(dá)到保護(hù)程序的作用;?
uWSGI本身是內(nèi)網(wǎng)接口,開啟多個(gè)work和processes可能也不夠用,而nginx可以代理多臺(tái)uWSGI完成uWSGI的負(fù)載均衡;?
django在debug=False下對(duì)靜態(tài)文件的處理能力不是很好,而用nginx來處理更加高效。
安裝與配置
創(chuàng)建項(xiàng)目運(yùn)行的虛擬環(huán)境
virtualenv env --python=python3.6 pip install -r requirements.txt #安裝django運(yùn)行環(huán)境
運(yùn)行開發(fā)服務(wù)器測(cè)試
cd project # 進(jìn)入項(xiàng)目 project 目錄 python manage.py runserver
運(yùn)行開發(fā)服務(wù)器測(cè)試,確保開發(fā)服務(wù)器下能正常打開網(wǎng)站。
安裝uWSGI
# 在普通用戶下安裝 sudo apt install libpython3.6-dev # 虛擬環(huán)境中 pip install uwsgi
測(cè)試uWSGI: 新建文件test.py,寫入以下內(nèi)容
def application(env, start_response): start_response("200 OK", [("Content-Type","text/html")]) return "Hello World"
運(yùn)行
# 0.0.0.0可以省略 sudo uwsgi --http 0.0.0.0:8000 --wsgi-file test.py --processes 4 --threads 3
如果提示端口已經(jīng)被占用,這時(shí)可以把相關(guān)的進(jìn)程 kill 掉。
probably another instance of uWSGI is running on the same address (:8002). bind(): Address already in use [core/socket.c line 764]
按照端口進(jìn)行查詢進(jìn)程
lsof -i :8002
可以查出:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME uwsgi 2208 tu 4u IPv4 0x53492abadb5c9659 0t0 TCP *:teradataordbms (LISTEN) uwsgi 2209 tu 4u IPv4 0x53492abadb5c9659 0t0 TCP *:teradataordbms (LISTEN)
這時(shí)根據(jù) PID 可以用下面的命令 kill 掉相關(guān)程序:
sudo kill -9 2208 2209
運(yùn)行django項(xiàng)目
# --chdir 項(xiàng)目目錄 --home 虛擬環(huán)境目錄 project.wsgi 指的是 project/wsgi.py 文件 uwsgi --http :8000 --chdir=/path/to/project --home=/path/to/env --module project.wsgi
配置文件運(yùn)行
上面這樣使用一行命令太長(zhǎng)了,我們使用 ini 配置文件來搞定,比如項(xiàng)目在 /home/ray/project 這個(gè)位置,在其中新建一個(gè) uwsgi.ini 全路徑為 /home/ray/project/uwsgi.ini
[uwsgi] #socket 為上線使用,http為直接作為服務(wù)器使用。 socket = 127.0.0.1:8080 #ip和端口號(hào)可以改 http = 127.0.0.1:8000 #項(xiàng)目目錄 chdir=/home/ray/project module=project.wsgi #虛擬環(huán)境目錄 #home = home/ray/MxOnline/mxonlineEnv master = true processes=4 threads=2 # 下面的參數(shù)不一定要加 # pidfile=uwsgi.pid uwsgi.pid 和uwsgi.log會(huì)在啟動(dòng)uwsgi時(shí)自動(dòng)生成在項(xiàng)目目錄下。 # daemonize=uswgi.log # max-requests=2000 # chmod-socket=664 # vacuum=true
# uwsgi啟動(dòng) uwsgi --ini uwsgi.ini #uwsgi 停止 uwsgi --stop uwsgi.pid
安裝nginx,在普通用戶下安裝。
# 安裝 sudo apt install nginx #重載 sudo /etc/init.d/nginx reload sudo nginx -s reload # 啟動(dòng) sudo /etc/init.d/nginx start # 停止 sudo /etc/init.d/nginx stop # 重啟 sudo /etc/init.d/nginx restart #查看nginx是否啟動(dòng) ps -ef | grep nginx root 24956 1 0 19:41 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx nobody 24957 24956 0 19:41 ? 00:00:00 nginx: worker process root 24959 10533 0 19:41 pts/0 00:00:00 grep --color=auto nginx
配置 nginx
##### sites-enable 和 sites-available
These directories are used to define configurations for your websites. Files are generally created in the "sites-available" directory, and thensymbolically linked to the "sites-enabled" directory when they are ready to go live.? 都是在nginx.conf作修改,因?yàn)閚ginx.conf include指令已經(jīng)包括了sites-enabled的內(nèi)容,在site-enabled作修改就相當(dāng)于在nginx.conf作修改,可維護(hù)性高。
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
ites-available是存放當(dāng)前的server配置, 在這里修改。
sites-enabled是激活并使用的server配置(從sites_available的文件創(chuàng)建快捷方式到sites-enabled)
新建一個(gè)網(wǎng)站 test
# 不用sudo沒有權(quán)限修改 sudo vim /etc/nginx/sites-available/test.conf
#配置負(fù)載均衡 # upstream ray { # server 127.0.0.1:8000; # for a web port socket #} server { listen 80; server_name www.helloray.cn;#域名或者ip地址 charset utf-8; # Django 的static和 media等靜態(tài)資源交給Nginx處理 location /static { # 路徑必須和STATIC_ROOT一樣 alias /var/www/myApp/static/; } location /media { #項(xiàng)目下的media路徑 alias /var/www/myApp/media/; } location /{ # 必須和uwsgi.ini中socket一樣,配置了upstream可以將uwsgi_pass配置為:http:// + upstream名稱,即“http://ray”. uwsgi_pass 127.0.0.1:8080; #uwsgi_pass http://ray; include uwsgi_params; } }
激活網(wǎng)站:建立軟鏈接
sudo ln -s /etc/nginx/sites-available/test.conf /etc/nginx/sites-enabled/test.conf
nginx創(chuàng)建靜態(tài)文件目錄,并更改權(quán)限
sudo mkdir -vp /var/www/myApp/static/ sudo chmod 777 /var/www/myApp/static/
在項(xiàng)目下setting.py 文件中
STATIC_URL = "static" STATIC_ROOT = "/var/www/myApp/static/" STATICFILES_DIRS = [ os.path.join(BASE_DIR,"static"), ] MEDIA_URL = "/media/" MEDIA_ROOT = os.path.join(BASE_DIR,"media")
在項(xiàng)目目錄下遷移靜態(tài)文件
python manage.py collectstatic
Django中settings.py中的五個(gè)設(shè)置參數(shù)的一些故事:
1、MEDIA_ROOT與MEDIA_URL 事實(shí)上MEDIA_ROOT和MEDIA_URL代表的是用戶上傳后的文件一般保存的地方。我的理解是,可變文件的文件夾。 與這兩個(gè)參數(shù)有聯(lián)系的,是在Django的FileField和ImageField這樣的Model類中,有upload_to參數(shù)可選。當(dāng)upload_to設(shè)置相關(guān)的地址后,如:upload_to="username";文件上傳后將自動(dòng)保存到 os.path.join(MEDIA_ROOT, upload_to)。 而MEDIA_URL,,則代表用戶通過URL來訪問這個(gè)本地地址的URL。如本機(jī)http://127.0.0.1/, MEDIA_URL設(shè)置為"/site_media/",那么通過 http://127.0.0.1/site_media/*** 就可以訪問相關(guān)的上傳圖片或者其他資源。 2、STATIC_ROOT與STATIC_URL STATIC_ROOT和STATIC_URL則是網(wǎng)站中,用于網(wǎng)站顯示的靜態(tài)圖片、CSS、JS等文件的保存地址。我的理解是,運(yùn)行中不會(huì)再變文件的文件夾(即不會(huì)刪除或者新增) 2.1 STATIC_URL 同MEDIA_URL類似;STATIC_URL為"/static/"時(shí)候,通過http://127.0.0.1/static/***就可以訪問相關(guān)的靜態(tài)文件了。 2.2 STATIC_ROOT STATIC_ROOT是一個(gè)比較特殊的文件夾。這是區(qū)別Django的開發(fā)模式和部署模式下最大的地方了。 通常我們?cè)陂_發(fā)模式下,可以在我們所在的project下建立相應(yīng)的app, 然后每個(gè)app下都建立相應(yīng)的static文件夾。在開發(fā)模式下(Debug=True),Django將為我們自動(dòng)查找這些靜態(tài)文件(每個(gè)app)并在網(wǎng)頁上顯示出來。然而,在部署模式下,Django認(rèn)為這些工作交由web服務(wù)器來運(yùn)行會(huì)更有效率。 因此,在部署時(shí),我們需要運(yùn)行一下python manage.py collectstatic 這個(gè)命令。這個(gè)命令將會(huì)把每個(gè)app里的static目錄下的文件copy到STATIC_ROOT這個(gè)文件夾下,這時(shí)候如果在部署模式下(Debug=False),網(wǎng)頁中相關(guān)的,如: http://127.0.0.1/static/*** 的訪問,將不會(huì)訪問Django下各個(gè)App中的static,而是STATIC_ROOT中所指定的文件夾。 3、Debug=False后,為何無法訪問圖片和js等文件了? 其實(shí)這個(gè)問題,是在于web服務(wù)器沒有對(duì)STATIC_ROOT以及MEDIA_ROOT這兩個(gè)文件夾進(jìn)行映射所導(dǎo)致的。 以apache為例,假定: STATIC_ROOT="/home/user/static/" STATIC_URL="/static/" MEDIA_ROOT="/home/user/media/" MEDIA_URL="/media/" 那么可以在apache的配置文件中,增加以下:負(fù)載均衡的設(shè)置Order deny,allow Allow from all Satisfy Any Alias /static/ "/home/user/static"Order deny,allow Allow from all Satisfy Any Alias /media/ "/home/user/media/" 4、STATICFILES_DIRS:和TEMPLATE_DIRS的含義差不多,就是除了各個(gè)app的static目錄以外還需要管理的靜態(tài)文件,添加到這里的文件會(huì)在collectstatic時(shí) copy到STATIC_ROOT中
網(wǎng)站的訪問量越來越大,服務(wù)器的服務(wù)模式也得進(jìn)行相應(yīng)的升級(jí),比如分離出數(shù)據(jù)庫服務(wù)器、分離出圖片作為多帶帶服務(wù),這些是簡(jiǎn)單的數(shù)據(jù)的負(fù)載均衡,將壓力分散到不同的機(jī)器上。有時(shí)候來自web前端的壓力,也能讓人十分頭痛。怎樣將同一個(gè)域名的訪問分散到兩臺(tái)或更多的機(jī)器上呢?這其實(shí)就是另一種負(fù)載均衡了,nginx自身就可以做到,只需要做個(gè)簡(jiǎn)單的配置就行。
nginx不單可以作為強(qiáng)大的web服務(wù)器,也可以作為一個(gè)反向代理服務(wù)器,而且nginx還可以按照調(diào)度規(guī)則實(shí)現(xiàn)動(dòng)態(tài)、靜態(tài)頁面的分離,可以按照輪詢、ip哈希、URL哈希、權(quán)重等多種方式對(duì)后端服務(wù)器做負(fù)載均衡,同時(shí)還支持后端服務(wù)器的健康檢查。
nginx 的 upstream目前支持 4 種方式的分配?
輪詢:將請(qǐng)求依次輪詢發(fā)給每個(gè)服務(wù)器,如果后端服務(wù)器down掉,能自動(dòng)剔除。
最少鏈接:將請(qǐng)求發(fā)送給持有最少活動(dòng)鏈接的服務(wù)器。
ip哈希:通過ip的哈希函數(shù)結(jié)果決定請(qǐng)求發(fā)送給哪個(gè)服務(wù)器。這樣每個(gè)訪客固定訪問一個(gè)后端服務(wù)器,可以解決session的問題。
權(quán)重:服務(wù)器的權(quán)重越高,處理請(qǐng)求的概率越大。用于后端服務(wù)器性能不均的情況。
輪詢負(fù)載均衡在nginx.conf配置文件中添加如下配置,此配置有三臺(tái)服務(wù)器提供支付服務(wù)。
缺省配置就是輪詢策略;
nginx負(fù)載均衡支持http和https協(xié)議,只需要修改 proxy_pass后面的協(xié)議即可;
nginx支持FastCGI, uwsgi, SCGI,memcached的負(fù)載均衡,只需將 proxy_pass改為uwsgi_pass, fastcgi_pass, scgi_pass,memcached_pass即可。
此策略適合服務(wù)器配置相當(dāng),無狀態(tài)且短平快的服務(wù)使用。
http { upstream CashServers { server CashServers1.com; server CashServers2.com; server CashServers3.com; } server { listen 80; location / { proxy_pass http://CashServers; } } }最少鏈接負(fù)載均衡
最少鏈接負(fù)載均衡通過least_conn指令定義;
此負(fù)載均衡策略適合請(qǐng)求處理時(shí)間長(zhǎng)短不一造成服務(wù)器過載的情況;
http { upstream CashServers { least_conn; server CashServers1.com; server CashServers2.com; server CashServers3.com; } server { listen 80; location / { proxy_pass http://CashServers; } } }ip哈希負(fù)載均衡
ip哈希負(fù)載均衡使用ip_hash指令定義;
nginx使用請(qǐng)求客戶端的ip地址進(jìn)行哈希計(jì)算,確保使用同一個(gè)服務(wù)器響應(yīng)請(qǐng)求;
此策略適合有狀態(tài)服務(wù),比如session;
http { upstream CashServers { ip_hash; server CashServers1.com; server CashServers2.com; server CashServers3.com; } server { listen 80; location / { proxy_pass http://CashServers; } } }?權(quán)重負(fù)載均衡
權(quán)重負(fù)載均衡需要使用weight指令定義;
權(quán)重越高分配到需要處理的請(qǐng)求越多;
此策略可以與最少鏈接負(fù)載和ip哈希策略結(jié)合使用;
此策略比較適合服務(wù)器的硬件配置差別比較大的情況;
http { upstream CashServers { server CashServers1.com weight=3; server CashServers2.com weight=2; server CashServers3.com weight=1; } server { listen 80; location / { proxy_pass http://CashServers; } } }
附錄:參數(shù)說明
>----------------附錄:uwsgi參數(shù)說明---------------- > >- http : 協(xié)議類型和端口號(hào) >- processes : 開啟的進(jìn)程數(shù)量 >- workers : 開啟的進(jìn)程數(shù)量,等同于processes(官網(wǎng)的說法是spawn the specified number ofworkers / processes) >- chdir : 指定運(yùn)行目錄(chdir to specified directory before apps loading) >- wsgi-file : 載入wsgi-file(load .wsgi file) >- stats : 在指定的地址上,開啟狀態(tài)服務(wù)(enable the stats server on the specified address) >- threads : 運(yùn)行線程。由于GIL的存在,我覺得這個(gè)真心沒啥用。(run each worker in prethreaded mode with the specified number of threads) >- master : 允許主進(jìn)程存在(enable master process) >- daemonize : 使進(jìn)程在后臺(tái)運(yùn)行,并將日志打到指定的日志文件或者udp服務(wù)器(daemonize uWSGI)。實(shí)際上最常 > 用的,還是把運(yùn)行記錄輸出到一個(gè)本地文件上。 >- daemonize : 使進(jìn)程在后臺(tái)運(yùn)行,并將日志打到指定的日志文件或者udp服務(wù)器(daemonize uWSGI)。實(shí)際上最常 > 用的,還是把運(yùn)行記錄輸出到一個(gè)本地文件上。 >- vacuum : 當(dāng)服務(wù)器退出的時(shí)候自動(dòng)清理環(huán)境,刪除unix socket文件和pid文件(try to remove all of the generated file/sockets)
?
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/40089.html
年前阿里云打折,1核1G的云服務(wù)器一年只要300多塊,果斷就租了1年的。既然服務(wù)器已經(jīng)到手,怎么能不把自己寫的項(xiàng)目部署上去呢,其實(shí)網(wǎng)上關(guān)于nginx+uwsgi部署Django項(xiàng)目的文章有很多,但是這些文章要不就是很久之前的,要不就是互相抄襲,一路過來都是坑,這里重點(diǎn)吧在部署時(shí)候遇到的坑著重介紹一下: 1.首先部署django項(xiàng)目 首先是django項(xiàng)目,由于我是使用Anaconda來進(jìn)行版本控制...
摘要:目標(biāo)在瀏覽器輸入回車進(jìn)入到項(xiàng)目主頁概念項(xiàng)目應(yīng)用該文章中的項(xiàng)目為服務(wù)高并發(fā)處理的好穩(wěn)定是服務(wù)器與框架之間一種簡(jiǎn)單而通用的接口項(xiàng)目部署部署環(huán)境準(zhǔn)備確保項(xiàng)目能夠運(yùn)行安裝服務(wù)用去安裝安裝啟動(dòng)驗(yàn)證打開瀏覽器輸入安裝務(wù)必用去安裝安裝驗(yàn)證 目標(biāo) : 在瀏覽器輸入 www.python1.com 回車 進(jìn)入到Django項(xiàng)目主頁 概念 Django項(xiàng)目(Web應(yīng)用)該文章中的django項(xiàng)...
摘要:目標(biāo)在瀏覽器輸入回車進(jìn)入到項(xiàng)目主頁概念項(xiàng)目應(yīng)用該文章中的項(xiàng)目為服務(wù)高并發(fā)處理的好穩(wěn)定是服務(wù)器與框架之間一種簡(jiǎn)單而通用的接口項(xiàng)目部署部署環(huán)境準(zhǔn)備確保項(xiàng)目能夠運(yùn)行安裝服務(wù)用去安裝安裝啟動(dòng)驗(yàn)證打開瀏覽器輸入安裝務(wù)必用去安裝安裝驗(yàn)證 目標(biāo) : 在瀏覽器輸入 www.python1.com 回車 進(jìn)入到Django項(xiàng)目主頁 概念 Django項(xiàng)目(Web應(yīng)用)該文章中的django項(xiàng)...
摘要:腳本啟動(dòng)服務(wù)器方便起見,我們可以設(shè)置腳本啟動(dòng)重啟服務(wù)器,在目錄下新建腳本,命名為,內(nèi)容如下修改文件權(quán)限腳本啟動(dòng)配置完成,如果發(fā)布新版本之后記得執(zhí)行該腳本才能生效。 系統(tǒng)需求 centos7 minimal python2.7 部署前的準(zhǔn)備工作 centos7 minimal是精簡(jiǎn)版本,需要手動(dòng)去配置一些設(shè)置。 1. 配置網(wǎng)絡(luò),設(shè)置固定ip ip可以自動(dòng)獲取,我這...
閱讀 3493·2023-04-25 22:45
閱讀 1294·2021-11-11 16:54
閱讀 2803·2019-08-30 15:44
閱讀 3201·2019-08-30 15:44
閱讀 1656·2019-08-30 13:55
閱讀 950·2019-08-29 18:45
閱讀 1209·2019-08-29 17:25
閱讀 1017·2019-08-29 12:59