Django筆記四十四之Nginx+uWSGI部署Django以及Nginx負載均衡操作

来源:https://www.cnblogs.com/hunterxiong/archive/2023/12/10/17893383.html
-Advertisement-
Play Games

本文首發於公眾號:Hunter後端 原文鏈接:Django筆記四十四之Nginx+uWSGI部署Django以及Nginx負載均衡操作 這一篇筆記介紹如何使用 Nginx + uWSGI 來部署 Django。 上一篇筆記中有介紹直接使用 uWSGI 作為 web 伺服器來部署 Django,這一篇 ...


本文首發於公眾號:Hunter後端

原文鏈接:Django筆記四十四之Nginx+uWSGI部署Django以及Nginx負載均衡操作

這一篇筆記介紹如何使用 Nginx + uWSGI 來部署 Django。

上一篇筆記中有介紹直接使用 uWSGI 作為 web 伺服器來部署 Django,這一篇筆記介紹如何使用 Nginx 來部署。

使用 Nginx 來部署相當於在 uWSGI 外面又嵌套了一層,uWSGI 作為內部服務被隱藏起來,這時候 Nginx 起的作用是反向代理。

在這裡,Nginx 的安裝操作就不贅述了,網上都可以找得到如何操作,這裡只講相關的配置操作。

以下是本篇筆記目錄:

  1. uWSGI 配置
  2. Nginx 配置及其作用
  3. Nginx 實現負載均衡

1、uWSGi 配置

我們還是復用上一篇筆記中的 Django 系統代碼和 uWSGI 配置

# uwsgi.ini

[uwsgi]
socket = :9898
chdir = /path/to/hunter/
wsgi-file = hunter/wsgi.py
master=true
processes = 4
threads = 2

註意,這裡配置項的第一行已經從 http 改成了 socket

如果使用 http,表示我們將 uWSGI 直接作為一個 web 伺服器,比如可以在瀏覽器訪問相關介面。

如果使用 socket,表示會有比如 Nginx 一樣的服務來作為 web 伺服器,這個時候 uWSGI 起到類似中間件的作用,負責將來自 web 伺服器的請求解析後轉發給 Django 來處理。

2、Nginx 配置及其作用

在我這裡,Nginx 的相關配置在 /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 對外開放的是 8900 埠

location 表示的是定義的路由,這裡是 /,表示 8900 埠後可以直接接上 Django 系統的 api 介面。我們也可以改成其他的,比如 /backend,那麼訪問 Django 的每一個介面首碼都要加上 /backend

其下,uwsgi_pass 表示指向的是本機的 9898 埠服務,這裡和我們 uWSGI 里的配置是一致的

uwsgi_read_timeout 表示的是超時時間,這裡定義的是兩秒。

接下來我們啟動 uWSGI 服務和 Nginx 服務:

uwsgi uwsgi.ini

sudo /etc/init.d/nginx restart

這時候訪問 Nginx 所在的 地址的 8900 埠,http://192.168.1.33:8900/admin,就可以訪問我們的 Django 系統了。

如果想要 admin 頁面有前端樣式展示,記得添加 uwsgi.ini 上篇筆記中的對應的靜態文件配置。

3、Nginx 實現負載均衡

在上面的操作中,一個請求從客戶端到 Nginx,再到 uWSGI 和 Django,這個過程就是反向代理。

而如果請求量過大,一個 uWSGI 和 Django 和對應的資料庫可能扛不住訪問壓力,所以需要增設多個後端來分擔請求,這個就是負載均衡。

首先介紹一下負載均衡的幾種策略:

  • 輪詢
  • 加權
  • ip hash

這裡假設我們起了三個後端實例,ip 和埠分別是 192.168.1.31:9898、192.168.1.33:9898、192.168.1.144:9898

1. 輪詢

所謂的輪詢,就是按照請求的時間順序逐個分配到指定的這三個後端服務上,這裡 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 之後,就會通過輪詢的方式來發送請求到三個 Django 服務了。

註意:上面的配置方式,proxy_pass 表示是基於 http 協議進行請求的,也就是說 Nginx 到 uWSGI 走的是 http 協議,我們需要將 uwsgi.ini 的配置改成 http=:9898

如果要走之前的 uwsgi 協議請求方式,需要將 Nginx 的這裡改成這樣:

    server {
        listen 8900;

        location / {
            include uwsgi_params;
            uwsgi_pass web;
        }

2. 加權

加權就是可以人為控制到幾個伺服器請求的數量的占比,比如對於這三個後端,想要請求到它們的請求的數量比為 1:2:3,可以這樣設置:

    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;
    }

這樣,來六個請求的話,這三個後端分配到的請求數量分別是 1,2,3個。

3. ip hash

這是根據客戶端地址來進行分配的一個操作,假設某個請求的 ip 是 192.168.1.59,這時候 Nginx 會根據 ip 計算一個值之後映射到三個後端服務的某一個,在之後的每次請求都會指向這個後端服務。

其配置如下:

    upstream web {
        ip_pash;
        server 192.168.1.31:9898;
        server 192.168.1.33:9898;
        server 192.168.1.144:9898;
    }

如果使用 ip hash 策略,來自某個客戶端的請求都會定向指向某個後端服務,因此可以不用擔心解決後端服務共用 session 的問題。

註意:因為需要處理 session 共用的問題,所以在上面的測試中,我這邊都是直接訪問的不用登錄,也就是不用擔心 session 問題的介面。

在實際的負載均衡的後端服務中,session 的共用,使用戶保持登錄狀態而無感,是一個需要解決的問題,這個在之後有機會的話再開筆記詳細講述。

如果想獲取更多相關文章,可掃碼關註閱讀:
image


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 判斷語句 if…then形式 類似於C/C++中的if-else語句。 單層if 命令格式: if condition then 語句1 語句2 ... fi 示例: a=3 b=4 if [ "$a" -lt "$b" ] && [ "$a" -gt 2 ] then echo ${a}在範圍內 ...
  • 表達式運算命令expr 概述 expr命令用於求表達式的值,格式為: expr 表達式 表達式說明: 用空格隔開每一項 用反斜杠放在sh特定的字元前面(發現表達式運行錯誤時,可以試試轉義) 對包含空格和其他特殊字元的字元串要用引號括起來 expr會在stdout中輸出結果。如果為邏輯關係表達式,則結 ...
  • 概論 shell是什麼 shell是我們通過命令行與操作系統溝通的語言。 shell腳本可以直接在命令行中執行,也可以將一套邏輯組織成一個文件,方便復用。 AC Terminal中的命令行可以看成是一個“shell腳本在逐行執行”。 Linux中常見的shell腳本有很多種,常見的有: Bourne ...
  • create database 學生 go use 學生 go CREATE TABLE Student ( Sno char (7) PRIMARY KEY , Sname char (10) NOT NULL , Ssex char (2) check(ssex in('男','女')) , S ...
  • 是什麼 吹哨人巡查監控後臺master主機是否故障,如果故障了根據投票數自動將某一個從庫轉為新主庫,繼續對外服務 能幹嘛 主從監控:監控主從Redis庫運行是否正常 消息通知:哨兵可以將故障轉移的結果發送給客戶端 故障轉移:如果Master異常,則會進行主從切換,將其中一個Slave作為新Maste ...
  • 項目描述 半年前本蒻蒟在逛開源硬體平臺的時候發現了一個好玩的電子神之眼,於是開始了長達半年的製作(鴿)過程..... 本項目復刻了薩納蘭的黃昏大佬改版的神之眼S3“Pro”版核心板V1 本項目基於Arduino IDE環境 本項目硬體和軟體部分基於GPL3.0開源許可開源(可修改,可分享,可商用,但 ...
  • spring Boot應用啟動器基本的一共有44種,具體如下 1)spring-boot-starter 這是Spring Boot的核心啟動器,包含了自動配置、日誌和YAML。 2)spring-boot-starter-actuator 幫助監控和管理應用。 3)spring-boot-star ...
  • python原生數據類型有int、float、str、tuple、list、set、dict七類,本次隨筆介紹了幾種類型的定義,同時用實驗驗證各數據類型之間的嵌套,以實驗結果證明各個數據類型的基本特征。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...