網關中間件-Nginx(二)

来源:https://www.cnblogs.com/yuxl01/archive/2022/03/23/16021653.html
-Advertisement-
Play Games

網關中間件-Nginx(一) 第一部分我們主要介紹如下幾點: 1.nginx的基本概念 2.nginx結合業務場景實現負載均衡 3.常見問題的舉例 這一部分主要介紹Nginx中限流,緩存,動靜分離,以及Nginx的集群搭建,如果涉及舉例的話,依然使用上一部分的業務 一、限流 1.為什麼要限流? 對於 ...


网关中间件-Nginx(一)

第一部分我们主要介绍如下几点:

1.nginx的基本概念

2.nginx结合业务场景实现负载均衡

3.常见问题的举例

这一部分主要介绍Nginx中限流,缓存,动静分离,以及Nginx的集群搭建,如果涉及举例的话,依然使用上一部分的业务

一、限流

1.为什么要限流?

对于服务器来说,当有大量的高并发查询时,假设当负载均衡的2个实例处理能力达到极限的时候,导致系统可能宕机的风险,那么查询就无法完成,所以在有限资源的情况下。我们应如何保证系统不宕机?这时候我们就应该使用限流的方式来控制请求涌入服务器,保证可用性。

2.限流的方式

1.服务端和客户端限流

主要配置是使用Nginx中的ngx_http_limit_conn_module模块来完成

服务端限流

  • 使用服务端限流来控制当前的虚拟主机的访问量.

客户端限流

  • 使用客户端端限流来控制当前ip请求的客户端只能访问一次.
# 服务端限流,限制总流量,获取服务器虚拟主机的名字
limit_conn_zone $server_name zone=perserver:10m;
# 客户端限流 获取客户端的ip地址
limit_conn_zone $binary_remote_addr zone=perserver:10m;
server {
        listen       80;
        server_name  localhost;
        location / {
        	# 只能限制2个请求进入服务器
            limit_conn perserver 2;
            proxy_pass  http://HealthCode;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
   }
}

2种方式的缺陷

  • 1.在使用服务端限流时,假设有10个客户端在访问,第一个客户端被人恶意访问,占用了全部的并发量,那其他正常的都无法访问,这肯定是不友好的。

  • 2.在使用客户端限流时,假设限制一个客户ip只能请求一次,但在某一时刻一共有百万个客户端请求并发,那服务同样也抵抗不住会宕机。

2.平滑限流

1.针对第一部分中服务端和客户端限流的策略产生的缺陷来说,我们可以选择平滑限流的策略,主要在配置文件中使用ngx_http_limit_req_module来完成,
他的实现原理基于令牌桶算法,也就是在处理请求时,会去查找是否存在对应的令牌,如果令牌没有了,那就会丢弃请求,例如设置速率是一秒钟1000个,那就是1毫秒生成 一个令牌,也就是说在1毫秒,只能拿到一个令牌,如果一毫秒内请求100个,但是只拿到一个令牌,那就会丢弃其他99个请求。

#zone=addr:10m 将请求数缓冲
limit_req_zone $binary_remote_addr zone=one:10m rate=1000r/s;
server {
        listen       80;
        server_name  localhost;
        location / {
            limit_req zone=one;
            proxy_pass  http://HealthCode;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
   }
}

2.如果设置速率为10毫秒一个,也就是10毫秒生成一个Token,按照这种情况服务器10毫秒只能处理一个有效请求,其他的会丢弃,但是服务器实例的性能能在10毫秒内处理3个,那此时我们应该既要保证突发又要保证平滑,这时就需要添加一个新的配置burst设置突发请求,意思就是再10毫秒只能处理一个请求的基础上,再额外新增处理3个请求一秒钟一个,设置nodelay将不会获取token令牌,直接处理。

#zone=addr:10m 将请求数缓冲
limit_req_zone $binary_remote_addr zone=one:10m rate=1000r/s;
server {
        listen       80;
        server_name  localhost;
        location / {
            #burst设置突发3 nodelay不延时
            limit_req zone=one burst=3 nodelay;
            proxy_pass  http://HealthCode;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
   }
}

3.由于nginx是全局限流,他会把所有的请求全部限流,有的时候我们只想针对某一个业务做到限流,例如我在查询健康码时需要限流,但是我在注册个人信息时,不需要限流我们就应该对location进行规则匹配了,例如我只想限制查询限流,就可以配置对应的接口限流

 #zone=addr:10m 将请求数缓冲
 limit_req_zone $binary_remote_addr zone=one:10m rate=1000r/s;
 server {
         listen       80;
         server_name  localhost;
         #所有
         location / {
             proxy_pass  http://HealthCode;
         }
         #设置api/HealthCode 路由进行限流
         location = /api/HealthCode {
             limit_req zone=one burst=3 nodelay;
             proxy_pass  http://HealthCode;
         }
         error_page   500 502 503 504  /50x.html;
         location = /50x.html {
             root   html;
    }
 }

二、动静分离

主要在web项目中将动态资源和静态资源分开,如果网站并发量太大,动态资源把cpu、内存资源耗尽,导致静态资源无法访问,所以需要使用动静分离以提高网站可用性。

  • 静态资源:CSS js 图片 视频 文档等数据。
  • 动态资源:和数据库有交互的一些资源
1.同一虚拟主机动静分离

1.创建web网站,将静态资源拷贝到单独的文件夹中。
2.在nginx配置文件中单独添加一个虚拟主机节点8089,加入一个静态资源处理的location,和一个动态资源处理的location
3.将静态资源和动态资源location节点,分别指向,静态资源对应目录,动态组员对应启动端口和站点。

 server {
        listen       8089;
        server_name  localhost;
        #动态资源
        location / {
            proxy_pass   http://localhost:5007;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        # ~代表优先匹配静态资源
        location ~ \.(ico|js|css|png|jpg|mp4)$ {
        root C:/wwwroot;
    }
}
2.不同虚拟主机动静分离

1.创建web网站,将静态资源拷贝到单独的文件夹中。
2.在nginx配置文件中单独添加一个虚拟主机8089节点,加入一个location,专门用于处理动态资源。

server {
        listen       8089;
        server_name  localhost;
         location / {
            proxy_pass   http://localhost:5007;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
}

3.在nginx配置文件中单独添加一个虚拟主机8090节点,加入一个location,专门用于处理静态资源。

server {
        listen       8090;
        server_name  localhost;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        location ~ \.(ico|js|css|png|jpg|mp4)$ {
        root C:/wwwroot;
    }
}

4.创建虚拟主机节点8091,用于合并动态资源和静态资源节点

server {
        listen       8091;
        server_name  localhost;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        
        #映射动态资源虚拟主机
        location / {
            proxy_pass   http://localhost:8089;
        }
        #映射静态资源虚拟主机
        location ~ \.(ico|js|css|png|jpg|mp4)$ {
            proxy_pass   http://localhost:8090;
        }
    }

上面方法虽然虽然能实现动静分离,有3个虚拟主机,但是在某种意义上只是对这个概念的实现,并没有真正解决高并发场景下的问题,因为所有的处理依然还是在一台主机,共享内存、cpu,所以实际情况的最佳实践应该是有3台服务器用于放置不同的服务。

3.拆分配置文件

有时候我们项目大了,nginx配置文件的配置项和虚拟主机也多了,维护也不太容易,所以我们应该使用配置文件拆分,然后使用Include命令读取

1.新建一个拆分的conf命名 cache.conf;

server {
        listen       8089;
        server_name  localhost;
}

2.在nginx主配置文件中使用Include命令合并配置

include cache.conf;

三、nginx 代理缓存

Nginx缓存主要是用于减轻后端服务器的负载,提高网站并发量,提升用户体验度。

Nginx对客户已经访问过的内容在Nginx服务器本地建立副本,这样在一段时间内再次访问该数据,就不需要通过Nginx服务器再次向后端服务器发出请求,所以能够减少Nginx服务器与后端服务器之间的网络流量,减轻网络阻塞,同时还能减小数据传输延迟,提高用户访问速度。

存储形式

Nginx缓存是键值存储,URL是键,文件路径是值。键值存储的速度就是加快在文件系统中查找的速度。所以,存储的key是哈希过的值。

使用代理缓存需要知道的几点:

  1. 缓存文件放哪儿 ?
  2. 如何指定哪些请求被缓存 ?
  3. 缓存的有效期是多久 ?
  4. 对于某些请求,是否可以不走缓存 ?
1.配置代理缓存

1.首先需要在nginx目录中创建一个存储缓存的目录/cache/nginx/,然后配置缓存存储路径和缓存占用空间大小

 proxy_cache_path ./cache/nginx/ levels=1:2 keys_zone=mycache:64m;

2.虚拟主机配置

location / {
       		proxy_cache mycache;
            proxy_pass   http://localhost:5007;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_cache_methods GET HEAD;
            proxy_cache_revalidate on;
            proxy_cache_valid 200 302 10m;
            proxy_cache_valid 404 1m;
            proxy_cache_valid any 1m;
            proxy_cache_min_uses 1;
            proxy_cache_use_stale error timeout invalid_header http_500 http_502 http_503 http_504;
           
}
  • proxy_cache mycache; #引用mycache缓存空间;
  • proxy_set_header Host $host;#用于后端的real server区分不同的虚拟主机;
  • proxy_set_header X-Real-IP $remote_addr; #记录客户端真实ip地址,而不是代理服务器地址,需要后端web服务器开启日志相应功能接收;
  • proxy_cache_methods GET HEAD;#表示对客户端请求的GET 和 HEAD方法进行缓存;
  • proxy_cache_revalidate on;#本地缓存过期会检查后端服务器该缓存是否存在,避免后端重传占据带宽;
  • proxy_cache_valid 200 302 10m;
    proxy_cache_valid 404 1m;
    proxy_cache_valid any 1m;
    #针对于不同的响应码进行缓存不同的时间设定;
  • proxy_cache_min_uses 30;#某一个请求被响应30次才会被缓存,默认是1,可以将该值设置为大一些;
  • proxy_cache_use_stale error timeout invalid_header http_500 http_502 http_503 http_504;
    #指明哪种场景可以使用过期缓存,提升用户体验;
  • proxy_hide_header;#隐藏由proxy响应客户端时指定的首部;
  • proxy_buffer 4|8k #为了响应客户端更快,服务器端响应客户端可能分成多个ip报文响应,也可以整合在一起再一次响应;

存在的缺陷

此类代理缓存,例如数据库更新可能会存在一段时间的数据不同步,所以最好的方法就是使用redis或者ssdb存储nginx的缓存,使用数据异构工具将数据同步,然后nginx读取数据库中的缓存


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

-Advertisement-
Play Games
更多相關文章
  • 每次情人節我都會問女朋友,你喜歡啥?你想要啥?但是每次女朋友每次都說:‘’你自己想,伸手要來的沒有驚喜”。這搞的我還沒到情人節就開始失眠了,總是擔心送的禮物她會不喜歡,相信有很多朋友跟我一樣苦惱吧。今天特意爬取了某東的數據,來分析下大家情人節都送什麼給女朋友。 主要使用Excel和Python的Pa ...
  • 一、安裝 pip install Selenium 二、初始化瀏覽器 Chrome 是初始化谷歌瀏覽器 Firefox 是初始化火狐瀏覽器 Edge 是初始化IE瀏覽器 PhantomJS 是一個無界面瀏覽器。 from selenium import webdriver driver = webd ...
  • 需求:通過鍵盤錄入的年份獲取該年的二月共有多少天? 分析: 1.使用Scanner類獲取輸入的年份 2.設置輸入的值的日曆的年月日 月份因為是從零開始的需要加一,月份設置為2,也就是三月 天數設置為1,那麼再往前推一天就是二月份的最後一天也就是我們要的天數 3.獲取這一天輸出 public clas ...
  • 1.前言 他總是微信撤回,是有什麼東西不能給我看嗎?我得想一個法子治治他,看看是不是在外面有人了,哈哈哈… 2 有微信聯想起的哲思 2.1 哲學思維開始冒頭 在這個信息量大增的信息時代,每天腦袋要處理很大的信息量,還是需要瞭解一點底層邏輯。 你看中國的名家,它甚至把的問題基本都提到了,也就是中國在前 ...
  • 很多小伙伴說自己的公司在監控自己有沒有摸魚、偷懶。有時候想偷偷懶都會被髮現,今天就帶大家來解開這神秘的面紗。搞懂了這個,估計你就知道怎麼去摸魚了。 監控鍵盤 如果公司偷偷在我們的電腦上運行了一個後臺進程,來監控我們的鍵盤事件,最簡單的 python 寫法大致是這樣的: from pynput imp ...
  • 方式一: 創建一個新的集合進行數據重覆元素的去除 //boolean contains(Object o):判斷集合中是否包含指定的元素 分析: * A:創建集合對象 * B:添加多個字元串元素(包含內容相同的) * C:創建新集合 * D:遍歷舊集合,獲取得到每一個元素 * E:拿這個元素到新集合 ...
  • 快下班了,今天給大家分享一下,平常我都是怎麼發送電子郵件,這個方法能夠幫助大家提高工作效率、,擺脫繁重的重覆性工作。一般我都會借用Python來實現自動化郵件發送,相信你用過這個方法之後就會愛上它。 Python有兩個內置庫:smtplib和email,能夠實現郵件功能,smtplib庫負責發送郵件 ...
  • 關係型的結構化存儲存在一定的弊端,因為它需要預先定義好所有的列以及列對應的類型。但是業務在發展過程中,或許需要擴展單個列的描述功能,這時,如果能用好 JSON 數據類型,那就能打通關係型和非關係型數據的存儲之間的界限,為業務提供更好的架構選擇。 當然,很多同學在用 JSON 數據類型時會遇到各種各樣 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...