Nginx常見的面試題—限流祷嘶、正向屎媳、反向、負載均衡策略

1论巍、什么是Nginx烛谊,談?wù)剛€人都理解,項目中是否用到嘉汰,為什么要用丹禀,有什么優(yōu)點?

Nginx 鞋怀,是一個 Web 服務(wù)器和反向代理服務(wù)器用于 HTTP双泪、HTTPS、SMTP密似、POP3 和 IMAP 協(xié)議焙矛。

主要功能如下:

1、正向残腌、反向代理
2村斟、負載均衡、分流
3抛猫、虛擬主機(綁定host)

優(yōu)點:

跨平臺蟆盹、配置簡單,非阻塞闺金、高并發(fā)連接逾滥、內(nèi)存消耗小、成本低廉败匹。

2匣距、正向代理和反向代理的區(qū)別是什么?

正向代理是一個位于客戶端和原始服務(wù)器之間的服務(wù)器哎壳,為了從原始服務(wù)器取得內(nèi)容毅待,客戶端向代理發(fā)送一個請求并指定原始服務(wù)器,然后代理向原始服務(wù)器轉(zhuǎn)交請求并將獲得的內(nèi)容返回給客戶端归榕。代理服務(wù)器和客戶端處于同一個局域網(wǎng)內(nèi)尸红。

比如說fanqiang。我知道我要訪問谷歌,于是我就告訴代理服務(wù)器讓它幫我轉(zhuǎn)發(fā)外里。

反向代理實際運行方式是代理服務(wù)器接受網(wǎng)絡(luò)上的連接請求怎爵。它將請求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器,并將從服務(wù)器上得到的結(jié)果返回給網(wǎng)絡(luò)上請求連接的客戶端 盅蝗。代理服務(wù)器和原始服務(wù)器處于同一個局域網(wǎng)內(nèi)鳖链。

比如說我要訪問taobao,對我來說不知道圖片墩莫、json芙委、css 是不是同一個服務(wù)器返回回來的,但是我不關(guān)心狂秦,是反向代理 處理的灌侣,我不知道原始服務(wù)器。

3裂问、Nginx如何處理HTTP請求的侧啼?

它結(jié)合多進程機制(單線程)和異步非阻塞方式。

1堪簿、多進程機制(單線程)

服務(wù)器每當(dāng)收到一個客戶端時痊乾,就有 服務(wù)器主進程 ( master process )生成一個 子進程( worker process )出來和客戶端建立連接進行交互,直到連接斷開椭更,該子進程就結(jié)束了哪审。

2、異步非阻塞機制

每個工作進程 使用 異步非阻塞方式 甜孤,可以處理 多個客戶端請求 。 運用了epoll模型畏腕,提供了一個隊列缴川,排隊解決。

當(dāng)某個 工作進程 接收到客戶端的請求以后描馅,調(diào)用 IO 進行處理把夸,如果不能立即得到結(jié)果,就去 處理其他請求 (即為 非阻塞 )铭污;而 客戶端 在此期間也 無需等待響應(yīng) 恋日,可以去處理其他事情(即為 異步 )。

當(dāng) IO 返回時嘹狞,就會通知此 工作進程 岂膳;該進程得到通知,暫時 掛起 當(dāng)前處理的事務(wù)去 響應(yīng)客戶端請求 磅网。

為什么這么快谈截?可以參考一下Nginx官方介紹:http://www.aosabook.org/en/nginx.html

4、Nginx的master和worker是如何工作的?

這跟Nginx的多進程簸喂、單線程有關(guān)毙死。(一個進程只有一個主線程)。

為什么要用單線程喻鳄?

采用單線程來異步非阻塞處理請求(管理員可以配置Nginx主進程的工作進程的數(shù)量)扼倘,不會為每個請求分配cpu和內(nèi)存資源,節(jié)省了大量資源除呵,同時也減少了大量的CPU的上下文切換再菊,所以才使得Nginx支持更高的并發(fā)。

簡單過程:

主程序 Master process 啟動后竿奏,通過一個 for 循環(huán)來 接收 和 處理外部信號 袄简;

主進程通過 fork() 函數(shù)產(chǎn)生 worker 子進程 ,每個子進程執(zhí)行一個 for循環(huán)來實現(xiàn)Nginx服務(wù)器對事件的接收和處理 泛啸。

詳細過程:

1绿语、Nginx 在啟動后,會有一個 master 進程和多個相互獨立的 worker 進程候址。
2吕粹、master 接收來自外界的信號,先建立好需要 listen 的 socket(listenfd) 之后岗仑,然后再 fork 出多個 worker 進程匹耕,然后向各worker進程發(fā)送信號,每個進程都有可能來處理這個連接荠雕。
3稳其、所有 worker 進程的 listenfd 會在新連接到來時變得可讀 ,為保證只有一個進程處理該連接炸卑,所有 worker 進程在注冊 listenfd 讀事件前搶占 accept_mutex 既鞠,搶到互斥鎖的那個進程注冊 listenfd 讀事件 ,在讀事件里調(diào)用 accept 接受該連接盖文。
4嘱蛋、當(dāng)一個 worker 進程在 accept 這個連接之后,就開始讀取請求五续、解析請求洒敏、處理請求,產(chǎn)生數(shù)據(jù)后疙驾,再返回給客戶端 凶伙,最后才斷開連接。

5它碎、Nginx 常用命令有哪些镊靴?

  • 啟動 nginx 铣卡。
  • 停止 nginx -s stopnginx -s quit
  • 重啟 nginx -s reloadservice nginx reload 偏竟。
  • 重載指定配置文件 .nginx -c /usr/local/nginx/conf/nginx.conf 煮落。
  • 查看 nginx 版本 nginx -v

6踊谋、nginx中500蝉仇、502、503殖蚕、504 有什么區(qū)別轿衔?

500

Internal Server Error 內(nèi)部服務(wù)錯誤,比如腳本錯誤睦疫,編程語言語法錯誤害驹。

502

Bad Gateway錯誤,網(wǎng)關(guān)錯誤蛤育。比如服務(wù)器當(dāng)前連接太多宛官,響應(yīng)太慢,頁面素材太多瓦糕、帶寬慢底洗。

503

Service Temporarily Unavailable,服務(wù)不可用咕娄,web服務(wù)器不能處理HTTP請求亥揖,可能是臨時超載或者是服務(wù)器進行停機維護。

504

Gateway timeout 網(wǎng)關(guān)超時圣勒,程序執(zhí)行時間過長導(dǎo)致響應(yīng)超時费变,例如程序需要執(zhí)行20秒,而nginx最大響應(yīng)等待時間為10秒圣贸,這樣就會出現(xiàn)超時挚歧。

7、Nginx 壓縮了解嗎旁趟,如何開啟壓縮昼激?

開啟nginx gzip壓縮后庇绽,圖片锡搜、css、js等靜態(tài)資源的大小會減小瞧掺,可節(jié)省帶寬耕餐,提高傳輸效率,但是會消耗CPU資源辟狈。

開啟:

    # 開啟gzip
    gzip off;

    # 啟用gzip壓縮的最小文件肠缔,小于設(shè)置值的文件將不會壓縮
    gzip_min_length 1k;

    # gzip 壓縮級別夏跷,1-9,數(shù)字越大壓縮的越好明未,也越占用CPU時間槽华,后面會有詳細說明
    gzip_comp_level 1;

    # 進行壓縮的文件類型。javascript有多種形式趟妥。其中的值可以在 mime.types 文件中找到。
    gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png application/vnd.ms-fontobject font/ttf font/opentype font/x-woff image/svg+xml;

8、Nginx 和 Apache拉馋、Tomcat 之間的不同點

1跑揉、Nginx/Apache 是Web Server,而Apache Tomact是一個servlet container
2、tomcat可以對jsp進行解析疚膊,nginx和apache只是web服務(wù)器义辕,可以簡單理解為只能提供html靜態(tài)文件服務(wù)。

Nginx和Apache區(qū)別:

1)Nginx輕量級寓盗,同樣起web 服務(wù)灌砖,比apache占用更少的內(nèi)存及資源 。

2)Nginx 抗并發(fā)贞让,nginx 處理請求是異步非阻塞的周崭,而apache 則是阻塞型的,在高并發(fā)下nginx 能保持低資源低消耗高性能 喳张。

3)Nginx提供負載均衡续镇,可以做做反向代理,前端服務(wù)器

4)Nginx多進程單線程销部,異步非阻塞摸航;Apache多進程同步,阻塞舅桩。

9酱虎、Nginx 有哪些負載均衡策略

Nginx 默認提供的負載均衡策略:

  • 1、輪詢(默認)round_robin

    每個請求按時間順序逐一分配到不同的后端服務(wù)器擂涛,如果后端服務(wù)器 down 掉读串,能自動剔除。

  • 2撒妈、IP 哈希 ip_hash

    每個請求按訪問 ip 的 hash 結(jié)果分配恢暖,這樣每個訪客固定訪問一個后端服務(wù)器,可以解決 session 共享的問題狰右。

    當(dāng)然杰捂,實際場景下,一般不考慮使用 ip_hash 解決 session 共享棋蚌。

  • 3嫁佳、最少連接 least_conn

    下一個請求將被分派到活動連接數(shù)量最少的服務(wù)器

  • 4挨队、權(quán)重 weight

    weight的值越大分配到的訪問概率越高,主要用于后端每臺服務(wù)器性能不均衡的情況下蒿往,達到合理的資源利用率盛垦。

還可以通過插件支持其他策略。

10瓤漏、Nginx動靜態(tài)資源分離做過嗎情臭,為什么要這樣做?

動態(tài)資源赌蔑、靜態(tài)資源分離俯在,是讓動態(tài)網(wǎng)站里的動態(tài)網(wǎng)頁根據(jù)一定規(guī)則把不變的資源和經(jīng)常變的資源區(qū)分開來 路。

比如說 js娃惯、css跷乐、hrml從A服務(wù)器返回。圖片 從B服務(wù)器返回趾浅,其他請求從Tomcat服務(wù)器C返回愕提。

后臺應(yīng)用分開部署,提高用戶訪問靜態(tài)代碼的速度皿哨。而且現(xiàn)在還有CDN服務(wù)浅侨,不需要限制于服務(wù)器的帶寬。

11证膨、ngx_http_upstream_module模塊了解嗎如输?

ngx_http_upstream_module模塊用于將多個服務(wù)器定義成服務(wù)器組,可通過fastcgi傳遞央勒、proxy傳遞不见、uwsgi傳遞、memcached傳遞和scgi傳遞指令來引用的服務(wù)器組崔步。

比如訪問www.a.com 緩存+調(diào)度:

http{
    proxy_cache_path /var/cache/nginx/proxy_cache levels=1:2:2 keys_zone=proxycache:20m inactive=120s max_si #緩存
ze=1g;
    upstream mysqlsrvs{
        ip_hash; #源地址hash調(diào)度方法 寫了backup就不可用
        server 172.18.99.1:80 weight=2; #weight權(quán)重
        server 172.18.99.2:80;          #標記down稳吮,配合ip_hash使用,實現(xiàn)灰度發(fā)布
        server 172.18.99.3:80 backup;   #backup將服務(wù)器標記為“備用”井濒,即所有服務(wù)器均不可用時才啟用 
    }
}
server{
    server_name www.a.com;
    proxy_cache proxycache;
    proxy_cache_key $request_uri;
    proxy_cache_valid 200 302 301 1h;
    proxy_cache_valid any 1m;
    location / {
        proxy_pass http://mysqlsrvs;
    }
}

12灶似、限流了解嗎,怎么限流的瑞你?

Nginx 提供兩種限流方式酪惭,一是控制速率,二是控制并發(fā)連接數(shù)捏悬。

1撞蚕、控制速率

ngx_http_limit_req_module 模塊提供了漏桶算法(leaky bucket)润梯,可以限制單個IP的請求處理頻率过牙。

如:

1.1 正常限流:

http {
limit_req_zone 192.168.1.1 zone=myLimit:10m rate=5r/s;
}

server {
location / {
limit_req zone=myLimit;
rewrite / http://www.hac.cn permanent;
}
}

參數(shù)解釋:

key: 定義需要限流的對象甥厦。
zone: 定義共享內(nèi)存區(qū)來存儲訪問信息。
rate: 用于設(shè)置最大訪問速率寇钉。

表示基于客戶端192.168.1.1進行限流刀疙,定義了一個大小為10M,名稱為myLimit的內(nèi)存區(qū)扫倡,用于存儲IP地址訪問信息谦秧。rate設(shè)置IP訪問頻率,rate=5r/s表示每秒只能處理每個IP地址的5個請求撵溃。Nginx限流是按照毫秒級為單位的疚鲤,也就是說1秒處理5個請求會變成每200ms只處理一個請求。如果200ms內(nèi)已經(jīng)處理完1個請求缘挑,但是還是有有新的請求到達集歇,這時候Nginx就會拒絕處理該請求。

1.2 突發(fā)流量限制訪問頻率

上面rate設(shè)置了 5r/s语淘,如果有時候流量突然變大诲宇,超出的請求就被拒絕返回503了,突發(fā)的流量影響業(yè)務(wù)就不好了惶翻。

這時候可以加上burst 參數(shù)姑蓝,一般再結(jié)合 nodelay 一起使用。

server {
location / {
limit_req zone=myLimit burst=20 nodelay;
rewrite / http://www.hac.cn permanent;
}
}

burst=20 nodelay 表示這20個請求立馬處理吕粗,不能延遲,相當(dāng)于特事特辦颅筋。不過虐秋,即使這20個突發(fā)請求立馬處理結(jié)束,后續(xù)來了請求也不會立馬處理垃沦。burst=20 相當(dāng)于緩存隊列中占了20個坑客给,即使請求被處理了,這20個位置這只能按 100ms一個來釋放肢簿。

2靶剑、控制并發(fā)連接數(shù)

ngx_http_limit_conn_module 提供了限制連接數(shù)功能。

limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;

server {
    ...
    limit_conn perip 10;
    limit_conn perserver 100;
}

limit_conn perip 10 作用的key 是 $binary_remote_addr池充,表示限制單個IP同時最多能持有10個連接桩引。

limit_conn perserver 100 作用的key是 $server_name,表示虛擬主機(server) 同時能處理并發(fā)連接的總數(shù)收夸。

注:limit_conn perserver 100 作用的key是 $server_name坑匠,表示虛擬主機(server) 同時能處理并發(fā)連接的總數(shù)。

拓展:

如果不想做限流卧惜,還可以設(shè)置白名單:

利用 Nginx ngx_http_geo_modulengx_http_map_module 兩個工具模塊提供的功能厘灼。

##定義白名單ip列表變量
geo $limit {
    default 1;
    10.0.0.0/8 0;
    192.168.0.0/10 0;
    81.56.0.35 0;
}

map $limit $limit_key {
    0 "";
    1 $binary_remote_addr;
}
# 正常限流設(shè)置
limit_req_zone $limit_key zone=myRateLimit:10m rate=10r/s;

geo 對于白名單 將返回0夹纫,不限流;其他IP將返回1设凹,進行限流舰讹。

具體參考:http://nginx.org/en/docs/http/ngx_http_geo_module.html

除此之外:

ngx_http_core_module 還提供了限制數(shù)據(jù)傳輸速度的能力(即常說的下載速度)

location /flv/ {
    flv;
    limit_rate_after 500m;
    limit_rate       50k;
}

針對每個請求,表示客戶端下載前500m的大小時不限速闪朱,下載超過了500m后就限速50k/s月匣。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市奋姿,隨后出現(xiàn)的幾起案子锄开,更是在濱河造成了極大的恐慌,老刑警劉巖称诗,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件院刁,死亡現(xiàn)場離奇詭異,居然都是意外死亡粪狼,警方通過查閱死者的電腦和手機退腥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來再榄,“玉大人狡刘,你說我怎么就攤上這事±福” “怎么了嗅蔬?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長疾就。 經(jīng)常有香客問我澜术,道長,這世上最難降的妖魔是什么猬腰? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任鸟废,我火速辦了婚禮,結(jié)果婚禮上姑荷,老公的妹妹穿的比我還像新娘盒延。我一直安慰自己,他們只是感情好鼠冕,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布添寺。 她就那樣靜靜地躺著,像睡著了一般懈费。 火紅的嫁衣襯著肌膚如雪计露。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機與錄音票罐,去河邊找鬼叉趣。 笑死,一個胖子當(dāng)著我的面吹牛胶坠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播繁堡,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼沈善,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了椭蹄?” 一聲冷哼從身側(cè)響起闻牡,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绳矩,沒想到半個月后罩润,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡翼馆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年割以,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片应媚。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡严沥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出中姜,到底是詐尸還是另有隱情消玄,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布丢胚,位于F島的核電站翩瓜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏携龟。R本人自食惡果不足惜兔跌,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望峡蟋。 院中可真熱鬧浮定,春花似錦、人聲如沸层亿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匿又。三九已至方灾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背裕偿。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工洞慎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嘿棘。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓劲腿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鸟妙。 傳聞我的和親對象是個殘疾皇子焦人,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容