Nginx常見配置:負載均衡、限流、緩存、黑名單和灰度發布

一、Nginx安裝(基于CentOS 6.5)

1.yum命令安裝

yum install nginx –y
(若不能安裝,執行命令yum install epel-release)

2. 啟動、停止和重啟

service nginx start
service nginx stop
service nginx restart
瀏覽器中 輸入服務器的 ip 地址,即可看到相應信息

3. 其他信息

rpm -ql nginx?來查看安裝路徑
yum remove nginx?來卸載?
nginx -s reload 配置熱更新?

二、Nginx負載均衡配置(/etc/nginx/nginx.conf)

  1. 負載均衡配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
http {
???????……
????upstream real_server {
???????server 192.168.103.100:2001 weight=1;??#輪詢服務器和訪問權重
???????server 192.168.103.100:2002 weight=2;
????}
????server {
????????listen? 80;
????????location / {
????????????proxy_pass http://real_server;
????????}
????}
}
    2.失敗重試配置
1
2
3
4
upstream real_server {
???server 192.168.103.100:2001 weight=1 max_fails=2 fail_timeout=60s;
???server 192.168.103.100:2002 weight=2 max_fails=2 fail_timeout=60s;
}

意思是在fail_timeout時間內失敗了max_fails次請求后,則認為該上游服務器不可用,然后將該服務地址踢除掉。fail_timeout時間后會再次將該服務器加入存活列表,進行重試。

三、Nginx限流配置

  1. 配置參數

limit_req_zone指令設置參數?

1
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;

1)limit_req_zone定義在http塊中,$binary_remote_addr表示保存客戶端IP地址的二進制形式。
2)Zone定義IP狀態及URL訪問頻率的共享內存區域。zone=keyword標識區域的名字,以及冒號后面跟區域大小。16000個IP地址的狀態信息約1MB,所以示例中區域可以存儲160000個IP地址。
3)Rate定義最大請求速率。示例中速率不能超過每秒10個請求。

2.設置限流

1
2
3
4
location / {
????????limit_req zone=mylimit burst=20 nodelay;
????????proxy_pass http://real_server;
}

burst排隊大小,nodelay不限制單個請求間的時間

3.不限流白名單

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
geo $limit {
default????????????? 1;
192.168.2.0/24??0;
}
map $limit $limit_key {
1 $binary_remote_addr;
0?"";
}
limit_req_zone $limit_key zone=mylimit:10m rate=1r/s;
location / {
????????limit_req zone=mylimit burst=1 nodelay;
????????proxy_pass http://real_server;
}

上述配置中,192.168.2.0/24網段的IP訪問是不限流的,其他限流。

IP后面的數字含義:

24表示子網掩碼:255.255.255.0

16表示子網掩碼:255.255.0.0

8表示子網掩碼:255.0.0.0

四、Nginx緩存配置

  1. 瀏覽器緩存

靜態資源緩存用expire

1
2
3
location ~*? .(jpg|jpeg|png|gif|ico|css|js)$ {
???expires 2d;
}

Response Header中添加了Expires和Cache-Control


靜態資源包括(一般緩存)

1)普通不變的圖像,如logo,圖標等
2)js、css靜態文件
3)可下載的內容,媒體文件

協商緩存(add_header ETag/Last-Modified value)

1)HTML文件
2)經常替換的圖片
3)經常修改的js、css文件
4)基本不變的API接口

不需要緩存

1)用戶隱私等敏感數據

2)經常改變的api數據接口

2.代理層緩存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//緩存路徑,inactive表示緩存的時間,到期之后將會把緩存清理
proxy_cache_path?/data/cache/nginx/?levels=1:2 keys_zone=cache:512m inactive = 1d max_size=8g;
location / {
????location ~ \.(htm|html)?$ {
????????proxy_cache cache;
????????proxy_cache_key??? $uri$is_args$args;?????//以此變量值做HASH,作為KEY
????????//HTTP響應首部可以看到X-Cache字段,內容可以有HIT,MISS,EXPIRES等等
????????add_header X-Cache $upstream_cache_status;
????????proxy_cache_valid 200 10m;
????????proxy_cache_valid any 1m;
????????proxy_pass? http://real_server;
????????proxy_redirect???? off;
????}
????location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {
????????root?/data/webapps/edc;
????????expires????? 3d;
????????add_header Static Nginx-Proxy;
????}
}

? ? ? ? 在本地磁盤創建一個文件目錄,根據設置,將請求的資源以K-V形式緩存在此目錄當中,KEY需要自己定義(這里用的是url的hash值),同時可以根據需要指定某內容的緩存時長,比如狀態碼為200緩存10分鐘,狀態碼為301,302的緩存5分鐘,其他所有內容緩存1分鐘等等。
? ? ? ? 可以通過purger的功能清理緩存。
? ? ? ? AB測試/個性化需求時應禁用掉瀏覽器緩存。

五、Nginx黑名單

1.一般配置

1
2
3
4
5
6
7
location / {
????deny? 192.168.1.1;
????deny 192.168.1.0/24;
????allow 10.1.1.0/16;
????allow 2001:0db8::/32;
????deny? all;
}

2. Lua+Redis動態黑名單(OpenResty)

1)安裝運行

1
2
3
4
5
6
7
8
yum?install?yum-utils
yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
yum?install?openresty
yum?install?openresty-resty
查看
yum --disablerepo="*"?--enablerepo="openresty"?list available
運行
service openresty start

2) 配置(/usr/local/openresty/nginx/conf/nginx.conf)

1
2
3
4
5
6
7
8
9
10
lua_shared_dict ip_blacklist 1m;
server {
????listen? 80;
????location / {
????????access_by_lua_file lua/ip_blacklist.lua;
????????proxy_pass http://real_server;
????}
}

lua腳本(ip_blacklist.lua)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
local redis_host??? =?"192.168.1.132"
local redis_port??? =?6379
local redis_pwd???? =?123456
local redis_db =?2
-- connection timeout?for?redis?in?ms.
local redis_connection_timeout =?100
-- a?set?key?for?blacklist entries
local redis_key???? =?"ip_blacklist"
-- cache lookups?for?this?many seconds
local cache_ttl???? =?60
-- end configuration
local ip??????????????? = ngx.var.remote_addr
local ip_blacklist????? = ngx.shared.ip_blacklist
local last_update_time? = ip_blacklist:get("last_update_time");
-- update ip_blacklist from Redis every cache_ttl seconds:
if?last_update_time == nil or last_update_time < ( ngx.now() - cache_ttl ) then
??local redis = require?"resty.redis";
??local red = redis:new();
??red:set_timeout(redis_connect_timeout);
??local ok, err = red:connect(redis_host, redis_port);
??if?not ok then
????ngx.log(ngx.ERR,?"Redis connection error while connect: "?.. err);
??else
????local ok, err = red:auth(redis_pwd)
????if?not ok then
??????ngx.log(ngx.ERR,?"Redis password error while auth: "?.. err);
????else
????????local new_ip_blacklist, err = red:smembers(redis_key);
????????if?err then
????????????ngx.log(ngx.ERR,?"Redis read error while retrieving ip_blacklist: "?.. err);
????????else
????????ngx.log(ngx.ERR,?"Get data success:"?.. new_ip_blacklist)
??????????-- replace the locally stored ip_blacklist?with?the updated values:
????????????ip_blacklist:flush_all();
??????????for?index, banned_ip?in?ipairs(new_ip_blacklist)?do
????????????ip_blacklist:set(banned_ip,?true);
??????????end
??????????-- update time
??????????ip_blacklist:set("last_update_time", ngx.now());
??????end
????end
??end
end
if?ip_blacklist:get(ip) then
??ngx.log(ngx.ERR,?"Banned IP detected and refused access: "?.. ip);
??return?ngx.exit(ngx.HTTP_FORBIDDEN);
end

六、Nginx灰度發布

  1. 根據Cookie實現灰度發布

根據Cookie查詢version值,如果該version值為v1轉發到host1,為v2轉發到host2,都不匹配的情況下轉發默認。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
upstream host1 {
???server 192.168.2.46:2001 weight=1;??#輪詢服務器和訪問權重
???server 192.168.2.46:2002 weight=2;
}
upstream host2 {
???server 192.168.1.155:1111? max_fails=1 fail_timeout=60;
}
upstream default {
???server 192.168.1.153:1111? max_fails=1 fail_timeout=60;
}
map $COOKIE_version $group {
???~*v1$ host1;
???~*v2$ host2;
???default default;
}
lua_shared_dict ip_blacklist 1m;
server {
????listen? 80;
????#set $group "default";
????#if ($http_cookie ~* "version=v1"){
????#??? set $group host1;
????#}
????#if ($http_cookie ~* "version=v2"){
????#??? set $group host2;
????#}
????location / {
????????access_by_lua_file lua/ip_blacklist.lua;
????????proxy_pass http://$group;
????}
}

2. 根據來路IP實現灰度發布

1
2
3
4
5
6
7
8
9
server {
??……………
??set?$group default;
??if?($remote_addr ~?"192.168.119.1") {
??????set?$group host1;
??}
??if?($remote_addr ~?"192.168.119.2") {
??????set?$group host2;
??}

3. 更細粒度灰度發布

可用lua腳本實現,參考開源項目:https://github.com/dayulxl/ABTestingGateway

轉載于:https://www.cnblogs.com/ZenoLiang/p/10946126.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/277616.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277616.shtml
英文地址,請注明出處:http://en.pswp.cn/news/277616.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

國服服務器_《Minecraft我的世界》第三方服務器的基本儲備

今天我想單獨來聊一聊Minecraft我的世界第三方服務器的發展。世外荒原玩家作品我來到頭條的第一篇文章就發表了一篇我對Minecraft現狀的看法&#xff0c;現在國服的狀態對老玩家不是很友好。(這不說明國服的運營戰略路線是有問題的)因此誕生了一大堆第三方服務器。世外荒原玩家…

Unity中Time.deltaTime的含義及其應用

相信Unity的開發者或者初學者都對Time.deltaTime并不陌生&#xff0c;我們經常會在代碼中用到或者看到它&#xff0c;今天去官方的API文檔查了一下&#xff0c;感覺它非常有用&#xff0c;所以翻譯一下以引導初學者。 原文網址&#xff1a; file:///Applications/Unity/Unity…

unity3d曲線text文本

測試.pngusing System; using System.Collections.Generic;namespace UnityEngine.UI.Extensions {/// <summary>/// Curved text.讓文本按照曲線進行顯示 【注意對Image的變形 也是可以的】/// 說明&#xff1a; 對Text的操作就和 shadow 和 outline 組件類似。/// <…

HTML 和CSS

1 HTML 介紹1.1 web 服務本質import socket sk socket.socket() sk.bind(("127.0.0.1", 8080))sk.listen(5) while True: conn, addr sk.accept() data conn.recv(8096) conn.send(b"HTTP/1.1 200 OK\r\n\r\n") conn.send(b"<h1>Hello world…

Unity中Quaternion的含義及其使用

官網API文檔&#xff1a; file:///Applications/Unity/Unity.app/Contents/Documentation/html/en/ScriptReference/Quaternion.html Quaternion的意思是四元數&#xff0c;用于代表旋轉。 它們是緊致的&#xff0c;不會產生萬向節死鎖并且能夠很容易被插值。Unity內使用Quat…

Python PIPEs

2019獨角獸企業重金招聘Python工程師標準>>> https://www.python-course.eu/pipes.php https://www.tutorialspoint.com/python/os_pipe.htm 轉載于:https://my.oschina.net/zungyiu/blog/1860857

延時消息_Handler的消息延時是怎么實現的

消息延時做了什么特殊處理&#xff1f;是發送延時&#xff0c;還是消息處理延時&#xff1f;延時的精度如何&#xff1f;通常我們使用Handler的消息延時都是調用sendMessageDelayed函數實現的&#xff0c;其中delayMillis是需要延時的毫秒。通過跟蹤sendMessageDelayed函數可以…

5月JC學習總結

斷劍重鑄之日&#xff0c;王者歸來之時。為了更美好的明天而戰。 五月 悄悄地過了 人兒 不覺中散了 攜著一腔熱血&#xff1b;來到蛟川 來到機房 微涼的輕風&#xff0c;無聲地去了 熾熱的驕陽&#xff0c;即將要落了 站在4樓&#xff0c;向窗外眺望&#xff0c;映出的不是夕陽…

4 關卡流 進階_全息武器全解析,記住4個點全區第一就是你!

實不相瞞&#xff0c;每次看著全息武器糖糖都感覺自己像鋼鐵俠高端大氣上檔次&#xff0c;低調奢華有內涵那么問題來了&#xff01;這個全息武器究竟該怎么玩才能成為真正的鋼鐵俠&#xff1f;我的使命之全息武器【作者&#xff1a;D38激戰阿曼——潛龍小生】全息武器在屬性增加…

terminate called after throwing an instance of 'std::out_of_range' what(): basic_string::substr

運行時報錯&#xff1a; terminate called after throwing an instance of std::out_of_rangewhat(): basic_string::substr&#xff1a;__pos Aborted (core dumped) 內存讀取越界。 解釋1&#xff1a;for example:const std::string sTest( "test" );sTest.substr…

記一次理想浪漫的畢旅

因為臨近畢業離別的氛圍和閑散的生活&#xff0c;雖然手頭積攢了不少可寫的素材和教程&#xff0c;但還是兩個月沒有在CSDN更新博客。論文答辯之后&#xff0c;我只是每天在宿舍玩玩電腦、打打撲克&#xff0c;唯一讓我難受的是&#xff0c;隔幾天便送走一位同窗好友。有時甚至…

【滲透過程】嘉緣網站 --測試

聲明&#xff1a;本片文章測試網站為測試靶場 信息收集階段&#xff1a; 首先使用了一些常見的掃描工具&#xff1a;nmap 御劍 使用nmap掃描端口 發現網站開放了 135 139 445 3306 等端口 這里可以看到網站開放了一些危害較高端口&#xff1a;135 225等 使用御劍掃描到一些敏感…

C編程經驗總結

Turbo c Return (z);return z; 圖形界面的有scanf(“%d ~%d\n”,&~,&~);注意&#xff1a;中間不能有亂的東西 Printf(“~~~ %d~~%d\n”,~,~);這兒可以有亂的東西&#xff0c;一切的提示圖形界面多是由它完成 函數&#xff0c;變量一定是有類型 除了函數&#xff08;&am…

文檔過期打不開怎么辦_標準的產品需求文檔在這里!(詳細說明版)(2)

接著上篇繼續寫&#xff0c;上篇請點擊標準的產品需求文檔在這里&#xff01;(詳細說明版)(1)入口已經寫完&#xff0c;讀此文檔的無論是研發人員還是測試都已經知曉此需求需要做的從哪里進入&#xff0c;接下來就是主菜了&#xff0c;進入以后該干嘛。進入以后當然就是新的頁面…

day32

udp(用戶數據包協議) 高并發(同時有大量客戶端訪問服務器,服務器處理不過來)?OSI模型中,屬于傳輸層得協議,僅用于不要求可靠性,以及不要求分組順序且數據量較小的簡單傳輸,力求快?通訊流程類似對講機 只管發送不管對方是否接收到,甚至不關心對方存在?UDP可以處理多個客戶端,…

Macbook全系列詳細分析及購機指南

時至今日&#xff0c;極佳的用戶體驗、強大的功能、獨特的設計感、廣闊的市場和無可比擬的品牌魅力已經讓蘋果公司各種電子產品的迅速普及&#xff0c;其中Macbook逐漸被越來越多的人所青睞&#xff0c;尤其是從事一些特定行業的工作者&#xff08;比如IT、電信、互聯網以及藝術…

惠普m1005連接電腦步驟_電腦連接電視機詳細步驟方法圖文

電腦連接電視機有什么好處呢&#xff1f;小編想到了幾點&#xff0c;那就是屏幕大&#xff0c;而且可以在電視機上使用網絡看到自己想看的劇。還有就是可以更多的人一起做著來看。所以總的來說電腦連接電視機還是好處比較多的。下面我就來告訴你們電腦怎么連接電視機。有的時候…

對程序實施精準手術!阿里安全獵戶座實驗室首創“自動逆向機器人”

近日舉辦的看雪安全開發者峰會上&#xff0c;阿里安全獵戶座實驗室首度向外界展示了最新的研究成果——“自動逆向機器人”。該機器人可以像醫生一樣“望聞問切”&#xff0c;對程序進行顯微鏡級別的勘察&#xff0c;并完整“回放”其運作過程&#xff0c;因此&#xff0c;可以…

(24) 不可能的出棧順序

一、問題描述 給定兩個數組&#xff0c;一個進棧順序&#xff0c;一個出棧順序。判定出棧數組的出棧順序是不是有可能的。 二、Code 1 package algorithm;2 3 import java.util.ArrayDeque;4 import java.util.Deque;5 6 /**7 * Created by adrian.wu on 2019/5/30.8 */9 pub…

《魔獸世界》的魅力究竟在哪兒?

寫在前面&#xff1a;《魔獸世界》&#xff08;World of Warcraft&#xff0c;后面簡稱WOW&#xff09;&#xff0c;是由暴雪開發的一款大型角色扮演網絡游戲&#xff0c;曾經付費的正式用戶一度超過1150萬人&#xff0c;覆蓋244個國家和地區&#xff0c;是曾經的“世界第一網游…