1. 程式人生 > 實用技巧 >Nginx常見的面試題—限流、正向、反向代理、負載均衡策略

Nginx常見的面試題—限流、正向、反向代理、負載均衡策略

1、什麼是Nginx,談談個人都理解,專案中是否用到,為什麼要用,有什麼優點?

Nginx ,是一個 Web 伺服器和反向代理伺服器用於 HTTP、HTTPS、SMTP、POP3 和 IMAP 協議。

主要功能如下:

1、正向、反向代理
2、負載均衡、分流
3、虛擬主機(繫結host)

優點:

跨平臺、配置簡單,非阻塞、高併發連線、記憶體消耗小、成本低廉。

2、正向代理和反向代理的區別是什麼?

正向代理是一個位於客戶端和原始伺服器之間的伺服器,為了從原始伺服器取得內容,客戶端向代理髮送一個請求並指定原始伺服器,然後代理向原始伺服器轉交請求並將獲得的內容返回給客戶端。代理伺服器和客戶端處於同一個區域網內。

比如說fanqiang。我知道我要訪問谷歌,於是我就告訴代理伺服器讓它幫我轉發。

反向代理實際執行方式是代理伺服器接受網路上的連線請求。它將請求轉發給內部網路上的伺服器,並將從伺服器上得到的結果返回給網路上請求連線的客戶端 。代理伺服器和原始伺服器處於同一個區域網內。

比如說我要訪問taobao,對我來說不知道圖片、json、css 是不是同一個伺服器返回回來的,但是我不關心,是反向代理 處理的,我不知道原始伺服器。

3、Nginx如何處理HTTP請求的?

它結合多程序機制(單執行緒)和非同步非阻塞方式。

1、多程序機制(單執行緒)

伺服器每當收到一個客戶端時,就有 伺服器主程序 ( master process )生成一個 子程序( worker process )出來和客戶端建立連線進行互動,直到連線斷開,該子程序就結束了。

2、非同步非阻塞機制

每個工作程序 使用 非同步非阻塞方式 ,可以處理 多個客戶端請求 。 運用了epoll模型,提供了一個佇列,排隊解決。

當某個 工作程序 接收到客戶端的請求以後,呼叫 IO 進行處理,如果不能立即得到結果,就去 處理其他請求 (即為 非阻塞 );而 客戶端 在此期間也 無需等待響應 ,可以去處理其他事情(即為 非同步 )。

當 IO 返回時,就會通知此 工作程序 ;該程序得到通知,暫時 掛起 當前處理的事務去 響應客戶端請求 。

為什麼這麼快?可以參考一下Nginx官方介紹:http://www.aosabook.org/en/ng...

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

這跟Nginx的多程序、單執行緒有關。(一個程序只有一個主執行緒)。

為什麼要用單執行緒?

採用單執行緒來非同步非阻塞處理請求(管理員可以配置Nginx主程序的工作程序的數量),不會為每個請求分配cpu和記憶體資源,節省了大量資源,同時也減少了大量的CPU的上下文切換,所以才使得Nginx支援更高的併發。

簡單過程:

主程式 Master process 啟動後,通過一個 for 迴圈來 接收 和 處理外部訊號 ;

主程序通過 fork() 函式產生 worker 子程序 ,每個子程序執行一個 for迴圈來實現Nginx伺服器對事件的接收和處理 。

詳細過程:

1、Nginx 在啟動後,會有一個 master 程序和多個相互獨立的 worker 程序。
2、master 接收來自外界的訊號,先建立好需要 listen 的 socket(listenfd) 之後,然後再 fork 出多個 worker 程序,然後向各worker程序傳送訊號,每個程序都有可能來處理這個連線。
3、所有 worker 程序的 listenfd 會在新連線到來時變得可讀 ,為保證只有一個程序處理該連線,所有 worker 程序在註冊 listenfd 讀事件前搶佔 accept_mutex ,搶到互斥鎖的那個程序註冊 listenfd 讀事件 ,在讀事件裡呼叫 accept 接受該連線。
4、當一個 worker 程序在 accept 這個連線之後,就開始讀取請求、解析請求、處理請求,產生資料後,再返回給客戶端 ,最後才斷開連線。

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 有什麼區別?

500:

Internal Server Error 內部服務錯誤,比如指令碼錯誤,程式語言語法錯誤。

502:

Bad Gateway錯誤,閘道器錯誤。比如伺服器當前連線太多,響應太慢,頁面素材太多、頻寬慢。

503:

Service Temporarily Unavailable,服務不可用,web伺服器不能處理HTTP請求,可能是臨時超載或者是伺服器進行停機維護。

504:

Gateway timeout 閘道器超時,程式執行時間過長導致響應超時,例如程式需要執行20秒,而nginx最大響應等待時間為10秒,這樣就會出現超時。

7、Nginx 壓縮瞭解嗎,如何開啟壓縮?

開啟nginx gzip壓縮後,圖片、css、js等靜態資源的大小會減小,可節省頻寬,提高傳輸效率,但是會消耗CPU資源。

開啟:

    # 開啟gzip
    gzip off;

    # 啟用gzip壓縮的最小檔案,小於設定值的檔案將不會壓縮
    gzip_min_length 1k;

    # gzip 壓縮級別,1-9,數字越大壓縮的越好,也越佔用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伺服器,可以簡單理解為只能提供html靜態檔案服務。

Nginx和Apache區別:

1)Nginx輕量級,同樣起web 服務,比apache佔用更少的記憶體及資源 。

2)Nginx 抗併發,nginx 處理請求是非同步非阻塞的,而apache 則是阻塞型的,在高併發下nginx 能保持低資源低消耗高效能 。

3)Nginx提供負載均衡,可以做做反向代理,前端伺服器

4)Nginx多程序單執行緒,非同步非阻塞;Apache多程序同步,阻塞。

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

Nginx 預設提供的負載均衡策略:

  • 1、輪詢(預設)round_robin

    每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器 down 掉,能自動剔除。
  • 2、IP 雜湊 ip_hash

    每個請求按訪問 ip 的 hash 結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決 session 共享的問題。

    當然,實際場景下,一般不考慮使用 ip_hash 解決 session 共享。

  • 3、最少連線 least_conn

    下一個請求將被分派到活動連線數量最少的伺服器
  • 4、權重 weight

    weight的值越大分配到的訪問概率越高,主要用於後端每臺伺服器效能不均衡的情況下,達到合理的資源利用率。

還可以通過外掛支援其他策略。

10、Nginx動靜態資源分離做過嗎,為什麼要這樣做?

動態資源、靜態資源分離,是讓動態網站裡的動態網頁根據一定規則把不變的資源和經常變的資源區分開來 路。

比如說 js、css、hrml從A伺服器返回。圖片 從B伺服器返回,其他請求從Tomcat伺服器C返回。

後臺應用分開部署,提高使用者訪問靜態程式碼的速度。而且現在還有CDN服務,不需要限制於伺服器的頻寬。

11、ngx_http_upstream_module模組瞭解嗎?

ngx_http_upstream_module模組用於將多個伺服器定義成伺服器組,可通過fastcgi傳遞、proxy傳遞、uwsgi傳遞、memcached傳遞和scgi傳遞指令來引用的伺服器組。

比如訪問www.a.com 快取+排程:www.uyangjinhua.cn

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排程方法 寫了backup就不可用
        server 172.18.99.1:80 weight=2; #weight權重
        server 172.18.99.2:80;          #標記down,配合ip_hash使用,實現灰度釋出
        server 172.18.99.3:80 backup;   #backup將伺服器標記為“備用”,即所有伺服器均不可用時才啟用 
    }
}
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 提供兩種限流方式,一是控制速率,二是控制併發連線數。

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;
}
}

引數解釋:

key: 定義需要限流的物件。
zone: 定義共享記憶體區來儲存訪問資訊。
rate: 用於設定最大訪問速率。

表示基於客戶端192.168.1.1進行限流,定義了一個大小為10M,名稱為myLimit的記憶體區,用於儲存IP地址訪問資訊。rate設定IP訪問頻率,rate=5r/s表示每秒只能處理每個IP地址的5個請求。Nginx限流是按照毫秒級為單位的,也就是說1秒處理5個請求會變成每200ms只處理一個請求。如果200ms內已經處理完1個請求,但是還是有有新的請求到達,這時候Nginx就會拒絕處理該請求。

1.2 突發流量限制訪問頻率

上面rate設定了 5r/s,如果有時候流量突然變大,超出的請求就被拒絕返回503了,突發的流量影響業務就不好了。

這時候可以加上burst引數,一般再結合nodelay一起使用。

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

burst=20 nodelay表示這20個請求立馬處理,不能延遲,相當於特事特辦。不過,即使這20個突發請求立馬處理結束,後續來了請求也不會立馬處理。burst=20 相當於快取佇列中佔了20個坑,即使請求被處理了,這20個位置這隻能按 100ms一個來釋放。

2、控制併發連線數

ngx_http_limit_conn_module提供了限制連線數功能。

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) 同時能處理併發連線的總數。

注:limit_conn perserver 100作用的key是$server_name,表示虛擬主機(server) 同時能處理併發連線的總數。

拓展:

如果不想做限流,還可以設定白名單:

利用 Nginxngx_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;
}
# 正常限流設定
limit_req_zone $limit_key zone=myRateLimit:10m rate=10r/s;

geo對於白名單 將返回0,不限流;其他IP將返回1,進行限流。

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

除此之外:

ngx_http_core_module還提供了限制資料傳輸速度的能力(即常說的下載速度)

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

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