如何為 Django 服務(wù)配置負(fù)載均衡
現(xiàn)在的 Web 服務(wù)有一個很重要的性能指標(biāo)叫 QPS,QPS 的全稱是 Queries Per Second 意思是“每秒查詢率”,是一臺服務(wù)器每秒能夠相應(yīng)的查詢次數(shù),是對一個特定的查詢服務(wù)器在規(guī)定時間內(nèi)所處理流量多少的衡量標(biāo)準(zhǔn)。QPS 越高,說明并發(fā)度高,服務(wù)器每秒可以服務(wù)更多的用戶。
Python 愛好者多數(shù)會選擇 Django 來開發(fā) Web 應(yīng)用。但是 Python 多線程的性能并不是很高,如何提升 Django 服務(wù)的并發(fā)性和可用性呢?一個很簡單的辦法就是負(fù)載均衡,本文分享如何為 Django 服務(wù)配置負(fù)載均衡。
所謂負(fù)載均衡不難理解,就是我們會有多個后端服務(wù),一般分配在多個服務(wù)器上,前端的請求會被均衡的分配到后端的服務(wù)上,示意圖如下所示:

負(fù)載均衡器接收來自客戶端的請求,然后將請求轉(zhuǎn)發(fā)到其中一臺服務(wù)器。服務(wù)器然后將所需的 HTML 內(nèi)容或資源返回給負(fù)載均衡器,然后負(fù)載均衡器將其轉(zhuǎn)發(fā)回客戶端。
有多種負(fù)載均衡器可供選擇,例如 Nginx、Apache、Tomcat 和 HAProxy,你可以選擇其中任何一個,但現(xiàn)在我將只展示如何在 Windows 上使用 Nginx。
下載 nginx
首先,到 nginx 的下載地址https://nginx.org/en/download.html,它會顯示如下頁面:

然后點擊任一版本的 Nginx,我推薦使用穩(wěn)定版,但其實無所謂。下載后,將其解壓縮到任何位置(在您的桌面或文檔上即可)。解壓后,進入剛才安裝的 nginx 目錄,在目錄地址輸入“cmd”,如下圖。并且會出現(xiàn)命令提示符。

在命令提示符下,輸入“start nginx”。完成后,您可以通過打開瀏覽器并在 url 欄中輸入“l(fā)ocalhost”來檢查 nginx 是否正常工作。如果在輸入“l(fā)ocalhost”后出現(xiàn)下面的屏幕,Nginx 可以正常工作。

一旦 Nginx 完美運行,我們就可以配置 Nginx 以將負(fù)載分配到我們的服務(wù)器,我這里用 Django 的 runserver 作為服務(wù)進行演示。
配置 nginx
進入nginx目錄,打開“conf”文件夾,然后你應(yīng)該看到“nginx.conf”文件。在您熟悉的任何文本編輯器上打開它,我現(xiàn)在將使用 Visual Studio Code,默認(rèn)情況下 nginx.conf 的內(nèi)容如下所示:

只需要注釋掉 http 部分或者直接刪除它,添加以下內(nèi)容:
http {
upstream myproject {
server localhost:8000;
server localhost:8001;
server localhost:8002;
server localhost:8003;
}
server {
listen 8080;
server_name localhost;
location / {
proxy_pass http://myproject;
}
}
}
這段配置的意思為 nginx 會監(jiān)聽本機的 8080 端口,一旦有訪問,就會隨機分配到以下四個服務(wù)進行請求:
????server?localhost:8000;
????server?localhost:8001;
????server?localhost:8002;
????server?localhost:8003;
請確保開啟 4 個終端來模擬 4 個服務(wù),每個終端都執(zhí)行這個命令,后面跟上自己的端口號:
python?manage.py?runserver?{port}
配置 Django
不過你可能很想知道我這個請求到底分配給了誰,那就在 views.py 中加入這個方法:
from?django.http?import?HttpResponse
def?nginx_view(request):
????html?=?"Using?port?"
?+?request.META["SERVER_PORT"]?+?""
????return?HttpResponse(html)
然后在對應(yīng)的 urls.py 上配置好路徑 / ,來映射到上面的視圖函數(shù):
from?django.contrib?import?admin
from?django.urls?import?path
from?.views?import?nginx_view
urlpatterns?=?[
????path('test_load_banlance/',?nginx_view),
]
驗證
打開瀏覽器,地址欄輸入 localhost/test_load_banlance/ 回車,會發(fā)現(xiàn)如下頁面:

然后關(guān)閉 8000 服務(wù),再次刷新瀏覽器,會發(fā)現(xiàn)負(fù)載均衡器已經(jīng)轉(zhuǎn)發(fā)至 8001:

是不是很酷呢?
如果你持續(xù)刷新,它會在剩余的服務(wù)中進行隨機循環(huán)請求,也就是說每當(dāng)刷新一次,就會隨機換一個服務(wù)器進行請求。當(dāng)然了,你可以參考 nginx 文檔對這種選擇后端服務(wù)的方式進行修改。

最后的話
本文分享了 nginx 作為負(fù)載均衡器的最簡單配置,以及如何在 Django 中檢測訪問的是哪一個服務(wù),都比較簡單,如果有收獲還請點贊、在看、關(guān)注支持。
