nginx入門

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容