主頁 > 軟體設計 > Nginx實用插件

Nginx實用插件

2021-11-04 13:23:33 軟體設計

前言

本篇文章會從一些nginx上實用的插件進行介紹,以及應對后端服務出現故障處理、高并發限流、黑白名單插件、Nginx第三方插件的應用,這里包括爬蟲限流、以及惡意請求,這些常見的場景下的處理,

代理服務故障處理

當請求過來,有一臺服務器可能掛掉,然后nginx可能掛掉,以及 請求有一千五百萬,但是所有服務器處理性能不夠,以及出現故障時,主動健康檢查支持不夠,nginx;

被動健康檢查

ngx_http_upstream_module,可以做到基本的健康檢查,
upstream指令塊中的server子指令引數:max_fails、fail_timeout
upstream backend {
server 127.0.0.1:8080 weight=1 max_fails=2 fail_timeout=10s;
server 127.0.0.1:8081 weight=1 max_fails=2 fail_timeout=10s;
}
max_fails=2的意思是設定Nginx與服務器通信的嘗試失敗的次數,在fail_timeout引數定義的時間段內,如果失敗的次數達到此值,Nginx就認為服務器不可用,在下一個fail_timeout時間段,服務器不會再被嘗試,失敗的嘗試次數默認是1,
設為0就會停止統計嘗試次數,認為服務器是一直可用的,
fail_timeout=10s是設定服務器被認為不可用的時間段以及統計失敗嘗試次數的時間段,在這段時間中,服務器失敗次數達到指定的嘗試次數,服務器就被認為不可用,默認情況下,該超時時間是10秒,

主動健康檢查

服務主動健康檢查的Nginx插件,nginx_upstream_check_module
nginx 需要添加nginx_upstream_check_module 模塊,用于對后端服務器的健康情況檢測,如果后端服務器不可用,則把這臺服務器移除負載均衡輪循集群,所有的請求不往這臺服務器上轉發,待這臺服務器恢復正常后,再把這臺加入到負載均衡集群,
upstream cluster {
# simple round-robin
server 127.0.0.1:8080;
server 127.0.0.1:8081;
check interval=5000 rise=1 fall=3 timeout=4000;
#check_http_send "HEAD / HTTP/1.0\r\n\r\n";
#check_http_expect_alive http_2xx http_3xx;
}

Nginx實用插件 提取碼:ejs7

上面有安裝插件的方法,

故障轉移

dubbo中會調幾次,服務轉移 熔斷器等, 遇到故障定義下一個服務器上,

ngx_http_proxy_module模塊對故障轉移的支持

一旦有這個超時配置過后,就會移到下一個服務器上,

proxy_next_upstream
在尚未向客戶端發送任何內容的情況下才能將請求傳遞給下一個服務器,也就是說,如果在傳輸響
應的程序中發生錯誤或超時,則無法進行故障轉移,一個請求傳遞給下一個服務時,還可以通過限
制重試次數、等待時間,
proxy_next_upstream_timeout
限制請求可以傳遞到下一個服務器的時間,默認為0,表示關閉限制,
proxy_next_upstream_tries
限制將請求傳遞到下一個服務器的可能嘗試次數 ,默認為0,表示關閉限制,

應對服務雪崩

Nginx后面有2臺上游服務,每臺服務負載5000并發,假如第一臺掛掉,Nginx將第一臺的請求轉發給第二臺,將第二臺打掛,整
個服務都不可用了,如果是多臺服務,就這樣多米諾骨牌效應產生,將全部服務打掛?怎么處理?
proxy_read_timeout
定義從代理服務器讀取回應的超時,僅在兩個連續的讀操作之間設定超時,而不是為整個回應的傳輸,如果代理服務器在此時間內未傳輸任何內容,則關閉連接,默認60s,
max_conns引數
設定upstream中server指令的max_conns引數來進行控制每臺服務器能夠處理的最大的連接數
也就是失敗連接不要馬上去建立連接,導致服務雪崩

動態更新上游服務

后端服務發生變化,需要調整nginx的upstream串列,而且需要重啟nginx,有一種插件可以無需重動nginx,動態更新后端服務地址串列,這個插件就是,ngx_http_dyups_module模塊,
這個插件動態的更新后端串列
Nginx實用插件 提取碼:ejs7
這個插件有個問題比較明顯,因為資料存放在記憶體中,nginx 重啟之后,配置內容就會清空,
Nginx可以通過Consul+Consul-template來解決(需要Nginx reload)
OpenResty可以通過balancer_by_lua+Consul來解決(無需Nginx reload)

高并發限流

本來網路請求有很大的不確定因素,有可能突然請求達到了幾百萬的同時請求,

像這些,我們不能拿到應用程式中去限制,tomcat壓力就非常大了,

限制請求

模塊ngx_http_limit_req_module (nginx.org)

Nginx中可以通過請求限制模塊的指令來控制客戶端的請求速率,使用“漏桶”演算法,限制指定Key的請求處理速率,特別是從一個單一的IP地址的請求的處理速率,
http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
    limit_req_zone $server_name zone=preserver:10m rate=10r/s;
    server {
        location /search/ {
        limit_req zone=one burst=5;
        limit_req zone=perserver burst=10;
     } 
   } 

}
示例,通過定義記憶體空間塊:
限制單個IP平均每秒允許不超過1個請求,突發不超過5個請求
整個虛擬服務,平均每秒不允許超過10個,突發不超過10個請求
這個在反爬蟲時, 限流,也比較有用的, 一旦限流過后會到其他頁面上去,

burst 表示突發請求,

zone 每秒請求,

限制連接

Nginx中通過ngx_http_limit_conn_module模塊,來限制連接到nginx服務的數量,用于限制每個定義密鑰的連接數,特別是來自單個IP地址的連接數,并非所有連接都被計算在內 只有當服務器正在處理請求并且已經讀取了整個請求標頭時,才會計算連接,
Module ngx_http_limit_conn_module (nginx.org)
http {
        limit_conn_zone $binary_remote_addr zone=addr:10m;
        limit_conn_zone $server_name zone = perserver:10m;
        server {
            location /download/ {
            limit_conn addr 1;
            limit_conn perserver 100;
}
 }
 }
示例,通過定義記憶體空間塊: 限制單個IP建立不超過1個連接 整個虛擬服務,不允許超過10個連接

限制給客戶端的回應速率

http核心模塊中對回應速率限制提供了支持,視頻網站,不可能將所有帶寬都給一個請求,我們需要限制每個請求的速率

http {
    server {
        location /download/ {
        limit_rate_after 500k;
        limit_rate 50k; 
} } }
示例,限制回應初始速率50k,后續回應速率限制在500k

針對爬蟲限速

網路爬蟲對網站的作用
一方面可以給網站帶來一定的流量,便于搜索引擎收錄,利于用戶搜素,
另一方面會給服務器帶來一定的壓力,在網路爬蟲對網站內容進行收錄時,會引起服務器負載高漲,
有沒有什么方法既不阻止網路爬蟲對網站內容進行收錄,同時對其連接數和請求數進行一定的限制呢?
robots.txt 協議
robots.txt檔案內容稱為爬蟲協議,搜索引擎會根據這個檔案的內容,來確定它訪問權限的范圍,它不是命令要求,需要
搜索引擎自覺遵守,
robots.txt 必須放置在一個站點的根目錄下,而且檔案名必須全部小寫,一詞不差,
robots.txt 寫法:
User-agent: * 這里的*代表的所有的搜索引擎種類,*是一個通配符
Allow: /cgi-bin/ 這里定義是允許爬尋cgi-bin目錄下面的目錄
Disallow: /admin/ 這里定義是禁止爬尋 admin 目錄下面的內容
Disallow: /require/ 這里定義是禁止爬尋 require 目錄下面的內容

這些都是限制爬蟲,限制其訪問敏感資料,

Disallow: /data/www/images

針對爬蟲限速-Nginx配置

Map是nginx模塊中用來映射變數的 根據每次請求 $http_user_agent 的內容進行子指令進行匹配,如果匹配成功,則將子指令右側的 值賦值給$agent變數,匹配不到則給默認值,示例中表示,根據客戶端的作業系統瀏覽器工具等資訊,匹配是否為curl、apachebench、spider、bot、slurp也就是爬蟲程式相關的名稱,這里采 用了原有內容作為$agent的值,
Limit_conn_zone、limit_req_zone則采用$agent 做為key來存盤限制速率,

所以我們在爬蟲時,需要創建一個ip執行緒池,才能批量設定,并且對于單ip 一定要 對curl、apachebench、spider、bot、slurp 這些關鍵字做匹配

限制客戶端上傳速率

ngx_limit_upload_module是一個tengine模塊,可以限制客戶端發送請求主體時的上傳速率,與標準的nginx limit_rate功能用法相同
速率限制請求主體從客戶端的傳輸,速率以每秒位元組數指定,
值0禁用速率限制,根據請求設定限制,因此如果客戶端同時
打開兩個連接,則總速率將是指定限制的兩倍
Syntax: limit_upload_rate rate;
Default: limit_upload_rate 0;
Context: http, server, location, if in location
設定初始金額,在此之后,來自客戶端的請求正文的進一步
傳輸將受到速率限制,
Syntax: limit_upload_rate_after size;
Default: limit_upload_rate_after 0;
Context: http, server, location, if in location

Nginx實用插件 提取碼:ejs7

可以進行檢測

黑白名單插件

用來限制訪問模塊請求的,

Nginx的訪問模塊

ngx_http_access_module模塊,提供允許、拒絕指令來控制客戶端能否訪問服務,
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
}
allow,允許某個ip或者一個 ip 段訪問
deny,禁止某個ip或者一個 ip 段訪問
針對ipi地址進行限制

黑白名單插件

? Nginx實用插件 提取碼:ejs7 ?

該插件很久沒有維護了,而且不能正常使用,可以忽略該插件,

ngx_white_black_list 通過組態檔來指定黑白名單內容,

功能描述: 處在黑名單中的 ip 與網路,將無法訪問 web 服務, 處在白名單中的 ip,訪問 web 服務時,將不受 nginx 所有安全模塊的限制, 支持動態黑名單(需要與 ngx_http_limit_req 配合),需要修改nginx代碼這里就不提及了,如有需要,參考給到的ngx_white_black_list鏈接

nginx組態檔內容

# 簡單指令以;結尾
worker_processes  4;
worker_rlimit_nofile 65535;
# 大括號屬于塊指令
events {
    worker_connections  1024;
}

http {
	# 定義 黑名單或白名單檔案 空間key
	# 只能在http指令塊中
	# white_black_list_conf可以配置多個 只需 zone=value 其中的value不同就可
	white_black_list_conf conf/white.list zone=white:2m;
	white_black_list_conf conf/black.list zone=black:4m;

	# 啟用黑白名單,on/off,啟用/關閉,
	# 在http、server、location下使用, 功能默認是關閉
	# 配置在對應的指令塊中,對應的指令塊背景關系生效
	white_list white on; #白名單  white 在整個http{}中都開啟
	black_list black on; #黑名單  black 在整個http{}中都開啟

	server {
		listen 80;
		root /data/www/;

		# 黑白名單配置調整介面,通過它可以調整配置內容
		location /sec_config {
			sec_config on;
		}
	}
}

主要還是根據官方檔案,進行查找插件,

第三方插件

這在官方網站上有大量的操作插件,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/347286.html

標籤:其他

上一篇:設計模式 ——狀態模式

下一篇:基于LVS高可用架構實作Nginx集群分流

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more