【96期】盤點(diǎn)那些關(guān)于Nginx的??济嬖囶}
閱讀本文大概需要 12 分鐘。
來(lái)自:juejin.im/post/5e941ec4e51d45471263ef32
什么是Nginx?
為什么要用Nginx?
節(jié)省寬帶:支持GZIP壓縮,可以添加瀏覽器本地緩存
穩(wěn)定性高:宕機(jī)的概率非常小
接收用戶請(qǐng)求是異步的
為什么Nginx性能這么高?
Nginx怎么處理請(qǐng)求的?
????server?{????????????????????????????#?第一個(gè)Server區(qū)塊開始,表示一個(gè)獨(dú)立的虛擬主機(jī)站點(diǎn)
????????listen???????80;??????????????????????#?提供服務(wù)的端口,默認(rèn)80
??????? server_name localhost;????????????#?提供服務(wù)的域名主機(jī)名
????????location?/?{????????????????????????#?第一個(gè)location區(qū)塊開始
????????????root?? html;???????????????#?站點(diǎn)的根目錄,相當(dāng)于Nginx的安裝目錄
??????????? index index.html index.htm;????????#?默認(rèn)的首頁(yè)文件,多個(gè)用空格分開
????????}??????????????????????????#?第一個(gè)location區(qū)塊結(jié)果
????}???????????
什么是正向代理和反向代理?
正向代理就是一個(gè)人發(fā)送一個(gè)請(qǐng)求直接就到達(dá)了目標(biāo)的服務(wù)器
反方代理就是請(qǐng)求統(tǒng)一被Nginx接收,nginx反向代理服務(wù)器接收到之后,按照一定的規(guī)則分發(fā)給了后端的業(yè)務(wù)處理服務(wù)器進(jìn)行處理了
使用“反向代理服務(wù)器的優(yōu)點(diǎn)是什么?
Nginx的優(yōu)缺點(diǎn)?
占內(nèi)存小,可實(shí)現(xiàn)高并發(fā)連接,處理響應(yīng)快
可實(shí)現(xiàn)http服務(wù)器、虛擬主機(jī)、方向代理、負(fù)載均衡
Nginx配置簡(jiǎn)單
可以不暴露正式的服務(wù)器IP地址
動(dòng)態(tài)處理差:nginx處理靜態(tài)文件好,耗費(fèi)內(nèi)存少,但是處理動(dòng)態(tài)頁(yè)面則很雞肋,現(xiàn)在一般前端用nginx作為反向代理抗住壓力,
Nginx應(yīng)用場(chǎng)景?
http服務(wù)器。Nginx是一個(gè)http服務(wù)可以獨(dú)立提供http服務(wù)??梢宰鼍W(wǎng)頁(yè)靜態(tài)服務(wù)器。
虛擬主機(jī)??梢詫?shí)現(xiàn)在一臺(tái)服務(wù)器虛擬出多個(gè)網(wǎng)站,例如個(gè)人網(wǎng)站使用的虛擬機(jī)。
反向代理,負(fù)載均衡。當(dāng)網(wǎng)站的訪問量達(dá)到一定程度后,單臺(tái)服務(wù)器不能滿足用戶的請(qǐng)求時(shí),需要用多臺(tái)服務(wù)器集群可以使用nginx做反向代理。并且多臺(tái)服務(wù)器可以平均分擔(dān)負(fù)載,不會(huì)應(yīng)為某臺(tái)服務(wù)器負(fù)載高宕機(jī)而某臺(tái)服務(wù)器閑置的情況。
nginz 中也可以配置安全管理、比如可以使用Nginx搭建API接口網(wǎng)關(guān),對(duì)每個(gè)接口服務(wù)進(jìn)行攔截。
Nginx目錄結(jié)構(gòu)有哪些?
[root@localhost?~]#?tree?/usr/local/nginx
/usr/local/nginx
├──?client_body_temp
├──?conf?????????????????????????????#?Nginx所有配置文件的目錄
│???├──?fastcgi.conf?????????????????#?fastcgi相關(guān)參數(shù)的配置文件
│???├──?fastcgi.conf.default?????????#?fastcgi.conf的原始備份文件
│???├──?fastcgi_params???????????????#?fastcgi的參數(shù)文件
│???├──?fastcgi_params.default???????
│???├──?koi-utf
│???├──?koi-win
│???├──?mime.types???????????????????#?媒體類型
│???├──?mime.types.default
│???├──?nginx.conf???????????????????#?Nginx主配置文件
│???├──?nginx.conf.default
│???├──?scgi_params??????????????????#?scgi相關(guān)參數(shù)文件
│???├──?scgi_params.default??
│???├──?uwsgi_params?????????????????#?uwsgi相關(guān)參數(shù)文件
│???├──?uwsgi_params.default
│???└──?win-utf
├──?fastcgi_temp?????????????????????#?fastcgi臨時(shí)數(shù)據(jù)目錄
├──?html?????????????????????????????#?Nginx默認(rèn)站點(diǎn)目錄
│???├──?50x.html?????????????????????#?錯(cuò)誤頁(yè)面優(yōu)雅替代顯示文件,例如當(dāng)出現(xiàn)502錯(cuò)誤時(shí)會(huì)調(diào)用此頁(yè)面
│???└──?index.html???????????????????#?默認(rèn)的首頁(yè)文件
├──?logs?????????????????????????????#?Nginx日志目錄
│???├──?access.log???????????????????#?訪問日志文件
│???├──?error.log????????????????????#?錯(cuò)誤日志文件
│???└──?nginx.pid????????????????????#?pid文件,Nginx進(jìn)程啟動(dòng)后,會(huì)把所有進(jìn)程的ID號(hào)寫到此文件
├──?proxy_temp???????????????????????#?臨時(shí)目錄
├──?sbin?????????????????????????????#?Nginx命令目錄
│???└──?nginx????????????????????????#?Nginx的啟動(dòng)命令
├──?scgi_temp????????????????????????#?臨時(shí)目錄
└──?uwsgi_temp???????????????????????#?臨時(shí)目錄
Nginx配置文件nginx.conf有哪些屬性模塊?
worker_processes??1;????????????????????????????#?worker進(jìn)程的數(shù)量
events?{??????????????????????????????????????????#?事件區(qū)塊開始
????worker_connections??1024;??????????????????#?每個(gè)worker進(jìn)程支持的最大連接數(shù)
}???????????????????????????????????????????#?事件區(qū)塊結(jié)束
http?{???????????????????????????????????????#?HTTP區(qū)塊開始
????include?????? mime.types;?????????????????????#?Nginx支持的媒體類型庫(kù)文件
??? default_type application/octet-stream;????????????#?默認(rèn)的媒體類型
????sendfile????????on;???????????????????????#?開啟高效傳輸模式
????keepalive_timeout??65;???????????????????#?連接超時(shí)
????server?{????????????????????????????????????#?第一個(gè)Server區(qū)塊開始,表示一個(gè)獨(dú)立的虛擬主機(jī)站點(diǎn)
????????listen???????80;??????????????????????????#?提供服務(wù)的端口,默認(rèn)80
??????? server_name localhost;????????????????#?提供服務(wù)的域名主機(jī)名
????????location?/?{????????????????????????????#?第一個(gè)location區(qū)塊開始
????????????root?? html;???????????????????#?站點(diǎn)的根目錄,相當(dāng)于Nginx的安裝目錄
??????????? index index.html index.htm;???????????#?默認(rèn)的首頁(yè)文件,多個(gè)用空格分開
????????}??????????????????????????????????#?第一個(gè)location區(qū)塊結(jié)果
????????error_page???500502503504??/50x.html;??????????#?出現(xiàn)對(duì)應(yīng)的http狀態(tài)碼時(shí),使用50x.html回應(yīng)客戶
????????location?=?/50x.html?{??????????????????????#?location區(qū)塊開始,訪問50x.html
????????????root?? html;??????????????????????????????#?指定對(duì)應(yīng)的站點(diǎn)目錄為html
????????}
????}??
????......
Nginx靜態(tài)資源?
如何用Nginx解決前端跨域問題?
Nginx虛擬主機(jī)怎么配置?
????#當(dāng)客戶端訪問www.lijie.com,監(jiān)聽端口號(hào)為80,直接跳轉(zhuǎn)到data/www目錄下文件
????server?{
????????listen???????80;
????????server_name??www.lijie.com;
????????location?/?{
????????????root???data/www;
????????????index??index.html?index.htm;
????????}
????}
????#當(dāng)客戶端訪問www.lijie.com,監(jiān)聽端口號(hào)為80,直接跳轉(zhuǎn)到data/bbs目錄下文件
????server?{
????????listen???????80;
????????server_name??bbs.lijie.com;
????????location?/?{
????????????root???data/bbs;
????????????index??index.html?index.htm;
????????}
????}
????#當(dāng)客戶端訪問www.lijie.com,監(jiān)聽端口號(hào)為8080,直接跳轉(zhuǎn)到data/www目錄下文件
????server?{
????????listen???????8080;
????????server_name??8080.lijie.com;
????????location?/?{
????????????root???data/www;
????????????index??index.html?index.htm;
????????}
????}
????#當(dāng)客戶端訪問www.lijie.com,監(jiān)聽端口號(hào)為80直接跳轉(zhuǎn)到真實(shí)ip服務(wù)器地址?127.0.0.1:8080
????server?{
????????listen???????80;
????????server_name??www.lijie.com;
????????location?/?{
????????proxy_pass?http://127.0.0.1:8080;
????????????????index??index.html?index.htm;
????????}
????}
location的作用是什么?

????#優(yōu)先級(jí)1,精確匹配,根路徑
????location?=/?{
????????return?400;
????}
????#優(yōu)先級(jí)2,以某個(gè)字符串開頭,以av開頭的,優(yōu)先匹配這里,區(qū)分大小寫
????location?^~?/av?{
???????root?/data/av/;
????}
????#優(yōu)先級(jí)3,區(qū)分大小寫的正則匹配,匹配/media*****路徑
????location?~?/media?{
??????????alias?/data/static/;
????}
????#優(yōu)先級(jí)4?,不區(qū)分大小寫的正則匹配,所有的****.jpg|gif|png?都走這里
????location?~*?.*\.(jpg|gif|png|js|css)$?{
???????root??/data/av/;
????}
????#優(yōu)先7,通用匹配
????location?/?{
????????return?403;
????}
限流怎么做的?
正常限制訪問頻率(正常流量)
突發(fā)限制訪問頻率(突發(fā)流量)
限制并發(fā)連接數(shù)
實(shí)現(xiàn)三種限流算法
????#定義限流維度,一個(gè)用戶一分鐘一個(gè)請(qǐng)求進(jìn)來(lái),多余的全部漏掉
????limit_req_zone?$binary_remote_addr?zone=one:10m?rate=1r/m;
????#綁定限流維度
????server{
????????location/seckill.html{
????????????limit_req?zone=zone;????
????????????proxy_pass?http://lj_seckill;
????????}
????}
????#定義限流維度,一個(gè)用戶一分鐘一個(gè)請(qǐng)求進(jìn)來(lái),多余的全部漏掉
????limit_req_zone?$binary_remote_addr?zone=one:10m?rate=1r/m;
????#綁定限流維度
????server{
????????location/seckill.html{
????????????limit_req?zone=zone?burst=5?nodelay;
????????????proxy_pass?http://lj_seckill;
????????}
????}
????http?{
????limit_conn_zone?$binary_remote_addr?zone=myip:10m;
????limit_conn_zone?$server_name?zone=myServerName:10m;
????}
????server?{
????????location?/?{
????????????limit_conn?myip?10;
????????????limit_conn?myServerName?100;
????????????rewrite?/?http://www.lijie.net?permanent;
????????}
????}
漏桶流算法和令牌桶算法知道?


為什么要做動(dòng)靜分離?
Nginx是當(dāng)下最熱的Web容器,網(wǎng)站優(yōu)化的重要點(diǎn)在于靜態(tài)化網(wǎng)站,網(wǎng)站靜態(tài)化的關(guān)鍵點(diǎn)則是是動(dòng)靜分離,動(dòng)靜分離是讓動(dòng)態(tài)網(wǎng)站里的動(dòng)態(tài)網(wǎng)頁(yè)根據(jù)一定規(guī)則把不變的資源和經(jīng)常變的資源區(qū)分開來(lái),動(dòng)靜資源做好了拆分以后,我們則根據(jù)靜態(tài)資源的特點(diǎn)將其做緩存操作。
讓靜態(tài)的資源只走靜態(tài)資源服務(wù)器,動(dòng)態(tài)的走動(dòng)態(tài)的服務(wù)器
Nginx的靜態(tài)處理能力很強(qiáng),但是動(dòng)態(tài)處理能力不足,因此,在企業(yè)中常用動(dòng)靜分離技術(shù)。
對(duì)于靜態(tài)資源比如圖片,js,css等文件,我們則在反向代理服務(wù)器nginx中進(jìn)行緩存。這樣瀏覽器在請(qǐng)求一個(gè)靜態(tài)資源時(shí),代理服務(wù)器nginx就可以直接處理,無(wú)需將請(qǐng)求轉(zhuǎn)發(fā)給后端服務(wù)器tomcat。
若用戶請(qǐng)求的動(dòng)態(tài)文件,比如servlet,jsp則轉(zhuǎn)發(fā)給Tomcat服務(wù)器處理,從而實(shí)現(xiàn)動(dòng)靜分離。這也是反向代理服務(wù)器的一個(gè)重要的作用。
Nginx怎么做的動(dòng)靜分離?
????????location?/image/?{
????????????root???/usr/local/static/;
????????????autoindex?on;
????????}
mkdir?/usr/local/static/image
cd??/usr/local/static/image
1.jpg
sudo?nginx?-s?reload
Nginx負(fù)載均衡的算法怎么實(shí)現(xiàn)的?策略有哪些?
1 輪詢(默認(rèn))
upstream?backserver?{?
?server?192.168.0.12;?
?server?192.168.0.13;?
}?
2 權(quán)重 weight
upstream?backserver?{?
?server?192.168.0.12?weight=2;?
?server?192.168.0.13?weight=8;?
}?
3 ip_hash( IP綁定)
upstream?backserver?{?
?ip_hash;?
?server?192.168.0.12:88;?
?server?192.168.0.13:80;?
}?
4 fair(第三方插件)
upstream?backserver?{?
?server?server1;?
?server?server2;?
?fair;?
}?
5、url_hash(第三方插件)
upstream?backserver?{?
?server?squid1:3128;?
?server?squid2:3128;?
?hash?$request_uri;?
?hash_method?crc32;?
}?
Nginx配置高可用性怎么配置?
server?{
????????listen???????80;
????????server_name??www.lijie.com;
????????location?/?{
????????????###?指定上游服務(wù)器負(fù)載均衡服務(wù)器
????????????proxy_pass?http://backServer;
????????????###nginx與上游服務(wù)器(真實(shí)訪問的服務(wù)器)超時(shí)時(shí)間?后端服務(wù)器連接的超時(shí)時(shí)間_發(fā)起握手等候響應(yīng)超時(shí)時(shí)間
????????????proxy_connect_timeout?1s;
????????????###nginx發(fā)送給上游服務(wù)器(真實(shí)訪問的服務(wù)器)超時(shí)時(shí)間
????????????proxy_send_timeout?1s;
????????????###?nginx接受上游服務(wù)器(真實(shí)訪問的服務(wù)器)超時(shí)時(shí)間
????????????proxy_read_timeout?1s;
????????????index??index.html?index.htm;
????????}
????}
Nginx怎么判斷別IP不可訪問?
#?如果訪問的ip地址為192.168.9.115,則返回403
if??($remote_addr?=?192.168.9.115)?{??
?????return?403;??
}??
怎么限制瀏覽器訪問?
##?不允許谷歌瀏覽器訪問?如果是谷歌瀏覽器返回500
if?($http_user_agent?~?Chrome)?{???
????return?500;??
}
Rewrite全局變量是什么?


推薦閱讀:
【95期】面試官:你遇到 Redis 線上連接超時(shí)一般如何處理?
【94期】面試官:熟悉Redis嗎,項(xiàng)目中你是如何對(duì)Redis內(nèi)存進(jìn)行優(yōu)化的
【93期】經(jīng)典面試題:Redis 內(nèi)存滿了怎么辦?
微信掃描二維碼,關(guān)注我的公眾號(hào)
朕已閱?

