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