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 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 有什么區(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_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;
}
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月匣。