亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.430618.com 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

一. 負載均衡1. 用法

通過proxy_pass 可以把請求代理至后端服務,但是為了實現更高的負載及性能, 我們的后端服務通常是多個, 這個是時候可以通過upstream 模塊實現負載均衡。

使用的模塊為:【ngx_http_upstream_module】,具體配置可以根據模塊名去查找文檔。

負載均衡的算法有:

 

  • ll:輪詢
  • ll+weight:輪詢加權重
  • ip_Hash :基于Hash 計算,用于保持session 一至性該算法下權重失效
  • url_hash:靜態資源緩存,節約存儲,加快速度(第三方)該算法下權重配置失效
  • least_conn:最小鏈接數
  • least_time:最小的響應時間,計算節點平均響應時間,然后取響應最快的那個,分配更高權重

 


 

2. 參數

upstream 相關參數如下:

 

  • server反向服務地址加端口
  • weight權重,默認是1,越大權重就越大
  • max_fAIls失敗多少次認為主機已掛掉則,踢出(默認配置10s,即服務器宕掉,會自動剔除)
  • fail_timeout踢出后重新探測時間
  • backup備用服務,當其他非backup的機器全部宕機或者繁忙的時候,才會啟動這臺機器。
  • down表示當前Server不參與負載
  • max_conns允許最大連接數
  • slow_start當節點恢復,不立即加入,而是等待 slow_start 后加入服務對列。
upstream myApiTest {server localhost:9001 weight=10;server localhost:9002 weight=5;server localhost:9003 max_fails=3 fail_timeout=30s;server localhost:9004 backup;server localhost:9005 down;3. 案例

 

事先準備:

有三個同樣的api服務,分別部署在9001、9002、9003端口下,比如:訪問 http://localhost:9001/Home/GetMsg,會返回 【 獲取成功,當前端口為:9001】,其它端口類似。

要求:

Nginx監聽8080端口,接收到8080端口的請求,按照響應的算法進行轉發到9001-9003端口。

(1). 輪詢

訪問地址:http://localhost:8080/Home/GetMsg ,會依次轉發到9001、9002、9003端口上。【最新版本測試,輪詢的時候一個服務器連續淪陷兩次,才到下一個服務器,繼續連續兩次】??

配置如下:

worker_processes 1;events {worker_connections 1024;http {include mime.types;default_type Application/octet-stream;sendfile on;keepalive_timeout 65;upstream myApiTest {server localhost:9001;server localhost:9002;server localhost:9003;server {listen 8080;server_name xxx; #隨意配置一個即可,優先走代理地址location / {proxy_pass http://myApiTest;error_page 500 502 503 504 /50x.html;location = /50x.html {root html;

補充其他參數說明:

下面配置,當請求 http://localhost:8080/Home/GetMsg 時候,只會被轉發到9003端口上,此時把9003端口的服務關掉,再次請求,則會被轉發到9001端口上,其中9002端口,全程不參與負載。

upstream myApiTest {server localhost:9001 backup;server localhost:9002 down;server localhost:9003;

(2).輪詢+權重

下面配置,被轉發到9001 9002端口的概率要大于9003端口。

配置如下:

worker_processes 1;events {worker_connections 1024;http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;upstream myApiTest {server localhost:9001 weight=10;server localhost:9002 weight=5;server localhost:9003;server {listen 8080;server_name xxx; #隨意配置一個即可,優先走代理地址location / {proxy_pass http://myApiTest;error_page 500 502 503 504 /50x.html;location = /50x.html {root html;

(3). ip_hash

同一個ip永遠會被分配到同一個Server上,主要用來解決Session不一致的問題,但該策略也有弊端,weight權重無效,所以該方案會導致某個Server壓力可能過大,請求分配不均勻問題。

配置如下:

worker_processes 1;events {worker_connections 1024;http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;upstream myApiTest {ip_hash; #開啟ip_hash策略server localhost:9001;server localhost:9002;server localhost:9003;server {listen 8080;server_name xxx; #隨意配置一個即可,優先走代理地址location / {proxy_pass http://myApiTest;error_page 500 502 503 504 /50x.html;location = /50x.html {root html;

(4). url_hash

主要用于節省空間,比如我有9G的圖片資源,服務器集群有三臺,因為不確定請求會被轉發到哪一臺上,所以每臺服務器都存放9G,顯然這樣是不合理的。

我們可以在存儲的時候,將圖片進行urlhash算法,分別存放到三臺服務器上,這樣請求的時候也是用urlhash,去指定服務器請求即可,節省了服務器空間,也就是3臺服務器總共用了9G。

PS:上面只是舉例方便理解,生產中,大量圖片資源存放cdn第三方,然后在自己的服務器上做一層臨時緩存,為了提高緩存的命中率,通常用urlhash算法。

更多C++后臺開發技術點知識內容包括C/C++,linux,Nginx,ZeroMQ,MySQL,redis,MongoDB,ZK,流媒體,音視頻開發,Linux內核,TCP/IP,協程,DPDK多個高級知識點。

C/C++后臺開發架構師免費學習地址:C/C++Linux鏈嶅姟鍣ㄥ紑鍙?/鍚庡彴鏋舵瀯甯堛€愰浂澹版暀鑲層€?-瀛︿範瑙嗛鏁欑▼-鑵捐璇懼爞

【文章福利】另外還整理一些C++后臺開發架構師 相關學習資料,面試題,教學視頻,以及學習路線圖,免費分享有需要的可以點擊 Linux C++鍚庡彴寮€鍙戠浉鍏寵棰戯紝鏂囨。浠g爜璧勬枡鍖咃紝瀛︿範璺嚎鎬濈淮瀵煎浘鍏嶈垂棰嗗彇 免費領取


 

二. 限流配置1. 說明

(1). 限流的作用

限流主要用作安全目的,比如可以減慢暴力密碼破解的速率。

通過將傳入請求的速率限制為真實用戶的典型值,并標識目標URL地址(通過日志),

還可以用來抵御DDoS攻擊。更常見的情況,該功能被用來保護上游應用服務器不被同時太多用戶請求所壓垮。

(2). 原理

令牌桶算法

漏桶算法

(3). 涉及到的模塊

A. 用來限制同一時間連接數,即并發限制 【不常用】

【ngx_http_limit_conn_module】 對應文檔:http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html

B. 用來限制單位時間內的請求數,即速率限制,采用的漏桶算法 【推薦使用】

【ngx_http_limit_req_module】 對應文檔:http://nginx.org/en/docs/http/ngx_http_limit_req_module.html

2. 環境準備

(1). Api接口

啟動指令如下:

【do.NET NginxTest.dll --urls="http://*:7061" --ip="127.0.0.1" --port=7061】

【dotnet NginxTest.dll --urls="http://*:7062" --ip="127.0.0.1" --port=7062】

接口地址為: http://localhost:7061/api/Home/GetNowTime 【Post請求】

接口代碼如下:

[Route("api/[controller]/[action]")][ApiController]public class HomeController : ControllerBase[HttpPost]public string GetNowTime()string nowTime = DateTime.Now.ToString();Console.WriteLine($"當前時間為:{nowTime}");return $"當前時間為:{nowTime}";

(2). nginx服務

使用到的指令

啟動服務:【start nginx】

強制關閉服務:【nginx -s stop】

重載服務:【nginx -s reload】

nginx監聽7000端口,然后進行代理配置,這里重點測試的是限流,只用7061一個api端口即可。

worker_processes 1;events {worker_connections 1024;http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;server {listen 7000; #監聽端口server_name xxx; #隨意配置一個地址即可,優先走代理location / {proxy_pass http://localhost:7061; #代理地址error_page 500 502 503 504 /50x.html;location = /50x.html {root html;

通過post請求訪問:http://localhost:7000/api/Home/GetNowTime ,返回當前時間,表示配置成功。


 

(3). jmeter測試工具

添加線程組,然后在線程組的基礎上添加:http請求、察看結果樹、聚合報告、用表格查結果。

配置請求的并發數、請求地址。


 


 

測試結果:10個請求全部成功。


 

3. 限流-限制并發連接數【不常用】

聲明格式:

limit_conn_zone $server_name zone=myLimit0:10m;limit_conn_zone $binary_remote_addr zone=myLimit1:10m;

(1). $server_name:表示虛擬主機(server) 同時能處理并發連接的總數。 (數量在啟用時配置)

(2). $binary_remote_addr:表示限制每個客戶端IP(單個ip)連接到服務器的鏈接數量。 (數量在啟用時配置)

(3). zone=myLimit1:10m :表示內存區域名稱 和 空間大小。

調用格式:

limit_conn myLimit1 2; #啟用限流

(1). myLimit1 :表示用上述聲明的哪個配置進行限制,myLimit1與上述聲明的名稱相對應。

(2). 2: 表示配置的數量限制。

(1). 限制-虛擬主機同時能處理的并發鏈接總數

分析:

虛擬主機(server) 同時能處理并發連接的總數為5.

測試條件:

worker_processes 1;events {worker_connections 1024;http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;# 限流配置聲明limit_conn_zone $server_name zone=myLimit0:10m;server {listen 7000; #監聽端口server_name xxx; #隨意配置一個地址即可,優先走代理location / {limit_conn myLimit0 5; #啟用限流proxy_pass http://localhost:7061; #代理地址error_page 500 502 503 504 /50x.html;location = /50x.html {root html;

測試結果:

忽略

(2). 限制-單個ip鏈接到服務器的數量

剖析:

單個IP同時最多能持有8個連接

測試條件:

worker_processes 1;events {worker_connections 1024;http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;# 限流配置聲明limit_conn_zone $binary_remote_addr zone=myLimit1:10m;server {listen 7000; #監聽端口server_name xxx; #隨意配置一個地址即可,優先走代理location / {limit_conn myLimit1 8; #啟用限流proxy_pass http://localhost:7061; #代理地址error_page 500 502 503 504 /50x.html;location = /50x.html {root html;

測試結果:忽略

4. 限流-限制速率【推薦使用】

聲明格式:

limit_req_zone $binary_remote_addr zone=myLimit2:10m rate=5r/s;

(1). $binary_remote_addr : 表示限制同一客戶端ip地址,即限制速率是以ip為分類的,限制每個ip的速度。

(2). zone=myLimit2:10m: myLimit2表示內存區域的名稱,10m表示內存空間的大小。

(3). rate=5r/s : 表示1s允許5個請求,注意這里需要拆分理解,即200ms允許1個請求,當第一個請求處理完成,如果200ms內又進來一個請求,該請求將被拒絕處理,只有過了200ms后,才會處理第2個請求,一次類推。

調用格式 :


 

limit_req zone=myLimit2 burst=5 nodelay;

(1). zone=myLimit2:表示用上述聲明的哪個配置進行限制,myLimit2與上述聲明的名稱相對應。

(2). burst=5 :設置一個大小為5的緩沖區,當有大量請求(瞬間爆發)過來時,超過了上述配置的訪問頻次限制的請求,可以先放到這個緩沖區內。

注:burst的作用是讓多余的請求可以先放到隊列里,慢慢處理。如果不加nodelay參數,隊列里的請求不會立即處理,而是按照rate設置的速度,以毫秒級精確的速度慢慢處理。

(3). nodelay : 設置后,burst緩沖區中排隊的請求立即被處理,超過頻次限制 并且 緩沖區滿了的情況下,直接返回503狀態碼;如不設置,那么額外的請求將進入等待排隊的狀態

注:通過設置burst參數,我們可以允許Nginx緩存處理一定程度的突發,多余的請求可以先放到隊列里,慢慢處理,不報錯,這起到了平滑流量的作用。

但是如果隊列設置的比較大,請求排隊的時間就會比較長,從用戶角度看來就是響應變長了,這對用戶很不友好,所以引入nodelay參數。

nodelay參數允許請求在排隊的時候就立即被處理,也就是說只要請求能夠進入burst隊列,就會立即被后臺處理,請注意,這意味著burst設置了nodelay時,系統瞬間的QPS可能會超過rate設置的閾值。

所以:nodelay參數要跟burst一起使用才有作用。

(1). 實操1-限制速率

分析:

使用jmeter發送10個請求進行測試,nginx的限制速率設置為 2r/s,意味著第1個請求處理完后,500ms內接收的請求都將拒絕,過了500ms后,才能處理下一個請求。 詳見下面的測試結果。

測試條件:

worker_processes 1;events {worker_connections 1024;http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;# 限流配置聲明limit_req_zone $binary_remote_addr zone=myLimit2:10m rate=2r/s;server {listen 7000; #監聽端口server_name xxx; #隨意配置一個地址即可,優先走代理location / {limit_req zone=myLimit2; #啟用限流proxy_pass http://localhost:7061; #代理地址error_page 500 502 503 504 /50x.html;location = /50x.html {root html;

測試結果:

第1個成功的請求的是008ms,接下來第 2-6個請求,由于是在500ms內,所有都請求失?。?第2個成功的請求為608ms,正好過了500ms了,所以成功了。


 

(2). 限制速率+設置緩沖區

分析:

使用jmeter發送10個請求進行測試,nginx的限制速率設置為 2r/s,burst=5,意味著第1個請求處理完后,接下來的5個請求都是存放到緩存中,第7個請求如果在第1個的500ms后,則請求成功,反之失敗。

測試條件:

worker_processes 1;events {worker_connections 1024;http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;# 限流配置聲明limit_req_zone $binary_remote_addr zone=myLimit2:10m rate=2r/s;server {listen 7000; #監聽端口server_name xxx; #隨意配置一個地址即可,優先走代理location / {limit_req zone=myLimit2 burst=5; #啟用限流proxy_pass http://localhost:7061; #代理地址error_page 500 502 503 504 /50x.html;location = /50x.html {root html;

測試結果:

第1個成功的請求為343ms,接下來第2-6個加入到緩存區,依次執行成功; 第7個請求為944,與第一個成功的請求相比,已經超過了500ms,所以執行成功,接下來的8-10個請求,均在第7個成功后的500ms內,所以均失敗。


 

(3). 限制速率+設置緩沖區+立即處理

分析:

使用jmeter發送10個請求進行測試,nginx的限制速率設置為 2r/s,burst=5 nodelay,意味著第1個請求處理完后,接下來的5個請求立即執行,第7個請求如果在第1個的500ms后,則請求成功,反之失敗。

測試條件:

worker_processes 1;events {worker_connections 1024;http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;# 限流配置聲明limit_req_zone $binary_remote_addr zone=myLimit2:10m rate=1r/s;server {listen 7000; #監聽端口server_name xxx; #隨意配置一個地址即可,優先走代理location / {limit_req zone=myLimit2 burst=5 nodelay; #啟用限流proxy_pass http://localhost:7061; #代理地址error_page 500 502 503 504 /50x.html;location = /50x.html {root html;

測試結果:

第1個成功的請求為278ms,接下來2-6個立即執行,第7個請求為879,距離第一個成功的已經超過500ms,所以執行成功,接下來的8-10個請求,均在500ms內,所以執行失敗。


 

三. Https配置1. 準備

(1). 生成證書

OpenSSL工具下載地址:http://slproweb.com/products/Win32OpenSSL.html 【這里以3.0.5為例】


 

OpenSSL生成證書步驟:https://jingyan.baidu.com/article/6c67b1d6be538c2787bb1e06.html

(2). 相關模塊

【ngx_http_rewrite_module】 參考文檔:http://nginx.org/en/docs/http/ngx_http_rewrite_module.html

2. 實操

(1). 配置https的Server

開啟一個新的虛擬主機,用來配置https監聽8000端口,配置證書的物理地址即可,就可以通過https://localhost:8000/api/Home/GetNowTime ,訪問代理地址下7061的api了。

(PS:下面配置同時開啟了 http的主機,所以通過http://localhost:7000/api/Home/GetNowTime,也可以訪問)

worker_processes 1;events {worker_connections 1024;http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;#http主機server {listen 7000; #監聽端口server_name test1; #隨意配置一個地址即可,優先走代理location / {proxy_pass http://localhost:7061; #代理地址error_page 500 502 503 504 /50x.html;location = /50x.html {root html;#https主機server {listen 8000 ssl;server_name test2;#證書目錄ssl_certificate D:/cert/server-cert.pem;ssl_certificate_key D:/cert/server-key.pem;ssl_session_cache shared:SSL:1m;ssl_session_timeout 5m;location / {proxy_pass http://localhost:7061;

(2). 將http跳轉到https

上述http監聽的7000端口,https監聽的8000端口,如何讓http請求自動跳轉到https請求上呢?

加個return 301 xxxxx跳轉即可。

worker_processes 1;events {worker_connections 1024;http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;#http主機server {listen 7000; #監聽端口server_name test1; #隨意配置一個地址即可,優先走代理location / {proxy_pass http://localhost:7061; #代理地址#跳轉到https (test2是https主機的server_name)return 301 https://test2$request_uri;#或者#return 301 https://$host:8000$request_uri;error_page 500 502 503 504 /50x.html;location = /50x.html {root html;#https主機server {listen 8000 ssl;server_name test2;#證書目錄ssl_certificate D:/cert/server-cert.pem;ssl_certificate_key D:/cert/server-key.pem;ssl_session_cache shared:SSL:1m;ssl_session_timeout 5m;location / {proxy_pass http://localhost:7061;

原文鏈接:第二節:Nginx負載均衡配置、限流配置、Https配置詳解 - Yaopengfei - 博客園

分享到:
標簽:Nginx
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定