1.nginx的功能介紹
nginx(發(fā)音為“ engine x”)是由俄羅斯軟件工程師Igor Sysoev編寫的免費(fèi)開源Web服務(wù)器。
自2004年公開發(fā)布以來,nginx一直致力于高性能,高并發(fā)性和低內(nèi)存使用率。
Web服務(wù)器功能之上的其他功能,例如負(fù)載平衡,緩存,訪問和帶寬控制,以及與各種應(yīng)用程序高效集成的能力,已使Nginx成為現(xiàn)代網(wǎng)站體系結(jié)構(gòu)的理想選擇。
2.nginx的安裝
安裝依賴項(xiàng)
# GCC編譯器,用來編譯C語言程序
yum install -y gcc
# C++編譯器,用來編譯C++語言程序
yum install -y gcc-c++
# Perl庫(kù)兼容正則表達(dá)式,Nginx的HTTP模塊要靠它來解析正則表達(dá)式
yum install -y pcre pcre-devel
# zlib庫(kù),用于對(duì)HTTP包的內(nèi)容做gzip格式的壓縮
yum install -y zlib zlib-devel
# 可以一次性執(zhí)行前面的命令統(tǒng)一執(zhí)行前面的命令
sudo yum install -y gcc gcc-c++ pcre pcre-devel zlib zlib-devel
# nginx
wget http://nginx.org/download/nginx-1.14.2.tar.gz
tar -xvf nginx-1.14.2.tar.gz
# 安裝nginx 到/usr/local/nginx-1.14.2目錄下面
cd nginx-1.14.2
./configure --prefix=/usr/local/nginx-1.14.2
make
make install
3.使用方式
nginx –s stop?快速停止
nginx –s quit ?優(yōu)雅停機(jī)
nginx –s reload 重新加載配置文件
nginx –s reopen?日志文件過大重建后(比如備份之前的日志文件,重建新的日志文件),讓nginx把日志寫入到新建的同名文件中。
4.nginx配置為WEB靜態(tài)服務(wù)器
web服務(wù)器最重要的一個(gè)功能就是靜態(tài)文件分發(fā),比如css,jss,image;
http指令:構(gòu)造一個(gè)處理http請(qǐng)求的上下文
server指令:構(gòu)建一個(gè)虛擬服務(wù)器
location指令:虛擬服務(wù)器接收到端口對(duì)應(yīng)的http請(qǐng)求之后,處理的路由規(guī)則。
配置文件示例:
events {} # 必寫
http {# http請(qǐng)求相關(guān)的配置
??server {# 啟動(dòng)一個(gè)nginx虛擬服務(wù)器,默認(rèn)端口80
????location / {
??????# root 資源所在的根地址,此處為nginx安裝目錄內(nèi)的相對(duì)路徑
??????root html;
????}
????location /images/ {
??????# 此處寫的是盤符下的絕對(duì)路徑
??????root /data/www/;
????}
??}
}
收到http://localhost/images/?test.png?請(qǐng)求后,nginx返回/data/www/images/test.png文件內(nèi)容
收到http://localhost/some/index.html請(qǐng)求,nginx返回安裝目錄下/html/index.html的文件內(nèi)容
5.nginx配置為代理服務(wù)器
nginx除了返回靜態(tài)文件內(nèi)容,還提供了ngx_proxy_moudle模塊。在location中通過proxy_pass向上游服務(wù)器發(fā)起代理請(qǐng)求,給客戶端返回代理的內(nèi)容。
proxy_pass指令:向目標(biāo)服務(wù)器發(fā)起代理請(qǐng)求。
配置如下:
events {} # 必寫
http {# http請(qǐng)求相關(guān)的配置
??server {# 啟動(dòng)一個(gè)nginx虛擬服務(wù)器,默認(rèn)端口80
????location / {
??????# 向http://192.168.1.101:8081發(fā)起請(qǐng)求,并將代理請(qǐng)求返回的內(nèi)容作為響應(yīng)
??????proxy_pass http://192.168.1.101:8081;
????}
??}
}
6.nginx配置為動(dòng)靜分離服務(wù)器
動(dòng)靜分離:靜態(tài)內(nèi)容由nginx服務(wù)器直接返回,動(dòng)態(tài)內(nèi)容由nginx服務(wù)器發(fā)起代理請(qǐng)求獲取內(nèi)容。
本質(zhì)就是配置多個(gè)location模塊,配置多個(gè)路由、多個(gè)命令組合、根據(jù)不同的請(qǐng)求,走不同的路由。
配置如下:
events{}
http{#htttp請(qǐng)求相關(guān)的配置
? ? ? ? server{
? ? ? ? ? ? location /{
? ? ? ? ? ? ? ? proxy_pass http://127.0.0.1:8080
????????????}
? ? ? ? ? ? location ~/.(gif|jpg|png|css|js|html){#靜態(tài)不變的直接由nginx返回
? ? ? ? ? ? ? ? root data/www;
????????????}
? ? ? ? }
}
7.nginx配置集群負(fù)載均衡
nginx提供一個(gè)ngx_http_upstream_moudle模塊。
upstream指令塊:定義服務(wù)器實(shí)例集合,還可以指定負(fù)載均衡算法。
server指令:指定一個(gè)服務(wù)實(shí)例地址,weight參數(shù)是權(quán)重。
events {
}
http {
# Tomcat服務(wù)器集群
??upstream tomcat_servers {
#兩個(gè)tomcat
????server 192.168.1.100:8081 weight=3;
????server 192.168.1.101:8081;
??}
??server {
?? #將所有請(qǐng)求交給Tomcat集群去處理
??????location / {
??????proxy_set_header Host $http_host;
??????proxy_pass http://tomcat_servers;
????}
??}
}
其他關(guān)于負(fù)載均衡算法的指令請(qǐng)參考官方文檔:
http://nginx.org/en/docs/http/ngx_http_upstream_module.html
8.nginx故障轉(zhuǎn)移
問題描述:默認(rèn)情況下,當(dāng)nginx發(fā)起代理請(qǐng)求失敗后,也會(huì)給客戶端直接返回失敗的結(jié)果,這顯然會(huì)影響用戶的體驗(yàn)。
解決方案:?
????故障轉(zhuǎn)移 :將請(qǐng)求分配給A服務(wù)器處理失敗后,繼續(xù)將請(qǐng)求分配給B繼續(xù)處理。
? ? 配置指令:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_next_upstream
? ? 配置示例:proxy_next_upstream error timout;
注意事項(xiàng):
? ? 可能會(huì)導(dǎo)致服務(wù)器處理重復(fù)請(qǐng)求,需要注意接口冪等性。
解決方案:所有數(shù)據(jù)修改的操作都要加上去重邏輯。請(qǐng)求中攜帶唯一的request_id以及發(fā)起請(qǐng)求的時(shí)間,后端通過filter記錄下來。
具體實(shí)現(xiàn)思路:進(jìn)入表單提交頁(yè)面時(shí)從后端獲取一個(gè)token令牌 ,后端產(chǎn)生token保存起來并設(shè)置一個(gè)過期時(shí)間,后端收到請(qǐng)求后即刪除token。這樣如果用戶傳遞的token在后端找不到,即認(rèn)為該請(qǐng)求失效,提示用戶重試。
9.nginx雪崩的應(yīng)對(duì)方案
? ? nginx在故障轉(zhuǎn)移的場(chǎng)景下,會(huì)給其它正常的后端服務(wù)器分配更多的請(qǐng)求。而在高并發(fā)的場(chǎng)景下,每臺(tái)服務(wù)器的壓力都非常大,如果把原本由其它后端服務(wù)器處理的請(qǐng)求分?jǐn)偝鰜?,可能?huì)導(dǎo)致原來正常的服務(wù)器,因壓力增大而崩潰。一般有兩種解決方案:限制重試次數(shù),限制重試超時(shí)時(shí)間。、
10.nginx的熔斷機(jī)制
? ? 問題描述:對(duì)于確實(shí)存在故障的服務(wù)器,nginx不必去做太多的嘗試 ,因?yàn)檫@會(huì)導(dǎo)致一個(gè)請(qǐng)求的處理時(shí)間變的過長(zhǎng)。示例:服務(wù)器A的壓力很大,處理請(qǐng)求的時(shí)長(zhǎng)為15s,nginx設(shè)置的超時(shí)時(shí)間為10秒,服務(wù)器B的請(qǐng)求處理時(shí)間為1s。一個(gè)請(qǐng)求先轉(zhuǎn)發(fā)到A服務(wù)器,超時(shí)后再故障轉(zhuǎn)移到B服務(wù)器。整個(gè)請(qǐng)求的處理時(shí)長(zhǎng)在用戶看來是11s。
? ? 熔斷機(jī)制:當(dāng)nginx請(qǐng)求某臺(tái)服務(wù)器時(shí),出現(xiàn)一定次數(shù)錯(cuò)誤(可配置)的情況下,nginx在一定時(shí)間內(nèi)(可配置),不在將請(qǐng)求分配給改服務(wù)器處理。過了熔斷時(shí)間后,nginx會(huì)嘗試分配一次請(qǐng)求給該服務(wù)器處理,如果失敗,繼續(xù)熔斷。
配置示例:192.168.1.100 max_fails=3 fail_timeout=10s