Nginx 如何工作 負載均衡策略有哪些 如何限流

3、所有 worker 進程的 listenfd 會在新連接到來時變得可讀 ,爲保證只有一個進程處理該連接,所有 worker 進程在註冊 listenfd 讀事件前搶佔 accept_mutex ,搶到互斥鎖的那個進程註冊 listenfd 讀事件 ,在讀事件裏調用 accept 接受該連接。
4、當一個 worker 進程在 accept 這個連接之後,就開始讀取請求、解析請求、處理請求,產生數據後,再返回給客戶端 ,最後才斷開連接。

5、Nginx 常用命令有哪些(java項目fhadmin.cn)?
啓動 nginx 。
停止 nginx -s stop 或 nginx -s quit 。
重啓 nginx -s reload 或 service 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區別(java項目fhadmin.cn):

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 緩存+調度:

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://fhadmin.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://fhadmin.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) 同時能處理併發連接的總數。

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

利用 Nginx?ngx_http_geo_module?和?ngx_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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章