柚子快報(bào)邀請(qǐng)碼778899分享:運(yùn)維 Nginx
柚子快報(bào)邀請(qǐng)碼778899分享:運(yùn)維 Nginx
Nginx
Nginx 官網(wǎng)
1. Nginx 簡(jiǎn)介
1.1 Nginx 介紹
作者是一個(gè)俄國(guó)人,2000年開始用c語言寫的。 免費(fèi)開源,高性能
1.1.1 什么是 Nginx
Nginx采用了 epoll 模型(非阻塞 IO 模型),是一個(gè) 輕量級(jí)/高性能的反向代理Web服務(wù)器,用于 HTTP、HTTPS、SMTP、POP3 和 IMAP 協(xié)議。它實(shí)現(xiàn)非常高效的反向代理、負(fù)載平衡,他可以處理2-3萬并發(fā)連接數(shù),官方監(jiān)測(cè)能支持5萬并發(fā),現(xiàn)在中國(guó)使用nginx網(wǎng)站用戶有很多,例如:新浪、網(wǎng)易、 騰訊等。
1.1.2 代理服務(wù)器
代理服務(wù)器(Proxy Server),常用來做轉(zhuǎn)發(fā),或者防火墻。為客戶端打工的是正向代理,為服務(wù)端打工的是反向代理。
常見服務(wù)器區(qū)別
NginxApache Http ServerTomcat萬級(jí)別并發(fā)存在c10K問題并發(fā)量100左右web服務(wù)器web服務(wù)器應(yīng)用服務(wù)器靜態(tài)資源(通過其他模塊來支持動(dòng)態(tài)資源)靜態(tài)資源(通過其他模塊來支持動(dòng)態(tài)資源)可以動(dòng)態(tài)生成HTML頁(yè)面支持多種協(xié)議支持多種協(xié)議
Nginx 是一個(gè)輕量級(jí)的http服務(wù)器(http server)。當(dāng)然除了http,nginx也支持smtp, pop3, imap協(xié)議,還通過模塊支持tcp。
和apache http server project區(qū)別 都是http server, 用來處理請(qǐng)求的,nginx 可以支持其它協(xié)議,解決并發(fā)問題,支持更高的并發(fā)量 和tomcat區(qū)別 tomcat 稱為application server(應(yīng)用服務(wù)器),nginx是http 服務(wù)器,http服務(wù)器一般用來訪問靜態(tài)資源的而應(yīng)用服務(wù)器則可以動(dòng)態(tài)生成資源內(nèi)容。
知識(shí)擴(kuò)展
web服務(wù) 服務(wù)端通過網(wǎng)絡(luò)可以提供給客戶端所請(qǐng)求的資源 c10K問題 1W的并發(fā)量問題
1.1.3 Nginx 優(yōu)點(diǎn)
跨平臺(tái)、配置簡(jiǎn)單。非阻塞、高并發(fā)連接:處理 2-3 萬并發(fā)連接數(shù),官方監(jiān)測(cè)能支持 5 萬并發(fā)。內(nèi)存消耗?。洪_啟 10 個(gè) Nginx 才占 150M 內(nèi)存。成本低廉,且開源。穩(wěn)定性高,宕機(jī)的概率非常小。內(nèi)置的健康檢查功能:如果有一個(gè)服務(wù)器宕機(jī),會(huì)做一個(gè)健康檢查,再發(fā)送的請(qǐng)求就不會(huì)發(fā)送到宕機(jī)的服務(wù)器了。重新將請(qǐng)求提交到其他的節(jié)點(diǎn)上
保護(hù)了真實(shí)的web服務(wù)器,保證了web服務(wù)器的資源安全,對(duì)反向代理服務(wù)器的攻擊并不會(huì)使得網(wǎng)頁(yè)信息遭到破壞,所有的靜態(tài)網(wǎng)頁(yè)或者CGI程序,都保存在內(nèi)部的Web服務(wù)器上。節(jié)約了有限的IP地址資源, 企業(yè)內(nèi)所有的網(wǎng)站共享一個(gè)在internet中注冊(cè)的IP地址,這些服務(wù)器分配私有地址,采用虛擬主機(jī)的方式對(duì)外提供服務(wù)。減少WEB服務(wù)器壓力,提高響應(yīng)速度請(qǐng)求的統(tǒng)一控制,包括設(shè)置權(quán)限、過濾規(guī)則等;區(qū)分動(dòng)態(tài)和靜態(tài)可緩存內(nèi)容;實(shí)現(xiàn)負(fù)載均衡,內(nèi)部可以采用多臺(tái)服務(wù)器來組成服務(wù)器集群,外部還是可以采用一個(gè)地址訪問;解決Ajax跨域問題;作為真實(shí)服務(wù)器的緩沖,解決瞬間負(fù)載量大的問題;模塊化、事件驅(qū)動(dòng)、異步、非阻塞、多進(jìn)程單線程。
1.1.6 應(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)行攔截。
1.1.5 其它功能
熱部署: 修改nginx.conf配置文件后, 重新生成worker進(jìn)程達(dá)到熱部署高并發(fā): nginx采用了Linux的epoll模型,epoll模型基于時(shí)間驅(qū)動(dòng)機(jī)制nginx掛了怎么辦: Keepalived + Nginx實(shí)現(xiàn)高可用
1.2 請(qǐng)求處理
1.2.1 工作流程
用戶通過域名發(fā)出訪問Web服務(wù)器的請(qǐng)求,該域名被DNS服務(wù)器解析為反向代理服務(wù)器的IP地址;反向代理服務(wù)器接受用戶的請(qǐng)求;反向代理服務(wù)器在本地緩存中查找請(qǐng)求的內(nèi)容,找到后直接把內(nèi)容發(fā)送給用戶;如果本地緩存里沒有用戶所請(qǐng)求的信息內(nèi)容,反向代理服務(wù)器會(huì)代替用戶向源服務(wù)器請(qǐng)求同樣的信息內(nèi)容,并把信息內(nèi)容發(fā)給用戶,如果信息內(nèi)容是緩存的還會(huì)把它保存到緩存中。
1.2.2 請(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.html; # 默認(rèn)的首頁(yè)文件,多個(gè)用空格分開
} # 第一個(gè)location區(qū)塊結(jié)果
}
1> 首先,Nginx 在啟動(dòng)時(shí),會(huì)解析配置文件,得到需要監(jiān)聽的端口與 IP 地址,然后在 Nginx 的 Master 進(jìn)程里面先初始化好這個(gè)監(jiān)控的Socket(創(chuàng)建 Socket,設(shè)置 addr、reuse 等選項(xiàng),綁定到指定的 ip 地址端口,再 listen 監(jiān)聽)。
2> 然后,再 fork(一個(gè)現(xiàn)有進(jìn)程可以調(diào)用 fork 函數(shù)創(chuàng)建一個(gè)新進(jìn)程。由 fork 創(chuàng)建的新進(jìn)程被稱為子進(jìn)程 )出多個(gè)子進(jìn)程出來。
3> 之后,子進(jìn)程會(huì)競(jìng)爭(zhēng) accept 新的連接。此時(shí),客戶端就可以向 nginx 發(fā)起連接了。當(dāng)客戶端與nginx進(jìn)行三次握手,與 nginx 建立好一個(gè)連接后。此時(shí),某一個(gè)子進(jìn)程會(huì) accept 成功,得到這個(gè)建立好的連接的 Socket ,然后創(chuàng)建 nginx 對(duì)連接的封裝,即 ngx_connection_t 結(jié)構(gòu)體。
4> 接著,設(shè)置讀寫事件處理函數(shù),并添加讀寫事件來與客戶端進(jìn)行數(shù)據(jù)的交換。
5> 最后,Nginx 或客戶端來主動(dòng)關(guān)掉連接,到此,一個(gè)連接就壽終正寢了。
1.2.3 工作模型
1.2.3.1 多進(jìn)程
Nginx在啟動(dòng)時(shí)會(huì)以daemon形式在后臺(tái)運(yùn)行,采用多進(jìn)程+異步非阻塞IO事件模型來處理各種連接請(qǐng)求。
多進(jìn)程模型包括一個(gè)master進(jìn)程,多個(gè)worker進(jìn)程,一般worker進(jìn)程個(gè)數(shù)是根據(jù)服務(wù)器CPU核數(shù)來決定的。
1.2.3.4.1 master 進(jìn)程
master進(jìn)程負(fù)責(zé)讀取并驗(yàn)證配置文件nginx.conf, 負(fù)責(zé)管理Nginx本身和其他worker進(jìn)程。
1.2.3.4.2 Work 進(jìn)程
每一個(gè)Worker進(jìn)程都維護(hù)一個(gè)線程(避免線程切換),處理連接和請(qǐng)求;注意Worker進(jìn)程的個(gè)數(shù)由配置文件決定,一般和CPU個(gè)數(shù)相關(guān)(有利于進(jìn)程切換),配置幾個(gè)就有幾個(gè)Worker進(jìn)程。
Nginx真正處理請(qǐng)求業(yè)務(wù)的是Worker之下的線程。worker進(jìn)程中有一個(gè)ngx_worker_process_cycle()函數(shù),執(zhí)行無限循環(huán),不斷處理收到的來自客戶端的請(qǐng)求,并進(jìn)行處理,直到整個(gè)Nginx服務(wù)被停止。
ps -l ax | awk 'BEGIN {} NR==1 {print $0} /nginx/ {print $0}' # 查看nginx master work 進(jìn)程
1.2.3.2 事件模型
Nginx是如何實(shí)現(xiàn)高并發(fā)的,正式源于他的事件驅(qū)動(dòng)模型,異步,非阻塞。
每進(jìn)來一個(gè) request ,會(huì)有一個(gè) worker 進(jìn)程去處理。但不是全程的處理,處理到可能發(fā)生阻塞的地方,比如向上游(后端)服務(wù)器轉(zhuǎn)發(fā) request ,并等待請(qǐng)求返回。他會(huì)在發(fā)送完請(qǐng)求后,注冊(cè)一個(gè)事件:如果 upstream 返回了,得到通知會(huì)繼續(xù)進(jìn)行該請(qǐng)求。否則再以這樣的方式處理其它請(qǐng)求。即一旦上游服務(wù)器返回了,就會(huì)觸發(fā)這個(gè)事件,worker 才會(huì)來接手,這個(gè) request 才會(huì)接著往下走。
異步,非阻塞,使用 epoll ,和大量細(xì)節(jié)處的優(yōu)化。也正是 Nginx 之所以然的技術(shù)基石。
2. Nginx 模塊
2.1 模塊劃分
從結(jié)構(gòu)上劃分
核心模塊:HTTP模塊、EVENT模塊和MAIL模塊
基礎(chǔ)模塊:HTTP Access模塊、HTTP FastCGI模塊、HTTP Proxy模塊和HTTP Rewrite模塊,
第三方模塊:HTTP Upstream Request Hash模塊、Notice模塊和HTTP Access Key模塊。
從功能上劃分
Core(核心模塊):構(gòu)建nginx基礎(chǔ)服務(wù)、管理其他模塊。
Handlers(處理器模塊):此類模塊直接處理請(qǐng)求,并進(jìn)行輸出內(nèi)容和修改headers信息等操作。
Filters (過濾器模塊):此類模塊主要對(duì)其他處理器模塊輸出的內(nèi)容進(jìn)行修改操作,最后由Nginx輸出。
Proxies (代理類模塊):此類模塊是Nginx的HTTP Upstream之類的模塊,這些模塊主要與后端一些服務(wù)比如FastCGI等進(jìn)行交互,實(shí)現(xiàn)服務(wù)代理和負(fù)載均衡等功能。
模塊之間的關(guān)系
Nginx的核心模塊主要負(fù)責(zé)建立nginx服務(wù)模型、管理網(wǎng)絡(luò)層和應(yīng)用層協(xié)議、以及啟動(dòng)針對(duì)特定應(yīng)用的一系列候選模塊。其他模塊負(fù)責(zé)分配給web服務(wù)器的實(shí)際工作
1) 當(dāng)服務(wù)器啟動(dòng),每個(gè)handlers(處理模塊)都有機(jī)會(huì)映射到配置文件中定義的特定位置(location);如果有多個(gè)handlers(處理模塊)映射到特定位置時(shí),只有一個(gè)會(huì)“贏”(說明配置文件有沖突項(xiàng),應(yīng)該避免發(fā)生) 處理模塊以(OK ERROR 放棄請(qǐng)求使用默認(rèn)模塊來處理)三種形式返回。
2) 如果handlers(處理模塊)把請(qǐng)求反向代理到后端的服務(wù)器,就變成另外一類的模塊:load-balancers(負(fù)載均衡模塊)。負(fù)載均衡模塊的配置中有一組后端服務(wù)器,當(dāng)一個(gè)HTTP請(qǐng)求過來時(shí),它決定哪臺(tái)服務(wù)器應(yīng)當(dāng)獲得這個(gè)請(qǐng)求。
3) 如果handlers(處理模塊)沒有產(chǎn)生錯(cuò)誤,filters(過濾模塊)將被調(diào)用。多個(gè)filters(過濾模塊)能映射到每個(gè)位置,所以(比如)每個(gè)請(qǐng)求都可以被壓縮成塊。它們的執(zhí)行順序在編譯時(shí)決定。 filters(過濾模塊)是經(jīng)典的“接力鏈表(CHAIN OF RESPONSIBILITY)”模型
通常一個(gè)location中的指令會(huì)涉及一個(gè)handler模塊和多個(gè)filter模塊(當(dāng)然,多個(gè)location可以復(fù)用同一個(gè)模塊)。handler模塊負(fù)責(zé)處理請(qǐng)求,完成響應(yīng)內(nèi)容的生成,而filter模塊對(duì)響應(yīng)內(nèi)容進(jìn)行處理。
2.1.1 http 模塊
2.1.2 stream 模塊
2.2 多線程處理
1) master進(jìn)程一開始會(huì)根據(jù)配置建立listen的網(wǎng)絡(luò)socket fd, 然后fork出多個(gè)worker進(jìn)程,worker和master具有相同的配置,監(jiān)聽相同的端口。由于都是監(jiān)聽相同的端口,所以當(dāng)一個(gè)請(qǐng)求進(jìn)來時(shí),所有的worker會(huì)感知到,就是所謂的"驚群現(xiàn)象", 為了保證只會(huì)有一個(gè)進(jìn)程注冊(cè)到listenfd的讀事件, nginx采用"accept_mutex"類似的互斥鎖,只有獲取這個(gè)鎖的才可以去注冊(cè)讀事件。
2) 進(jìn)程間是獨(dú)立的,所以worker也是相互不影響的,且一個(gè)request請(qǐng)求一個(gè)worker就可以完成。
為了避免驚群,和單個(gè)worker一直競(jìng)爭(zhēng)成功的問題,nginx采用是否打開accept_mutex選項(xiàng)的值。 ngx_accept_disabled標(biāo)識(shí)控制一個(gè)worker進(jìn)程是否需要去競(jìng)爭(zhēng)獲取accept_mutex選項(xiàng),進(jìn)而獲取accept事件。 ngx_accept_disabled值:nginx單進(jìn)程的所有連接總數(shù)的八分之一,減去剩下的空閑連接數(shù)量,得到的這個(gè)ngx_accept_disabled。 當(dāng)空閑連接越少時(shí),ngx_accept_disable越大,于是讓出的機(jī)會(huì)就越多,這樣其它進(jìn)程獲取鎖的機(jī)會(huì)也就越大。
3. 安裝
3.1 window 安裝
# window 安裝
1. 下載安裝包 解壓
2. 直接nginx.exe 啟動(dòng)就行
3. 可以配置服務(wù)為開機(jī)自動(dòng)重啟 百度一下
直接執(zhí)行:
ngnix.exe 改啟動(dòng)會(huì)占用cli界面
start nginx -c conf/nginx.conf 根據(jù)配置文件進(jìn)行啟動(dòng)
nginx.exe -t -c conf/default.conf
nginx.exe -s stop
nginx.exe -s quit
stop是快速停止nginx,可能并不保存相關(guān)信息;quit是完整有序的停止nginx,并保存相關(guān)信息。
taskkill /f /im nginx.exe > null 殺死nginx進(jìn)程
nginx.exe -s reload 修改配置文件后 重新啟動(dòng)ngnix
nginx -v
window 下Nginx開啟自動(dòng)啟動(dòng)
3.2 Linux 安裝
Linux 下的安裝目錄
[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í)目錄
3.2.1 Linux中tar.gz解壓安裝
先進(jìn)入自己想要安裝的目錄,一般是把壓縮包下載到/usr/local目錄下。cd /usr/local
第一步:下載nginx壓縮包 wget -c https://nginx.org/download/nginx-1.10.1.tar.gz 或 官網(wǎng) https://nginx.org/download/ 下載自己想要的版本 例如:“nginx-1.10.1.tar.gz” 。 第二步:配置nginx安裝所需的環(huán)境 # 安裝gcc
yum install gcc-c++
# 安裝PCRE pcre-devel
yum install -y pcre pcre-devel
# 安裝zlib
yum install -y zlib zlib-devel
# Open SSL
yum install -y openssl openssl-devel
第三步:將壓縮包進(jìn)行解壓 解壓指令:tar -zxvf nginx-1.10.1.tar.gz
# .tar.gz 格式解壓命令為 tar -zxvpf xx.tar.gz
# .tar.bz2 格式解壓命令為 tar -jxvpf xx.tar.bz2
第四步:安裝編譯 cd nginx-1.10.1
./configure # 支持ssl 執(zhí)行 ./configure --with-http_ssl_module
make
make install
第五步:安裝nginx # 執(zhí)行命令:make install。這時(shí)候返回上一級(jí)目錄,就會(huì)發(fā)現(xiàn)多了nginx目錄,接下來,啟動(dòng)nginx。
# 進(jìn)入/usr/local/nginx/sbin目錄,輸入./nginx即可啟動(dòng)nginx。
# 關(guān)閉nginx:
./nginx -s quit 或者 ./nginx -s stop
# 重啟nginx:
./nginx -s reload
# 查看nginx進(jìn)程:
ps aux|grep nginx
# 設(shè)置nginx開機(jī)啟動(dòng),只需在rc.local增加啟動(dòng)代碼即可:
vim /etc/rc.local 然后在底部增加 /usr/local/nginx/sbin/nginx。
# 進(jìn)入/usr/local/nginx/conf目錄可修改nginx的配置文件 -> vim nginx.conf
3.3 docker安裝
docker run -d --name nginx \
-v /home/xx/note:/usr/share/nginx/html/note \
-v /home/xx/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
-v /home/xx/nginx/conf.d:/etc/nginx/conf.d \
-v /home/xx/nginx/logs:/var/log/nginx/ \
-e LANG=C.UTF-8 \
-e LC_ALL=C.UTF-8 \
-p80:80 --privileged nginx
掛載的目錄文件需要提前創(chuàng)建好
1. 掛載項(xiàng)目地址
2. 掛載配置文件
3. 掛載子配置文件
4. 掛載日志
5. 修改編碼
docker stop nginx # 容器停止
docker rm -f nginx # 刪除容器
docker restart nginx # 重啟容器
# docker 容器中文件位置
日志位置:/var/log/nginx/
配置文件位置:/etc/nginx/
項(xiàng)目位置:/usr/share/nginx/html
nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
include /etc/nginx/conf.d/*.conf;
}
conf.d
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
location /api{
proxy_pass http://192.168.1.1:9999/api;
}
}
4. 命令
# window 環(huán)境
nginx.exe # 啟動(dòng)
nginx.exe -s reload # 重新載入配置文件
nginx.exe -s stop # 停止
# Linux 環(huán)境
nginx -h # 打開幫助信息
nginx -q # 檢測(cè)配置文件期間屏蔽非錯(cuò)誤信息
nginx -v # 查看版本
nginx -V # 查看版本 和 配置選項(xiàng)信息
nginx -t # 查看配置文件的路徑,配置文件是否有錯(cuò)誤,然后退出
nginx -s reload # 重新載入配置文件
nginx -s stop # 停止
nginx -s quit # 優(yōu)雅的停止
nginx -s reopen # 重啟
nginx -c filename # 設(shè)置配置文件(默認(rèn)是:/etc/nginx/nginx.conf)
ps -ef|grep nginx # 查看nginx 進(jìn)程號(hào)
killall nginx # 殺死所有的 nginx
# 查看nginx master work 進(jìn)程
ps -l ax | awk 'BEGIN {} NR==1 {print $0} /nginx/ {print $0}'
5. 配置
官網(wǎng)配置
5.1 配置規(guī)則簡(jiǎn)介
1)用 # 注解 2)每行結(jié)尾必須加上 ;號(hào) 3)如果配置項(xiàng)中包括nginx的語法符號(hào),例如空格,則必須使用單引號(hào)或者雙引號(hào)括起來 4)單位簡(jiǎn)寫:K或k(kiloByte, kb), M或m(MegaByte, MB), ms(毫秒), s(秒), m(分鐘), h(小時(shí)), d(天),w(周, 包含7天), M(月,包含30天), y(年,包含365天)
5.2 配置文件
5.2.1 完善的配置文件
# 運(yùn)行用戶 定義Nginx運(yùn)行的用戶和用戶組
user www-data;
# 啟動(dòng)進(jìn)程,通常設(shè)置成和cpu的數(shù)量相等
worker_processes 1;
# 全局錯(cuò)誤日志及PID文件
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
# 一個(gè)nginx進(jìn)程打開的最多文件描述符數(shù)目,理論值應(yīng)該是最多打開文件數(shù)(系統(tǒng)的值ulimit -n)與nginx進(jìn)程數(shù)相除,但是nginx分配請(qǐng)求并不均勻,所以建議與ulimit -n的值保持一致。
worker_rlimit_nofile 65535;
# 工作模式及連接數(shù)上限
events {
# epoll是多路復(fù)用IO(I/O Multiplexing)中的一種方式,但是僅用于linux2.6以上內(nèi)核,可以大大提高nginx的性能
use epoll; # [ kqueue | rtsig | epoll | /dev/poll | select | poll ]
# 單個(gè)后臺(tái)worker process進(jìn)程的最大并發(fā)鏈接數(shù)
worker_connections 1024;
# multi_accept on;
}
# 設(shè)定http服務(wù)器,利用它的反向代理功能提供負(fù)載均衡支持
http {
# 設(shè)定mime類型,類型由mime.type文件定義
include /etc/nginx/mime.types;
default_type application/octet-stream;
#charset utf-8; #默認(rèn)編碼
server_names_hash_bucket_size 128; #服務(wù)器名字的hash表大小
# 設(shè)定日志格式
access_log /var/log/nginx/access.log;
# sendfile 指令指定 nginx 是否調(diào)用 sendfile 函數(shù)(zero copy 方式)來輸出文件,對(duì)于普通應(yīng)用,
# 必須設(shè)為 on,如果用來進(jìn)行下載等應(yīng)用磁盤IO重負(fù)載應(yīng)用,可設(shè)置為 off,以平衡磁盤與網(wǎng)絡(luò)I/O處理速度,降低系統(tǒng)的uptime.
sendfile on;
#tcp_nopush on;
# 連接超時(shí)時(shí)間
# keepalive_timeout 0;
keepalive_timeout 65;
tcp_nodelay on;
# 開啟gzip壓縮
gzip on;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
# 設(shè)定請(qǐng)求緩沖 上傳文件大小限制
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
# 引入其它配置文件
# include /etc/nginx/conf.d/*.conf;
# include /etc/nginx/sites-enabled/*;
# 設(shè)定負(fù)載均衡的服務(wù)器列表
upstream mysvr {
#weigth參數(shù)表示權(quán)值,權(quán)值越高被分配到的幾率越大
#本機(jī)上的Squid開啟3128端口
server 192.168.8.1:3128 weight=5;
server 192.168.8.2:80 weight=1;
server 192.168.8.3:80 weight=6;
}
server {
# 偵聽80端口
listen 80;
#定義使用 www.xx.com訪問
server_name www.xx.com;
#設(shè)定本虛擬主機(jī)的訪問日志
access_log logs/www.xx.com.access.log main;
#默認(rèn)請(qǐng)求
location / {
#定義服務(wù)器的默認(rèn)網(wǎng)站根目錄位置
root /root;
#定義首頁(yè)索引文件的名稱
index index.php index.html index.htm;
fastcgi_pass www.xx.com;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
# 定義錯(cuò)誤提示頁(yè)面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /root;
}
#靜態(tài)文件,nginx自己處理
location ~ ^/(p_w_picpaths|javascript|js|css|flash|media|static)/ {
root /var/www/virtual/htdocs;
#過期30天,靜態(tài)文件不怎么更新,過期可以設(shè)大一點(diǎn),如果頻繁更新,則可以設(shè)置得小一點(diǎn)。
expires 30d;
}
#PHP 腳本請(qǐng)求全部轉(zhuǎn)發(fā)到 FastCGI處理. 使用FastCGI默認(rèn)配置
location ~ \.php$ {
root /root;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/www/www$fastcgi_script_name;
include fastcgi_params;
}
#設(shè)定查看Nginx狀態(tài)的地址
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file conf/htpasswd;
}
#禁止訪問 .htxxx 文件
location ~ /\.ht {
deny all;
}
}
}
5.2.1 簡(jiǎn)單的配置文件
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type text/html;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
server {
listen 80;
server_name localhost note.com 116.62.23.147;
index index.html;
location /note {
autoindex on;
autoindex_exact_size on;
autoindex_localtime on;
#add_header Content-Type charset=utf-8;
add_header Cache-Control no-store,no-cache;
#default_type text/html;
#index README.md;
alias /var/tmp/;
#root /var/tmp;
}
}
}
5.3 內(nèi)置變量
變量描述$args查詢字符串 a=1&b=2$arg_name請(qǐng)求行中name參數(shù)的值,$arg_a = 1 , $arg_b = 2$body_bytes_sent發(fā)送給客戶端文件內(nèi)容大小 1547 ,以字節(jié)計(jì),不包括http報(bào)頭$bytes_sent發(fā)給客戶端的數(shù)據(jù)大小,以字節(jié)計(jì)$cookie_nameCookie中名為name的值 $cookie_CA=abc, $cookie_CB=123$document_uri同$uri$http_x_forwarded_for記錄了代理過程$host等于$http_host$http_refererurl跳轉(zhuǎn)來源 https://www.baidu.com/$http_user_agent用戶終端瀏覽器等信息 "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SV1; GTB7.0; .NET4.0C;$http_cookie“Cookie”請(qǐng)求頭的值$http_host請(qǐng)求地址,即瀏覽器中你輸入的地址(IP或域名) www.it300.com$is_args表示請(qǐng)求中的URL是否帶參數(shù),如果帶參數(shù),$is_args值為"?"。如果不帶參數(shù),則是空字符串$proxy_host代理的host$proxy_port代理的端口$proxy_add_x_forwarded_for$proxy_add_x_forwarded_for變量包含客戶端請(qǐng)求頭中的"X-Forwarded-For",與$remote_addr兩部分,他們之間用逗號(hào)分開。$query_string同$args$request整個(gè)請(qǐng)求行,請(qǐng)求的URI和HTTP協(xié)議 “GET /article-10000.html HTTP/1.1”$remote_addr客戶端地址 211.28.65.253$remote_user客戶端用戶名稱$remote_port客戶端端口$request_time整個(gè)請(qǐng)求的總時(shí)間 0.205$request_method請(qǐng)求方法(如GET、POST)$request_uri完整的請(qǐng)求URI /nginx-var/request-line?a=1&b=2$statusHTTP請(qǐng)求狀態(tài) 200$ssl_protocolSSL協(xié)議版本 TLSv1$ssl_cipher交換數(shù)據(jù)中的算法 RC4-SHA$server_protocol請(qǐng)求協(xié)議(如HTTP/1.0 HTTP/1.1)$time_local訪問時(shí)間和時(shí)區(qū) 18/Jul/2012:17:00:01 +0800$uriURI,除去查詢字符串 /nginx-var/request-line$upstream_statusupstream狀態(tài) 200$upstream_addr后臺(tái)upstream的地址,即真正提供服務(wù)的主機(jī)地址 10.10.10.100:80$upstream_response_time請(qǐng)求過程中,upstream響應(yīng)時(shí)間 0.002$upstream_connect_time與upstream建立連接所消耗的時(shí)間(nginx做反向代理服務(wù)器時(shí)可用)$upstream_cache_status緩存命中狀態(tài)
參數(shù)介紹
5.4 重要配置概述
5.4.1 location
用于匹配請(qǐng)求地址
語法規(guī)則: location [=|~|~*|^~] /uri/ { … }
= 表示精確匹配~表示區(qū)分大小寫的正則匹配~* 表示不區(qū)分大小寫的正則匹配!~和!~*分別為區(qū)分大小寫不匹配及不區(qū)分大小寫不匹配 的正則^~ 開頭表示uri以某個(gè)常規(guī)字符串開頭,理解為匹配 url路徑即可。nginx不對(duì)url做編碼,因此請(qǐng)求為/static/20%/aa,可以被規(guī)則^~ /static/ /aa匹配到(注意是空格)。/ 通用匹配,任何請(qǐng)求都會(huì)匹配到。
匹配順序:
1:帶有“=“的精確匹配優(yōu)先 2:沒有修飾符的精確匹配 3:正則表達(dá)式按照他們?cè)谂渲梦募卸x的順序 4:帶有“^~”修飾符的,開頭匹配 5:帶有“~” 或“~*” 修飾符的,如果正則表達(dá)式與URI匹配 6:沒有修飾符的,如果指定字符串與URI開頭匹配
Location區(qū)段匹配示例
location = / {
# 只匹配 / 的查詢.
[ configuration A ]
}
location / {
# 匹配任何以 / 開始的查詢,但是正則表達(dá)式與一些較長(zhǎng)的字符串將被首先匹配。
[ configuration B ]
}
location ^~ /images/ {
# 匹配任何以 /images/ 開始的查詢并且停止搜索,不檢查正則表達(dá)式。
[ configuration C ]
}
location ~* \.(gif|jpg|jpeg)$ {
# 匹配任何以gif, jpg, or jpeg結(jié)尾的文件,但是所有 /images/ 目錄的請(qǐng)求將在Configuration C中處
理。
[ configuration D ]
} 各
請(qǐng)求的處理如下例:
/ → configuration A
/documents/document.html → configuration B
/images/1.gif → configuration C
/documents/1.jpg → configuration D
注意:在進(jìn)行路由規(guī)則的時(shí)候最好避免,adm,admin 這樣具有子集的規(guī)則。
5.4.2 proxy_pass
proxy_pass代理路徑"/“作用:僅看端口后面是否存在”/",存在則為絕對(duì)路徑,不存在則為相對(duì)路徑;
# 請(qǐng)求地址為 http://1.1.1.1:80/path/path1
location /path/ {
proxy_pass http://2.2.21.1:80/
}
# proxy_pass http://2.2.21.1:80 不加 / 表示相對(duì)路徑 請(qǐng)求將轉(zhuǎn)發(fā)到 http://2.2.21.1:80/path/path1
# proxy_pass http://2.2.21.1:80/ 加 / 表示絕對(duì)路徑 請(qǐng)求將轉(zhuǎn)發(fā)到 http://2.2.21.1:80/path1
# 請(qǐng)求地址為 http://1.1.1.1:80/path/path1
location /path/ {
proxy_pass http://2.2.21.1:80/path2
}
# proxy_pass http://2.2.21.1:80/path2 不加 / 表示絕對(duì)路徑 請(qǐng)求將轉(zhuǎn)發(fā)到http://2.2.21.1:80/path2path1
# proxy_pass http://2.2.21.1:80/path2/ 加 / 表示絕對(duì)路徑 請(qǐng)求將轉(zhuǎn)發(fā)到 http://2.2.21.1:80/path2/path1
注意: 在 location 使用正則表達(dá)式的時(shí)候,proxy_pass 后面是不能跟 / 的,否則報(bào)錯(cuò),正確的使用如 http://2.2.21.1:80
5.4.3 root 、alias
alias是一個(gè)目錄別名的定義,root則是最上層目錄的定義。
location /img/ {
alias /var/www/image/;
// 指定默認(rèn)頁(yè)面 可以有多個(gè) a.html, b.html會(huì)按照順序去尋找。
index index.html;
}
#若按照上述配置的話,則訪問/img/目錄里面的文件時(shí),ningx會(huì)自動(dòng)去/var/www/image/目錄找文件
location /img/ {
root /var/www/image;
}
#若按照這種配置的話,則訪問/img/目錄下的文件時(shí),nginx會(huì)去/var/www/image/img/目錄下找文件
5.4.4 proxy_set_heade
設(shè)置代理請(qǐng)求頭
location /etc-job/api/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://10.55.3.139:8088/api/;
proxy_cookie_path / /etc-job/api/;
proxy_set_header Cookie $http_cookie;
}
5.4.5 proxy_cookie_path
cookie 的 path 與地址欄上的 path 不一致, 瀏覽器就不會(huì)接受這個(gè) cookie,無法傳入 JSESSIONID 的 cookie, 導(dǎo)致登錄驗(yàn)證失敗。
proxy_cookie_path 的作用是用來改變cookie的路徑。主要用作服務(wù)器向?yàn)g覽器反饋時(shí)(修改response set-cookie的path屬性)
# path 就是你要替換的路徑(代理路徑) replacement 就是要替換的值(瀏覽器請(qǐng)求路徑)
proxy_cookie_path `path` `replacement`;
5.4.6 proxy_cookie_domain
proxy_cookie_domain 的作用是用來改變domain的路徑。主要用作服務(wù)器向?yàn)g覽器反饋時(shí)(修改response set-cookie的domain屬性, 該屬性不是必須的)。
# path 就是你要替換的 domian(domian) replacement 就是要替換的domain(瀏覽器請(qǐng)求domain)
proxy_cookie_path `path` `replacement`;
5.4.7 rewrite 重定向
rewrite
關(guān)鍵字 正則 替代內(nèi)容 flag標(biāo)記
# 關(guān)鍵字:其中關(guān)鍵字error_log不能改變
# 正則:perl兼容正則表達(dá)式語句進(jìn)行規(guī)則匹配
# 替代內(nèi)容:將正則匹配的內(nèi)容替換成replacement
# flag標(biāo)記:rewrite支持的flag標(biāo)記
flag標(biāo)記說明:
last #本條規(guī)則匹配完成后,繼續(xù)向下匹配新的location URI規(guī)則
break #本條規(guī)則匹配完成即終止,不再匹配后面的任何規(guī)則
redirect #返回302臨時(shí)重定向,瀏覽器地址會(huì)顯示跳轉(zhuǎn)后的URL地址
permanent #返回301永久重定向,瀏覽器地址欄會(huì)顯示跳轉(zhuǎn)后的URL地址
字符描述\將后面接著的字符標(biāo)記為一個(gè)特殊字符或一個(gè)原義字符或一個(gè)向后引用。如“\n”匹配一個(gè)換行符,而“$”則匹配“$”^匹配輸入字符串的起始位置$匹配輸入字符串的結(jié)束位置*匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”+匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“oll”,但不能匹配“o”?匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,“?“等效于”{0,1}”.匹配除“\n”之外的任何單個(gè)字符,若要匹配包括“\n”在內(nèi)的任意字符,請(qǐng)使用諸如“[.\n]”之類的模式。(pattern)匹配括號(hào)內(nèi)pattern并可以在后面獲取對(duì)應(yīng)的匹配,常用$0…$9屬性獲取小括號(hào)中的匹配內(nèi)容,要匹配圓括號(hào)字符需要Content
rewrite參數(shù)的標(biāo)簽段位置:
server,location,if
rewrite ^/(.*) http://www.lidasoft.cc/$1 permanent;
server {
# 訪問 /last.html 的時(shí)候,頁(yè)面內(nèi)容重寫到 /index.html 中,并繼續(xù)后面的匹配,瀏覽器地址欄URL地址不變
rewrite /last.html /index.html last;
# 訪問 /break.html 的時(shí)候,頁(yè)面內(nèi)容重寫到 /index.html 中,并停止后續(xù)的匹配,瀏覽器地址欄URL地址不變;
rewrite /break.html /index.html break;
# 訪問 /redirect.html 的時(shí)候,頁(yè)面直接302定向到 /index.html中,瀏覽器地址URL跳為index.html
rewrite /redirect.html /index.html redirect;
# 訪問 /permanent.html 的時(shí)候,頁(yè)面直接301定向到 /index.html中,瀏覽器地址URL跳為index.html
rewrite /permanent.html /index.html permanent;
# 把 /html/*.html => /post/*.html ,301定向
rewrite ^/html/(.+?).html$ /post/$1.html permanent;
# 把 /search/key => /search.html?keyword=key
rewrite ^/search\/([^\/]+?)(\/|$) /search.html?keyword=$1 permanent;
# 把當(dāng)前域名的請(qǐng)求,跳轉(zhuǎn)到新域名上,域名變化但路徑不變
rewrite ^/(.*) http://www.jd.com/$1 permanent;
# 將訪問 /api/note/ 的圖片重定向訪問 /note/下的圖像
rewrite ^/api/note/(.*)\.(gif|jpg|jpeg|png)$ /note/$1.$2 last;
}
5.4.8 try_files
try_files是nginx中http_core核心模塊所帶的指令,主要是能替代一些rewrite的指令,提高解析效率。
可應(yīng)用的上下文:server,location 段
location /images/ {
root /opt/html/;
try_files $uri $uri/ /images/default.gif;
}
比如 請(qǐng)求 127.0.0.1/images/test.gif 會(huì)依次查找
1.文件/opt/html/images/test.gif
2.文件夾 /opt/html/images/test.gif/下的index文件
3. 請(qǐng)求127.0.0.1/images/default.gif
* 都找不到 會(huì)進(jìn)行一個(gè)內(nèi)部重定向到最后一個(gè)參數(shù)。
備注: try-files 如果不寫上 $uri/,當(dāng)直接訪問一個(gè)目錄路徑時(shí),并不會(huì)去匹配目錄下的索引頁(yè) 即 訪問127.0.0.1/images/ 不會(huì)去訪問 127.0.0.1/images/index.html
nginx部署使用history模式的vue項(xiàng)目詳細(xì)配置
5.4.9 日志
log_format main '[$time_local] 接收到來自 $remote_addr 的請(qǐng)求 【$request】 請(qǐng)求結(jié)果是 【$status】花費(fèi)了【$request_time】,請(qǐng)求被 [$upstream_addr] 處理了,結(jié)果是 [$upstream_status] 。附加信息,referer: [$http_referer] ;
$remote_addr:與 $http_x_forwarded_for 用以記錄客戶端的ip地址;
$remote_user:用來記錄客戶端用戶名稱;
$time_local:用來記錄訪問時(shí)間與時(shí)區(qū);
$request:用來記錄請(qǐng)求的http的方式與url;
$request_time:用來記錄請(qǐng)求時(shí)間;
$status:用來記錄請(qǐng)求狀態(tài);成功是200,
$body_bytes_sent:記錄發(fā)送給客戶端文件主體內(nèi)容大??;
$http_referer:用來記錄從那個(gè)頁(yè)面鏈接訪問過來的;
$http_user_agent:記錄客戶瀏覽器的相關(guān)信息。
5.4.10 正則表達(dá)式
^ :匹配輸入字符串的起始位置
$ :匹配輸入字符串的結(jié)束位置
* :匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”
+ :匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o”
? :匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}”
. :匹配除“\n”之外的任何單個(gè)字符,若要匹配包括“\n”在內(nèi)的任意字符,請(qǐng)使用諸如“[.\n]”之類的模式
\ :將后面接著的字符標(biāo)記為一個(gè)特殊字符或一個(gè)原義字符或一個(gè)向后引用。如“\n”匹配一個(gè)換行符,而“\$”則匹配“$”
\d :匹配純數(shù)字
{n} :重復(fù) n 次
{n,} :重復(fù) n 次或更多次
{n,m} :重復(fù) n 到 m 次
[] :定義匹配的字符范圍
[c] :匹配單個(gè)字符 c
[a-z] :匹配 a-z 小寫字母的任意一個(gè)
[a-zA-Z0-9] :匹配所有大小寫字母或數(shù)字
(a|b|c) :多選一
| :或運(yùn)算符
location ~ \.(gif|jpg|jpeg)$ {}
location ~ ^/[admin|screen|auth]/ {}
location ~ ^/Cesium.*\.(css|js|ico|gif|jpg|jpeg|png|json|wasm)$ {}
5.5 配置案例
5.5.1 log format配置
log_format main '[$time_local] $remote_addr-$remote_user $request $query_string $http_referer [$status] rtime:[$request_time] [$upstream_status] uptime:[$upstream_response_time]';
5.5.2 文件目錄展示配置
ngx_http_autoindex_module 模塊提供了目錄的功能。
該模塊有以下幾個(gè)命令:
命令默認(rèn)值值域作用域EGautoindexoffon:開啟目錄瀏覽; off:關(guān)閉目錄瀏覽http, server, locationautoindex on;打開目錄瀏覽功能autoindex_formathtmlhtml、xml、json、jsonp 分別用這幾個(gè)風(fēng)格展示目錄http, server, locationautoindex_format html; 以網(wǎng)頁(yè)的風(fēng)格展示目錄內(nèi)容。該屬性在1.7.9及以上適用autoindex_exact_sizeonon:展示文件字節(jié)數(shù); off:以可讀的方式顯示文件大小http, server, locationautoindex_exact_size off; 以可讀的方式顯示文件大小,單位為 KB、MB 或者 GB,autoindex_format為html時(shí)有效autoindex_localtimeoffon、off:是否以服務(wù)器的文件時(shí)間作為顯示的時(shí)間http, server, locationautoindex_localtime on; 以服務(wù)器的文件時(shí)間作為顯示的時(shí)間,autoindex_format為html時(shí)有效
location /download {
root /home/map/www; #指定目錄所在路徑
autoindex on; #開啟目錄瀏覽
autoindex_format html; #以html風(fēng)格將目錄展示在瀏覽器中
autoindex_exact_size off; #切換為 off 后,以可讀的方式顯示文件大小,單位為 KB、MB 或者 GB
autoindex_localtime on; #以服務(wù)器的文件時(shí)間作為顯示的時(shí)間
charset utf-8,gbk; #展示中文文件名
}
5.5.3 文件類型添加
# 容器內(nèi) vim 安裝
apt-get update && apt-get install vim
# 在nginx 的mime.types 文件中
vi /usr/local/nginx/conf/mime.types
# 添加對(duì)應(yīng)的文件類型 可以使得要下載的問價(jià)已另一種文件類型展示
text/markdown md;
5.5.4 負(fù)載均衡
upstream 模塊進(jìn)行配置,proxy_pass 使用upstream配置的名稱
upstream
upstream test {
ip_hash;
server 192.168.0.1 [parameters];
server 192.168.0.2 [parameters];
}
# 使用
proxy_pass http://test;
負(fù)載均衡策略
輪詢 : 默認(rèn) weigth : 權(quán)重 ip_hash : ip的hash結(jié)果分配 least_conn : 最少連接方式 fair(第三方): 服務(wù)器響應(yīng)時(shí)間,時(shí)間段優(yōu)先分配 url_hash(第三方) :url的hash來分配 有利于緩存
parameters
配置塊名稱作用weight默認(rèn)為1,weight越大代表權(quán)重越大,接受請(qǐng)求的比例為 權(quán)重/權(quán)重之和max_conns限制分配給某臺(tái)server的最大連接數(shù),超過這個(gè)數(shù)量,將不再分配鏈接給它,默認(rèn)為0,表示不限制max_fails默認(rèn)為1,某臺(tái)server允許請(qǐng)求失敗的次數(shù),超過最大次數(shù)后,在fail_timeout時(shí)間內(nèi),新的請(qǐng)求不會(huì)分配給這個(gè)機(jī)子fail_timeout默認(rèn)為10秒,配合max_fails使用backup其它所有的非backup機(jī)器down或者忙的時(shí)候,請(qǐng)求backup機(jī)器down表示當(dāng)前的server不參與負(fù)載
5.5.5 緩存配置
詳細(xì)緩存參數(shù)參照
默認(rèn)情況下,NGINX尊重Cache-Control源服務(wù)器的標(biāo)頭。它不緩存響應(yīng)Cache-Control設(shè)置為Private,No-Cache或No-Store或Set-Cookie在響應(yīng)頭。NGINX只緩存GET和HEAD客戶端請(qǐng)求。
# 定義緩存區(qū)域
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=name:50m inactive=10m max_size=1g;
參數(shù)作用proxy_cache_path緩存文件路徑,其中文件名是 cache_key 的md5值levels表示緩存目錄下的層級(jí)目錄結(jié)構(gòu),它是根據(jù)hash后的請(qǐng)求url地址創(chuàng)建的,目錄名稱從hash后的字符串結(jié)尾處開始截取。假設(shè)hash是asdadas7ef,則levels=1:2 表示第一層子目錄的名稱是長(zhǎng)度為1的字符串f,第二層是長(zhǎng)度為2的字符串7ekeys_zone指定緩存區(qū)名稱及共享內(nèi)存大小,在共享內(nèi)存中設(shè)置一塊存儲(chǔ)區(qū)域來存放緩存的key和metadata(類似使用次數(shù)),這樣nginx可以快速判斷一個(gè)request是否命中或者未命中緩存,1m可以存儲(chǔ)8000個(gè)keyinactive表示主動(dòng)清空在指定時(shí)間內(nèi)未被訪問的緩存,10m代表10分鐘max_size最大cache磁盤空間,如果不指定,會(huì)使用掉所有的disk space, 當(dāng)達(dá)到配額后,會(huì)刪掉最少使用的cahce文件
location / {
proxy_pass http://1.0.2.3:80;
# 緩存使用前面定義的內(nèi)存區(qū)域
proxy_cache xxx;
proxy_ignore_headers Expires Set-Cookie;
# proxy_ignore_headers可以配置忽略 Cache-Control:
# proxy_ignore_headers Cache-Control;
# 對(duì)于200和304的響應(yīng)碼應(yīng)該進(jìn)行緩存 過期時(shí)間為1分鐘 該設(shè)置會(huì)覆蓋前面的10分鐘的設(shè)置
# proxy_buffering 默認(rèn)為on,若proxy_buffering設(shè)置為off,則NGINX不會(huì)緩存響應(yīng)。
proxy_cache_valid 200 302 1m;
# 設(shè)置緩存的key
proxy_cache_key $host$uri$is_args$args;
# 再返回的響應(yīng)里 添加響應(yīng)頭 X-Proxy-Cache, 其值表示是否命中了緩存
add_header X-Proxy-Cache $upstream_cache_status;
}
狀態(tài)含義proxy_cache定義的共享內(nèi)存區(qū)域名稱proxy_cache_key緩存key的組合規(guī)則proxy_cache_valid對(duì)于不同的http狀態(tài)碼進(jìn)行不同的緩存設(shè)置proxy_set_header自定義http header 頭,用于發(fā)送后端真實(shí)服務(wù)器add_header響應(yīng)數(shù)據(jù)給客戶端時(shí),需要添加的頭信息
$upstream_cache_status 可以返回的緩存狀態(tài)
狀態(tài)含義MISS未命中緩存,請(qǐng)求真實(shí)服務(wù)器HIT命中緩存EXPIRED正在更新緩存,使用舊的應(yīng)答B(yǎng)YPASS緩存被繞過了(可以通過proxy_cache_bypass 指定配置)STALE無法從后端服務(wù)更新緩存,返回了舊的緩存內(nèi)容(可以通過proxy_cache_use_stale配置)UPDATING內(nèi)容過期了,因?yàn)橄鄬?duì)于之前的請(qǐng)求,響應(yīng)的入口(entry)已經(jīng)更新,并且proxy_cache_use_stale 的updating已經(jīng)被設(shè)置REVALIDATED啟用proxy_chache_revalidate指令后,當(dāng)緩存內(nèi)容過期,nginx通過一次If-Meodified-Since的請(qǐng)求頭去驗(yàn)證緩存內(nèi)容是否過期,此時(shí)會(huì)返回該狀態(tài)。
5.5.6 gzip靜態(tài)資源壓縮配置
瀏覽器發(fā)送請(qǐng)求時(shí),通過Accept-Encoding說明可以接受的壓縮方式;服務(wù)器接收到請(qǐng)求,使用Accept-Encoding中的一種對(duì)響應(yīng)數(shù)據(jù)進(jìn)行壓縮;服務(wù)器返回?cái)?shù)據(jù),在Content-Encoding中指明使用的壓縮方式;瀏覽器獲取響應(yīng)數(shù)據(jù),使用Content-Encoding對(duì)結(jié)構(gòu)進(jìn)行解析。
命令說明默認(rèn)值gzip on/off;開啟/關(guān)閉gzip壓縮offgzip_min_length 1k;# 啟用gzip壓縮的最小文件;小于設(shè)置值的文件將不會(huì)被壓縮0kgzip_buffers 4 16k;系統(tǒng)獲取幾個(gè)單位的緩存用于存儲(chǔ)gzip的壓縮結(jié)果數(shù)據(jù)流,4 16k 代表以16k為單位,按照原始數(shù)據(jù)大小以16k為單位的4倍申請(qǐng)內(nèi)存gzip_http_version 1.1;設(shè)置http1.1協(xié)議才進(jìn)行壓縮默認(rèn)為1.1gzip_comp_level 3;表示gzip的壓縮級(jí)別,范圍是1-9,數(shù)據(jù)越大,壓縮的越小,耗CPU,傳輸更快,一般選擇適中的級(jí)別默認(rèn)為1gzip_types text/plain application/javascript …;設(shè)置哪種類型可以進(jìn)行壓縮,需要什么類型可以參考nginx.conf同目錄下的mime.types文件默認(rèn)是text/htmlgzip_disable “MSIE [1-6].”;禁用gzip的條件,這里表示禁用IE1-6的版本,因?yàn)榈桶姹静恢С謌zipgzip_vary on;如果啟用壓縮,是否在響應(yīng)報(bào)文首部插入"Vary: Accept-Encoding",建議開啟該參數(shù),讓用戶知道服務(wù)器是支持壓縮功能的
# 開啟gzip
gzip on;
# 啟用gzip壓縮的最小文件;小于設(shè)置值的文件將不會(huì)被壓縮
gzip_min_length 1k;
# gzip 壓縮級(jí)別 1-10
gzip_comp_level 3;
# 進(jìn)行壓縮的文件類型。
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;
# 是否在http header中添加Vary: Accept-Encoding,建議開啟
gzip_vary on;
5.5.7 nginx跨域配置
1995年,同源政策由 Netscape 公司引入瀏覽器。目前,所有瀏覽器都實(shí)行這個(gè)政策。 最初,它的含義是指,A網(wǎng)頁(yè)設(shè)置的 Cookie,B網(wǎng)頁(yè)不能打開,除非這兩個(gè)網(wǎng)頁(yè)"同源"。所謂"同源"指的是"三個(gè)相同"。
協(xié)議相同域名相同端口相同
舉例來說,http://www.example.com/dir/page.html這個(gè)網(wǎng)址, 協(xié)議是http://,域名是www.example.com,端口是80(默認(rèn)端口可以省略)。它的同源情況如下:
http://www.example.com/dir2/other.html: 同源http://example.com/dir/other.html: 不同源(域名不同)http://v2.www.example.com/dir/other.html:不同源(域名不同)http://www.example.com:81/dir/other.html:不同源(端口不同)
跨域解決方式描述方式一jsonp數(shù)據(jù)格式,前后端配合改造跨域方式二后端方法增加@CrossOrigin注解完成跨域方式三后端增加跨域配置類完成跨域方式四nginx同時(shí)反向代理請(qǐng)求、目標(biāo)訪問地址,完成跨域方式五nginx代理目標(biāo)訪問地址增加跨域配置詳情請(qǐng)參考案例路徑:案例/nginx跨域測(cè)試用例-2021-12-02.doc
#允許跨域請(qǐng)求的域,* 代表所有
add_header 'Access-Control-Allow-Origin' *;
#允許請(qǐng)求的header
add_header 'Access-Control-Allow-Headers' *;
#允許帶上cookie請(qǐng)求
add_header 'Access-Control-Allow-Credentials' 'true';
#允許請(qǐng)求的方法,比如 GET,POST,PUT,DELETE
add_header 'Access-Control-Allow-Methods' *;
# 表示請(qǐng)求頭的字段 動(dòng)態(tài)獲取
add_header Access-Control-Allow-Headers $http_access_control_request_headers;
# 預(yù)檢命令的緩存,如果不緩存每次會(huì)發(fā)送兩次請(qǐng)求
add_header Access-Control-Max-Age 3600;
5.5.8 SSL 配置
# 全局配置
ssl_certificate cert/server.crt
ssl_certificate_key cert/server.key;
server {
listen 443;
server_name www.domain.com; # 用戶服務(wù)器的域名
ssl on; # 設(shè)置為“on”,啟用SSL功能。
ssl_certificate cert/server.crt # 證書文件“server.crt”。
ssl_certificate_key cert/server.key; # 私鑰文件“server.key”。
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 使用的協(xié)議。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; # 配置加密套件,寫法遵循OpenSSL標(biāo)準(zhǔn)。
ssl_prefer_server_ciphers on;
location / {
root html; #站點(diǎn)目錄
index index.html index.htm;
}
}
# http 跳轉(zhuǎn) https
server {
listen 80;
server_name www.domain.com;
rewrite ^(.*)$ https://$host$1 permanent;
}
5.5.8.1 自簽發(fā)證書生成
默認(rèn)linux 都會(huì)已經(jīng)安裝了 openssl
# 查看openssl版本信息
openssl version -a
使用openssl創(chuàng)建服務(wù)器私鑰,輸入相應(yīng)提示的信息
#(server是自己定義的)
# 可選1024 和 2048
# 提示輸入兩次密碼
openssl genrsa -des3 -out server.key 2048
# 密碼:123pa
# 密碼:123pa
創(chuàng)建證書簽名請(qǐng)求
openssl req -new -key server.key -out server.csr
--------------------------------------------------------------------
Enter pass phrase for server.key: # 123pa
-----
Country Name (2 letter code) [AU]:cn # 國(guó)名
State or Province Name (full name) [Some-State]:guangdong # 省名
Locality Name (eg, city) []:guangzhou # 城市名
Organization Name (eg, company) [Internet Widgits Pty Ltd]:grg # 機(jī)構(gòu)名
Organizational Unit Name (eg, section) []:grg # 單位名
Common Name (e.g. server FQDN or YOUR name) []:rootcl # 通用名
Email Address []:1065205727@qq.com # 郵件地址
A challenge password []:rootcl # 挑戰(zhàn)密碼
An optional company name []:grg # 可選的公司名
cp server.key server.key.org
rm server.key
openssl rsa -in server.key.org -out server.key
使用剛生成的私鑰和CSR進(jìn)行證書簽名
openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
即 server.crt server.key 可以配置到nginx供使用
5.5.9 websocket 配置
location ^~/socket.io/ {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://172.20.0.5:8809/socket.io/;
}
# 如果 $http_upgrade 不為空 那么$connection_upgrade 就是 upgrade
# 如果 $http_upgrade 為空 那么$connection_upgrade 就是 close
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
# 兩臺(tái)服務(wù)器 (ip1:port1)和(ip2:port2) 。
# keepalive 1000 表示的是每個(gè)nginx進(jìn)程中上游服務(wù)器保持的空閑連接,當(dāng)空閑連接過多時(shí),會(huì)關(guān)閉最少使用的空閑連接.當(dāng)然,這不是限制連接總數(shù)的,可以想象成空閑連接池的大小,設(shè)置的值應(yīng)該是上游服務(wù)器能夠承受的。
upstream wsbackend{
server ip1:port1;
server ip2:port2;
keepalive 1000;
}
server {
# 表示 nginx 監(jiān)聽的端口
listen 20038;
# 表示監(jiān)聽的路徑(/表示所有路徑,通用匹配,相當(dāng)于default)
location /{
# 表示反向代理發(fā)送的HTTP協(xié)議的版本是1.1,HTTP1.1支持長(zhǎng)連接
proxy_http_version 1.1;
# 表示反向代理的uri,這里可以使用負(fù)載均衡變量
proxy_pass http://wsbackend;
# 表示不要替換路徑,其實(shí)這里如果是/則有沒有都沒關(guān)系,因?yàn)閐efault也是將路徑替換到proxy_pass的后邊
proxy_redirect off;
# 表示傳遞時(shí)請(qǐng)求頭不變,host是nginx內(nèi)置變量,表示的是當(dāng)前的請(qǐng)求頭,
proxy_set_header Host $host;
# 表示傳遞時(shí)來源的ip還是現(xiàn)在的客戶端的ip
proxy_set_header X-Real-IP $remote_addr;
# 表的兩次請(qǐng)求之間的間隔超過 3600s 后才關(guān)閉這個(gè)連接,默認(rèn)的60s,自動(dòng)關(guān)閉的元兇
proxy_read_timeout 3600s;
# 表示X-Forwarded-For頭不發(fā)生改變
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 表示設(shè)置Upgrade不變
proxy_set_header Upgrade $http_upgrade;
# 表示如果http_upgrade為upgrade,則請(qǐng)求為upgrade(websocket),如果不是,就關(guān)閉連接
proxy_set_header Connection $connection_upgrade;
}
}
5.5.10 文件大小
nginx 默認(rèn)允許上傳的文件大小為 1M 否則就報(bào)錯(cuò)。
# 說明上傳的文件太大(nginx 默認(rèn)允許文件上傳的大小為 1M)
413 Request Entity Too Large
在 nginx 中,調(diào)整上傳文件只需要配置如下參數(shù):
client_max_body_size: 表示客戶端請(qǐng)求服務(wù)器最大允許大小 client_max_body_size 默認(rèn) 1M,表示客戶端請(qǐng)求服務(wù)器最大允許大小,在 “Content-Length” 請(qǐng)求頭中指定。如果請(qǐng)求的正文數(shù)據(jù)大于 client_max_body_size,HTTP 協(xié)議會(huì)報(bào)錯(cuò) 413 Request Entity Too Large。就是說如果請(qǐng)求的正文大client_max_body_size,一定是失敗的。如果需要上傳大文件,一定要修改該值。 client_body_buffer_size: 表示 nginx 分配給請(qǐng)求數(shù)據(jù)的 Buffer 大小 nginx 分配給請(qǐng)求數(shù)據(jù)的 Buffer 大小,如果請(qǐng)求的數(shù)據(jù)小于 client_body_buffer_size 直接將數(shù)據(jù)先在內(nèi)存中存儲(chǔ)。如果請(qǐng)求的值大于 client_body_buffer_size 小于 client_max_body_size,就會(huì)將數(shù)據(jù)先存儲(chǔ)到臨時(shí)文件中,在哪個(gè)臨時(shí)文件中呢? client_body_temp 指定的路徑中,默認(rèn)該路徑值是 /tmp/。 所以配置的 client_body_temp 地址,一定讓執(zhí)行的 nginx 的用戶組有讀寫權(quán)限。否則,當(dāng)傳輸?shù)臄?shù)據(jù)大于 client_body_buffer_size,寫進(jìn)臨時(shí)文件失敗會(huì)報(bào)錯(cuò)。
server {
listen 8080;
server_name localhost;
# 修改文件大小限制為 50m,默認(rèn)1m
client_max_body_size 50m;
# 修改分配給請(qǐng)求數(shù)據(jù)的 Buffer 大小為 1m
client_body_buffer_size 1m;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
5.6 成功的配置信息參照
5.6.1 案例1
# 開啟gzip
gzip on;
# 啟用gzip壓縮的最小文件;小于設(shè)置值的文件將不會(huì)被壓縮
gzip_min_length 1k;
# gzip 壓縮級(jí)別 1-10
gzip_comp_level 3;
# 進(jìn)行壓縮的文件類型。
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;
# 是否在http header中添加Vary: Accept-Encoding,建議開啟
gzip_vary on;
ssl_certificate /etc/nginx/cert/grg.crt; # 證書文件"server.crt"。
ssl_certificate_key /etc/nginx/cert/grg.key; # 私鑰文件"server.key"。
client_max_body_size 1G;
server {
listen 443 ssl default deferred;
server_name localhost 127.0.0.1 proj.imeeting.grgbanking.com;
ssl on;
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
ssl_prefer_server_ciphers on;
rewrite ^/token/logout /token/logout;
rewrite ^/oauth/token /oauth/token;
location / {
try_files $uri $uri/ /index.html last;
root /usr/share/nginx/html/dist;
}
location /token/logout {
proxy_pass http://172.18.0.7:8849;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /oauth/token {
proxy_pass http://172.18.0.7:8849;
proxy_read_timeout 90;
proxy_set_header X-Forwarded-Host $host:$server_port;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
}
location ^~/admin/ {
proxy_pass http://172.18.0.6:8801/admin/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location ^~/socket.io/ {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://172.18.0.8:9809/socket.io/;
}
location ^~/chat/ {
proxy_pass http://172.18.0.8:9808/chat/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /bd{
proxy_pass http://www.baidu.com/;
}
}
# 所有的http 請(qǐng)求都將被轉(zhuǎn)發(fā)到https 請(qǐng)求
server {
listen 80;
server_name localhost 127.0.0.1 proj.imeeting.grgbanking.com;
rewrite ^(.*)$ https://$host$1 permanent;
}
8. open Resty
9. 問題收集
1. 出現(xiàn)403問題的原因
directory index of “xxx” is forbidden
訪問的資源不是一個(gè)具體的文件,alias /gs/grg_admin/admin/ 此時(shí)未指定 index
可以添加 autoindex on; # 自動(dòng)索引
導(dǎo)致無限重定向的問題
2. Nginx文件直接下載改為網(wǎng)頁(yè)打開
# nginx 默認(rèn) 會(huì)有下面配置
include mime.types; # 自動(dòng)匹配文件的類型 在nginx中會(huì)有個(gè) mime.types的文件的
default_type application/octet-stream; # mime類型不存在 會(huì)使用該類型 默認(rèn)的 直接提交一個(gè)二進(jìn)制
# 所以可以再 mime.types 中添加自己的文件類型對(duì)應(yīng)的 content-type
# 若找不到 也可以以 text/html 的形式打開
3、nginx代理后,應(yīng)用上傳文件時(shí),發(fā)現(xiàn)小文件可上傳,大文件上傳不了
當(dāng)代理文件大小超過配置的proxy_temp_file_write_size值時(shí),nginx會(huì)將文件寫入到臨時(shí)目錄下,(默認(rèn)為/nginx/nginx-prefix/client_body_temp/)作為緩存,解決方案:給當(dāng)前目錄賦對(duì)應(yīng)權(quán)限即可。
4. 502 Bad Gateway
當(dāng)代理 (proxy_pass) 的 ip 地址無法訪問的時(shí)候會(huì)出現(xiàn)此錯(cuò)誤,代理 ip 為127.0.0.1
5. 504 Gateway Time-out
當(dāng)代理 (proxy_pass) 的 ip 地址無法訪問的時(shí)候會(huì)出現(xiàn)此錯(cuò)誤,代理 ip ping 不通,
6. the “ssl” directive is deprecated, use the “l(fā)isten … ssl”
server {
listen 443 ssl;
}
如果listen 有ssl, 刪除ssl on即可。
7. [emerg] “proxy_pass” cannot have URI part in
nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block in /etc/nginx/conf.d/proj.conf:33
因?yàn)閘ocation 使用了正則表達(dá)式
錯(cuò)誤的:
location ~ /(admin|screen|auth)/* {
proxy_pass http://cl-gateway:9999/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
正確的:
location ~ /(admin|screen|auth)/* {
proxy_pass http://cl-gateway:9999;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
柚子快報(bào)邀請(qǐng)碼778899分享:運(yùn)維 Nginx
好文鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。