Django笔记四十四之Nginx+uWSGI部署Django以及Nginx负载均衡操作
本文首發(fā)于公眾號(hào):Hunter后端
原文鏈接:Django筆記四十四之Nginx+uWSGI部署Django以及Nginx負(fù)載均衡操作
這一篇筆記介紹如何使用 Nginx + uWSGI 來(lái)部署 Django。
上一篇筆記中有介紹直接使用 uWSGI 作為 web 服務(wù)器來(lái)部署 Django,這一篇筆記介紹如何使用 Nginx 來(lái)部署。
使用 Nginx 來(lái)部署相當(dāng)于在 uWSGI 外面又嵌套了一層,uWSGI 作為內(nèi)部服務(wù)被隱藏起來(lái),這時(shí)候 Nginx 起的作用是反向代理。
在這里,Nginx 的安裝操作就不贅述了,網(wǎng)上都可以找得到如何操作,這里只講相關(guān)的配置操作。
以下是本篇筆記目錄:
- uWSGI 配置
- Nginx 配置及其作用
- Nginx 實(shí)現(xiàn)負(fù)載均衡
1、uWSGi 配置
我們還是復(fù)用上一篇筆記中的 Django 系統(tǒng)代碼和 uWSGI 配置
# uwsgi.ini
[uwsgi]
socket = :9898
chdir = /path/to/hunter/
wsgi-file = hunter/wsgi.py
master=true
processes = 4
threads = 2
注意,這里配置項(xiàng)的第一行已經(jīng)從 http 改成了 socket
如果使用 http,表示我們將 uWSGI 直接作為一個(gè) web 服務(wù)器,比如可以在瀏覽器訪問(wèn)相關(guān)接口。
如果使用 socket,表示會(huì)有比如 Nginx 一樣的服務(wù)來(lái)作為 web 服務(wù)器,這個(gè)時(shí)候 uWSGI 起到類似中間件的作用,負(fù)責(zé)將來(lái)自 web 服務(wù)器的請(qǐng)求解析后轉(zhuǎn)發(fā)給 Django 來(lái)處理。
2、Nginx 配置及其作用
在我這里,Nginx 的相關(guān)配置在 /etc/nginx/nginx.conf
Nginx 的配置如下:
http {
server {
listen 8900;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:9898;
uwsgi_read_timeout 2;
}
}
}
這里,listen 表示 Nginx 對(duì)外開(kāi)放的是 8900 端口
location 表示的是定義的路由,這里是 /,表示 8900 端口后可以直接接上 Django 系統(tǒng)的 api 接口。我們也可以改成其他的,比如 /backend,那么訪問(wèn) Django 的每一個(gè)接口前綴都要加上 /backend
其下,uwsgi_pass 表示指向的是本機(jī)的 9898 端口服務(wù),這里和我們 uWSGI 里的配置是一致的
uwsgi_read_timeout 表示的是超時(shí)時(shí)間,這里定義的是兩秒。
接下來(lái)我們啟動(dòng) uWSGI 服務(wù)和 Nginx 服務(wù):
uwsgi uwsgi.ini
sudo /etc/init.d/nginx restart
這時(shí)候訪問(wèn) Nginx 所在的 地址的 8900 端口,http://192.168.1.33:8900/admin,就可以訪問(wèn)我們的 Django 系統(tǒng)了。
如果想要 admin 頁(yè)面有前端樣式展示,記得添加 uwsgi.ini 上篇筆記中的對(duì)應(yīng)的靜態(tài)文件配置。
3、Nginx 實(shí)現(xiàn)負(fù)載均衡
在上面的操作中,一個(gè)請(qǐng)求從客戶端到 Nginx,再到 uWSGI 和 Django,這個(gè)過(guò)程就是反向代理。
而如果請(qǐng)求量過(guò)大,一個(gè) uWSGI 和 Django 和對(duì)應(yīng)的數(shù)據(jù)庫(kù)可能扛不住訪問(wèn)壓力,所以需要增設(shè)多個(gè)后端來(lái)分擔(dān)請(qǐng)求,這個(gè)就是負(fù)載均衡。
首先介紹一下負(fù)載均衡的幾種策略:
- 輪詢
- 加權(quán)
- ip hash
這里假設(shè)我們起了三個(gè)后端實(shí)例,ip 和端口分別是 192.168.1.31:9898、192.168.1.33:9898、192.168.1.144:9898
1. 輪詢
所謂的輪詢,就是按照請(qǐng)求的時(shí)間順序逐個(gè)分配到指定的這三個(gè)后端服務(wù)上,這里 Nginx 的配置如下:
http {
upstream web {
server 192.168.1.31:9898;
server 192.168.1.33:9898;
server 192.168.1.144:9898;
}
server {
listen 8900;
location / {
proxy_pass http://web;
}
}
}
上面的這種方式配置之后,重啟 Nginx 和 uWSGI 之后,就會(huì)通過(guò)輪詢的方式來(lái)發(fā)送請(qǐng)求到三個(gè) Django 服務(wù)了。
注意:上面的配置方式,proxy_pass 表示是基于 http 協(xié)議進(jìn)行請(qǐng)求的,也就是說(shuō) Nginx 到 uWSGI 走的是 http 協(xié)議,我們需要將 uwsgi.ini 的配置改成 http=:9898。
如果要走之前的 uwsgi 協(xié)議請(qǐng)求方式,需要將 Nginx 的這里改成這樣:
server {
listen 8900;
location / {
include uwsgi_params;
uwsgi_pass web;
}
2. 加權(quán)
加權(quán)就是可以人為控制到幾個(gè)服務(wù)器請(qǐng)求的數(shù)量的占比,比如對(duì)于這三個(gè)后端,想要請(qǐng)求到它們的請(qǐng)求的數(shù)量比為 1:2:3,可以這樣設(shè)置:
upstream web {
server 192.168.1.31:9898 weight=1;
server 192.168.1.33:9898 weight=2;
server 192.168.1.144:9898 weight=3;
}
這樣,來(lái)六個(gè)請(qǐng)求的話,這三個(gè)后端分配到的請(qǐng)求數(shù)量分別是 1,2,3個(gè)。
3. ip hash
這是根據(jù)客戶端地址來(lái)進(jìn)行分配的一個(gè)操作,假設(shè)某個(gè)請(qǐng)求的 ip 是 192.168.1.59,這時(shí)候 Nginx 會(huì)根據(jù) ip 計(jì)算一個(gè)值之后映射到三個(gè)后端服務(wù)的某一個(gè),在之后的每次請(qǐng)求都會(huì)指向這個(gè)后端服務(wù)。
其配置如下:
upstream web {
ip_pash;
server 192.168.1.31:9898;
server 192.168.1.33:9898;
server 192.168.1.144:9898;
}
如果使用 ip hash 策略,來(lái)自某個(gè)客戶端的請(qǐng)求都會(huì)定向指向某個(gè)后端服務(wù),因此可以不用擔(dān)心解決后端服務(wù)共享 session 的問(wèn)題。
注意:因?yàn)樾枰幚?session 共享的問(wèn)題,所以在上面的測(cè)試中,我這邊都是直接訪問(wèn)的不用登錄,也就是不用擔(dān)心 session 問(wèn)題的接口。
在實(shí)際的負(fù)載均衡的后端服務(wù)中,session 的共享,使用戶保持登錄狀態(tài)而無(wú)感,是一個(gè)需要解決的問(wèn)題,這個(gè)在之后有機(jī)會(huì)的話再開(kāi)筆記詳細(xì)講述。
如果想獲取更多相關(guān)文章,可掃碼關(guān)注閱讀:
總結(jié)
以上是生活随笔為你收集整理的Django笔记四十四之Nginx+uWSGI部署Django以及Nginx负载均衡操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 尿酸高吃什么食物好 尿酸高推荐吃的食物简
- 下一篇: 禾字的意思 禾是什么意思