欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Nginx?簡(jiǎn)介、安裝與配置文件詳解

 更新時(shí)間:2024年04月17日 09:38:15   作者:橙子家  
Nginx是一款輕量級(jí)和高性能的?Web?服務(wù)器、反向代理服務(wù)器、電子郵件(IMAP/POP3/SMTP)代理服務(wù)器,是帶有?BSD-like?協(xié)議的開(kāi)源產(chǎn)品,這篇文章主要介紹了Nginx?簡(jiǎn)介、安裝與配置文件詳解,需要的朋友可以參考下

〇、前言

在日常工作中,Nginx 的重要性當(dāng)然不言而喻。

經(jīng)常用,但并不意味著精通,還會(huì)有很多不清楚的方式和技巧,那么本文就簡(jiǎn)單匯總下,幫助自己理解。

一、Nginx 簡(jiǎn)介

1.1 關(guān)于 Nginx

Nginx(發(fā)音為“Engine X”)是一款輕量級(jí)和高性能的 Web 服務(wù)器、反向代理服務(wù)器、電子郵件(IMAP/POP3/SMTP)代理服務(wù)器,是帶有 BSD-like 協(xié)議的開(kāi)源產(chǎn)品。

另外,關(guān)于 BSD-like 協(xié)議,它為開(kāi)發(fā)者和企業(yè)提供了極大的靈活性,在確保尊重原作者工作的同時(shí),允許代碼的自由流通和使用,無(wú)論是在開(kāi)源社區(qū)還是商業(yè)應(yīng)用中。

其特點(diǎn)包括:

  • 輕量級(jí):Nginx 以其輕量級(jí)和高效性而聞名,對(duì)系統(tǒng)資源的占用非常??;
  • 高并發(fā)能力:Nginx 能夠處理大量的并發(fā)連接,這使得它在面對(duì)高流量網(wǎng)站時(shí)表現(xiàn)出色,在同類 Web 服務(wù)器中是領(lǐng)先的;
  • 反向代理功能:作為反向代理服務(wù)器,Nginx 可以幫助提高網(wǎng)站的響應(yīng)速度和可用性,同時(shí)隱藏后端服務(wù)器的復(fù)雜性,這使得 Nginx 在負(fù)載均衡和緩存方面非常有用;
  • 社區(qū)支持:作為一個(gè)開(kāi)源項(xiàng)目,Nginx 擁有一個(gè)活躍的開(kāi)發(fā)者和用戶社區(qū),這意味著它經(jīng)常得到更新和改進(jìn),以適應(yīng)不斷變化的網(wǎng)絡(luò)環(huán)境;
  • 安全性:Nginx 提供了多種安全措施,包括 SSL/TLS 加密支持,以及限制請(qǐng)求速率等,幫助網(wǎng)站防御各種網(wǎng)絡(luò)攻擊;
  • 廣泛應(yīng)用:全球范圍內(nèi),許多知名的大型網(wǎng)站和服務(wù)都在使用 Nginx,這證明了它的可靠性和性能。

Nginx 是基于 C 語(yǔ)言開(kāi)發(fā)的,擁有高性能的基本保證。

1.2 相關(guān)概念簡(jiǎn)介

1.2.1 正向代理和反向代理

正向代理主要是為了客戶端服務(wù),而反向代理則是為了服務(wù)器端的服務(wù)優(yōu)化和安全考慮,都可以明顯提高數(shù)據(jù)傳輸?shù)男?。它們的特點(diǎn)如下:

正向代理(Forward Proxy):

  • 位于客戶端和目標(biāo)服務(wù)器之間,主要用途是代替客戶端訪問(wèn)外部網(wǎng)絡(luò),隱藏客戶端的真實(shí)IP地址,提高訪問(wèn)速度,突破訪問(wèn)控制等。
  • 客戶端主動(dòng)使用代理服務(wù)器,服務(wù)端不知道實(shí)際發(fā)起請(qǐng)求的客戶端
  • 常用于公司內(nèi)部網(wǎng)絡(luò),通過(guò)一個(gè)或多個(gè)代理服務(wù)器訪問(wèn)互聯(lián)網(wǎng)資源,以節(jié)省帶寬、提高訪問(wèn)速度或進(jìn)行內(nèi)容過(guò)濾。 

  由于防火墻的原因,我們并不能直接訪問(wèn)谷歌,那么我們可以借助 VPN 來(lái)實(shí)現(xiàn),這就是一個(gè)簡(jiǎn)單的正向代理的例子。這里你能夠發(fā)現(xiàn),正向代理“代理”的是客戶端,而且客戶端是知道目標(biāo)的,而目標(biāo)是不知道客戶端是通過(guò) VPN 訪問(wèn)的。

反向代理(Reverse Proxy):

  • 位于服務(wù)器端和客戶端之間,主要用于服務(wù)器端的負(fù)載均衡、緩存靜態(tài)內(nèi)容、加密和SSL加速、安全防護(hù)等。
  • 服務(wù)器主動(dòng)使用代理服務(wù)器,客戶端不知道實(shí)際提供服務(wù)的服務(wù)端。
  • 常用于網(wǎng)站后端,將客戶端的請(qǐng)求轉(zhuǎn)發(fā)到內(nèi)部服務(wù)器,然后將響應(yīng)返回給客戶端,對(duì)外表現(xiàn)為統(tǒng)一的服務(wù)地址

  

  當(dāng)我們?cè)谕饩W(wǎng)訪問(wèn)百度的時(shí)候,其實(shí)會(huì)進(jìn)行一個(gè)轉(zhuǎn)發(fā),代理到內(nèi)網(wǎng)去,這就是所謂的反向代理,即反向代理“代理”的是服務(wù)器端,而且這一個(gè)過(guò)程對(duì)于客戶端而言是無(wú)感的。

正向代理和反向代理的關(guān)系示意圖如下:

無(wú)論是正向代理還是反向代理,都適用 Cache(緩存)技術(shù)。比如反向代理服務(wù)器,可以緩存一些從服務(wù)端取到的實(shí)時(shí)性要求不太高的數(shù)據(jù),當(dāng)客戶端訪問(wèn)已緩存的數(shù)據(jù)且沒(méi)有過(guò)期,就會(huì) Cache 命中,不用再重復(fù)去服務(wù)端去獲取,減少響應(yīng)等待時(shí)間。

詳情可參考:https://zhuanlan.zhihu.com/p/68560128

1.2.2 負(fù)載均衡

負(fù)載均衡(Load Balance),意思是將負(fù)載(工作任務(wù),訪問(wèn)請(qǐng)求)進(jìn)行平衡、分?jǐn)偟蕉鄠€(gè)操作單元(服務(wù)器,組件)上進(jìn)行執(zhí)行。是達(dá)到高性能,解決單點(diǎn)故障(高可用),增加擴(kuò)展性(水平伸縮)的終極解決方案。

舉個(gè)事例,在早高峰乘地鐵時(shí)候,緊挨小區(qū)的地鐵口人特別多,一般會(huì)有限流,還會(huì)有個(gè)地鐵工作人員用大喇叭在喊“著急的人員請(qǐng)走B口,B口人少車空”。那么,地鐵工作人員就是負(fù)責(zé)負(fù)載均衡的。

為了提升網(wǎng)站的各方面能力,我們一般會(huì)把多臺(tái)機(jī)器組成一個(gè)集群對(duì)外提供服務(wù)。然而,一般網(wǎng)站對(duì)外提供的訪問(wèn)入口都是一個(gè)。比如 www.taobao.com,當(dāng)用戶在瀏覽器輸入 www.taobao.com 的時(shí)候如何將用戶的請(qǐng)求分發(fā)到集群中不同的機(jī)器上呢?這就是負(fù)載均衡在做的事情。

如下圖中的代理,就可以是 nginx 服務(wù)器,接收到請(qǐng)求后,分配給服務(wù)集群:

根據(jù)負(fù)載均衡技術(shù)實(shí)現(xiàn)在 OSI 七層模型(7應(yīng)用層、6表示層、5會(huì)話層、4傳輸層、3網(wǎng)絡(luò)層、2數(shù)據(jù)鏈路層、1物理層)的不同層次,可以給負(fù)載均衡分類。常見(jiàn)的實(shí)現(xiàn)方式中,主要可以在應(yīng)用層、傳輸層、網(wǎng)絡(luò)層和數(shù)據(jù)傳輸層做文章。所以,工作在應(yīng)用層的負(fù)載均衡,我們通常稱之為七層負(fù)載均衡;工作在傳輸層的我們稱之為四層負(fù)載均衡

大致可以分為以下幾種,其中最常用的是四層和七層負(fù)載均衡

  • 二層負(fù)載均衡(不同的 MAC)

負(fù)載均衡服務(wù)器對(duì)外依然提供一個(gè) VIP(虛 IP),集群中不同的機(jī)器采用相同 IP 地址,但是機(jī)器的 MAC 地址不一樣。當(dāng)負(fù)載均衡服務(wù)器接受到請(qǐng)求之后,通過(guò)改寫(xiě)報(bào)文的目標(biāo) MAC 地址的方式將請(qǐng)求轉(zhuǎn)發(fā)到目標(biāo)機(jī)器實(shí)現(xiàn)負(fù)載均衡。

  • 三層負(fù)載均衡(不同的 IP)

和二層負(fù)載均衡類似,負(fù)載均衡服務(wù)器對(duì)外依然提供一個(gè) VIP(虛 IP),但是集群中不同的機(jī)器采用不同的 IP 地址。當(dāng)負(fù)載均衡服務(wù)器接受到請(qǐng)求之后,根據(jù)不同的負(fù)載均衡算法,通過(guò) IP 將請(qǐng)求轉(zhuǎn)發(fā)至不同的真實(shí)服務(wù)器。

  • 四層負(fù)載均衡(IP + Port 組合)

四層負(fù)載均衡工作在 OSI 模型的傳輸層,由于在傳輸層,只有 TCP/UDP 協(xié)議,這兩種協(xié)議中除了包含源 IP、目標(biāo) IP 以外,還包含源端口號(hào)及目的端口號(hào)。四層負(fù)載均衡服務(wù)器在接受到客戶端請(qǐng)求后,以后通過(guò)修改數(shù)據(jù)包的地址信息(IP+端口號(hào))將流量轉(zhuǎn)發(fā)到應(yīng)用服務(wù)器。

  • 七層負(fù)載均衡

七層負(fù)載均衡工作在 OSI 模型的應(yīng)用層,應(yīng)用層協(xié)議較多,常用 http、radius、dns 等。七層負(fù)載就可以基于這些協(xié)議來(lái)負(fù)載。這些應(yīng)用層協(xié)議中會(huì)包含很多有意義的內(nèi)容。比如同一個(gè) Web 服務(wù)器的負(fù)載均衡,除了根據(jù) IP 加端口進(jìn)行負(fù)載外,還可根據(jù)七層的 URL、瀏覽器類別、語(yǔ)言來(lái)決定是否要進(jìn)行負(fù)載均衡。

Nginx:主要用來(lái)做七層負(fù)載均衡。Nginx 是一個(gè)網(wǎng)頁(yè)服務(wù)器,它能反向代理 HTTP, HTTPS, SMTP, POP3, IMAP 的協(xié)議鏈接,以及一個(gè)負(fù)載均衡器和一 個(gè)HTTP 緩存。

詳細(xì)可參考:http://www.dbjr.com.cn/server/319705oz1.htm

二、Windows 安裝 Nginx

2.1 下載安裝包

官網(wǎng)下載頁(yè):nginx: download

可下載穩(wěn)定版:

另外 Mainline version 主線版本為新版的,Legacy version 歷史版本,可按需下載。

安裝包中的目錄與對(duì)應(yīng)功能:

2.2 開(kāi)啟和關(guān)閉 Nginx 服務(wù)

Nginx 默認(rèn)監(jiān)聽(tīng)當(dāng)前服務(wù)器的 80 端口,如下圖:(配置文件路徑示例:C:\nginx-1.24.0\conf\nginx.conf)

因此可先看下 80 端口有沒(méi)有被占用。方法是打開(kāi) cmd 窗口,用命令(...>netstat -ano)來(lái)查看當(dāng)前端口使用情況,最后一列為 PID。使用命令(...>taskkill /f /t /pid PID編號(hào))結(jié)束對(duì)應(yīng)的進(jìn)程。如果占用 80 端口的是一個(gè)關(guān)鍵進(jìn)程關(guān)不掉,那么就是惹不起得躲,將 Nginx 配置文件中的 80 端口改掉。

  • 開(kāi)啟服務(wù)

可以通過(guò)雙擊 nginx.exe,也可以通過(guò)命令的方式,如下在 Nginx 的主目錄地址欄輸入 cmd,并回車:

打開(kāi)命令行窗口,路徑是在當(dāng)前文件夾,如下圖,然后輸入命令:nginx 或者 start nginx 開(kāi)啟服務(wù):

然后在地址欄輸入:http://localhost:80,查看服務(wù)是否啟動(dòng)成功。

  • 關(guān)閉服務(wù)

需要另開(kāi)一個(gè)命令窗口通過(guò)命令(...>nginx -s stop)進(jìn)行關(guān)閉。

參考:http://www.dbjr.com.cn/program/319707u0k.htm

三、Linux 安裝 Nginx

3.1 下載和解壓

// 進(jìn)入 opt 目錄,暫存安裝包
cd /opt
// 下載 nginx 包,示例下載版本為 1.24.0 可根據(jù)實(shí)際修改
wget http://nginx.org/download/nginx-1.24.0.tar.gz
// 創(chuàng)建目錄,用于存放 nginx 文件
mkdir /usr/local/nginxtest
// 解壓安裝包內(nèi)容
// -zxvf:解壓詳細(xì)配置,略
// -C:解壓到指定目錄,后邊跟的是目標(biāo)目錄
tar -zxvf nginx-1.24.0.tar.gz -C /usr/local/nginxtest

3.2 初始化與開(kāi)啟服務(wù)

  • 初始化和安裝
// 進(jìn)入解壓后文件存放的文件夾
cd /usr/local/nginxtest/nginx-1.24.0
// 配置 nginx 編輯環(huán)境
./configure
// 編譯并安裝
make && make install

編譯安裝完成后,在 /usr/local/ 目錄下會(huì)自動(dòng)生成一個(gè) nginx 目錄,代表安裝成功。

  • 開(kāi)啟服務(wù)
// 進(jìn)入 sbin 目錄
cd /usr/local/nginx/sbin/
// 啟動(dòng) Nginx 服務(wù)
./nginx

瀏覽器輸入服務(wù) IP,默認(rèn) 80 端口:

3.3 異常提示:checking for C compiler ... not found

在執(zhí)行命令./configure來(lái)配置 nginx 編輯環(huán)境時(shí),如下異常提示:

[root@localhost nginx-1.24.0]# ./configure
checking for OS
 + Linux 3.10.0-1160.83.1.el7.x86_64 x86_64
checking for C compiler ... not found
./configure: error: C compiler cc is not found

如何解決:

yum -y install gcc

gcc 的全稱是 GNU Compiler Collection,它是一個(gè)能夠編譯多種語(yǔ)言的編譯器。最開(kāi)始 gcc 是作為 C 語(yǔ)言的編譯器(GNU C Compiler),現(xiàn)在除了 C 語(yǔ)言,還支持 C++、java、Pascal 等語(yǔ)言,gcc 還支持多種硬件平臺(tái)。

3.4 異常提示:the HTTP rewrite module requires the PCRE library.

在執(zhí)行命令./configure來(lái)配置 nginx 編輯環(huán)境時(shí),如下異常提示:

./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.

PCRE 庫(kù)(Perl Compatible Regular Expressions Library)是一個(gè)正則表達(dá)式庫(kù),提供了與 Perl 語(yǔ)言兼容的正則表達(dá)式功能。它被廣泛用于各種編程語(yǔ)言和軟件中,用于處理字符串匹配、搜索、替換等操作。

如何解決:

yum -y install openssl openssl-devel

openssl 命令是強(qiáng)大的安全套接字層密碼庫(kù)。OpenSSL 是一種開(kāi)源命令行工具,通常用于生成私鑰,創(chuàng)建 CSR,安裝 SSL / TLS 證書(shū)以及標(biāo)識(shí)證書(shū)信息等等。通過(guò)使用 OpenSSL,用戶可以保護(hù)自己的數(shù)據(jù)不受未授權(quán)訪問(wèn),并確保通信的安全性。

參考:http://www.dbjr.com.cn/article/140266.htm  http://www.dbjr.com.cn/article/106810.htm

四、常用命令(Windows、Linux 對(duì)比)

  • 檢查配置文件是否配置成功,再開(kāi)啟服務(wù)前執(zhí)行
// windows
nginx -t // 小寫(xiě) t:檢查配置文件并顯示文件路徑;大寫(xiě) T:還額外顯示全部配置項(xiàng)和支持的文件類型
.\nginx -t
nginx -c filename // 設(shè)置配置文件(默認(rèn)是:/nginx/conf/nginx.conf)
// Linux
./nginx -t
./nginx -c filename // 設(shè)置配置文件(默認(rèn)是:/nginx/conf/nginx.conf)
  • 開(kāi)啟服務(wù)
// Windows
nginx // 命令行運(yùn)行(當(dāng)前窗口關(guān)掉,不影響運(yùn)行)
.\nginx // 命令行運(yùn)行(當(dāng)前窗口關(guān)掉,不影響運(yùn)行)
start nginx // 后臺(tái)運(yùn)行
// Linux
./nginx // 后臺(tái)運(yùn)行
  • 停止服務(wù)
// windows
nginx -s quit // 等待任務(wù)完成后停止
.\nginx -s quit
nginx -s stop // 強(qiáng)制停止
.\nginx -s stop
// linux
./nginx -s quit // 等待任務(wù)完成后停止
./nginx -s stop // 強(qiáng)制停止
  • 重啟服務(wù)
// windows
nginx -s reload
.\nginx -s reload
// linux
./nginx -s reload
  • 查看版本
// 小寫(xiě) v:僅顯示版本;大寫(xiě) V:除了版本信息還顯示配置信息
// windows
nginx -v
.\nginx -v
// linux
./nginx -v
  • 查看 nginx 進(jìn)程,以及關(guān)閉指定進(jìn)程
// windows
tasklist /fi "imagename eq nginx.exe" // 查看進(jìn)程,包含 PID // fi:Filter 過(guò)濾器/篩選器
tskill PID數(shù)值 // 關(guān)閉指定進(jìn)程
taskkill /im nginx.exe /f  // 根據(jù)映像名稱關(guān)閉同名的全部進(jìn)程 // im:映像名稱 f:強(qiáng)制 t:一起結(jié)束進(jìn)程樹(shù)
taskkill /f /t /fi "imagename eq nginx.exe" // 根據(jù)映像名稱關(guān)閉同名的全部進(jìn)程
// linux
pgrep nginx // 根據(jù)進(jìn)程名查詢 PID
ps -ef | grep nginx // 根據(jù)進(jìn)程名查詢?cè)敿?xì)信息 // e:全部進(jìn)程 f:顯示完整格式
kill PID數(shù)值 // 關(guān)閉指定 PID 的進(jìn)程,以及子進(jìn)程
pkill nginx // 根據(jù)進(jìn)程名關(guān)閉
killall nginx // 關(guān)閉根據(jù)進(jìn)程名得到的全部匹配項(xiàng)
  • reopen 重新打開(kāi)日志文件

當(dāng) nginx 日志文件內(nèi)容較多時(shí),一般需要按天切割文件,每天的日志放在一個(gè)文件中,并用日期命名,方便日后查找。但是簡(jiǎn)單的把文件移動(dòng)并重新命名是無(wú)法及時(shí)生效的,因?yàn)樵?linux 下的文件句柄,文件在被打開(kāi)的情況下 mv 移走文件,操作這個(gè)文件的進(jìn)程還是有這個(gè)文件的信息,原進(jìn)程還是讀寫(xiě)原來(lái)的文件。因此簡(jiǎn)單的 mv 無(wú)法生效也就無(wú)法完成我們想要的文件分割

此時(shí)就需要根據(jù)以下步驟:先移走文件并重命名;再利用 nginx 的 reopen 功能,完成新日志文件的生成。

// windows
ren access.log access_20240410.log // 進(jìn)入 logs 文件夾 ren 重命名日志文件
nginx -s reopen // 返回 nginx 目錄后,重新生成新的日志文件
.\nginx -s reopen
// linux
mv /usr/local/nginx/logs/access.log /usr/local/nginx/logs/access20240410.log // 通過(guò)絕對(duì)路徑重命名
./nginx -s reopen // 重新生成新的日志文件
cd .. // 進(jìn)入 logs 文件夾查看日志文件
cd logs
ls // 結(jié)果:access20240410.log  access.log  error.log  nginx.pid

五、配置文件

Nginx 的主配置文件是 nginx.conf,這個(gè)配置文件一共由三部分組成,分別為全局塊、events 塊和 http 塊。

在 http 塊中,又包含 http 全局塊、多個(gè) server 塊。每個(gè) server 塊中,可以包含 server 全局塊和多個(gè) location 塊。在同一配置塊中嵌套的配置塊,各個(gè)之間不存在次序關(guān)系。

配置文件支持大量可配置的指令,絕大多數(shù)指令不是特定屬于某一個(gè)塊的。同一個(gè)指令放在不同層級(jí)的塊中,其作用域也不同。

一般情況下,高一級(jí)塊中的指令可以作用于自身所在的塊和此塊包含的所有低層級(jí)塊。如果某個(gè)指令在兩個(gè)不同層級(jí)的塊中同時(shí)出現(xiàn),則采用“就近原則”,即以較低層級(jí)塊中的配置為準(zhǔn)。比如,某指令同時(shí)出現(xiàn)在 http 全局塊中和 server 塊中,并且配置不同,則應(yīng)該以 server 塊中的配置為準(zhǔn)。

5.1 全局塊

全局塊是默認(rèn)配置文件從開(kāi)始到events塊之間的一部分內(nèi)容,主要設(shè)置一些影響Nginx服務(wù)器整體運(yùn)行的配置指令,因此,這些指令的作用域是Nginx服務(wù)器全局。

通常包括配置運(yùn)行 Nginx 服務(wù)器的用戶(組)、允許生成的 worker process 數(shù)、Nginx 進(jìn)程 PID 存放路徑、日志的存放路徑和類型以及配置文件引入等。

# 指定可以運(yùn)行 nginx 服務(wù)的用戶和用戶組
# user [user] [group]
# 將user指令注釋掉,或者配置成 nobody 的話所有用戶都可以運(yùn)行
# user nobody nobody;
# user 指令在 Windows 上不生效,如果指定具體用戶和用戶組會(huì)報(bào)警告
# nginx: [warn] "user" is not supported, ignored in D:\software\nginx-1.18.0/conf/nginx.conf:2
user root;
# 指定并發(fā)工作的進(jìn)程數(shù),可以配置具體數(shù)字,也可使用自動(dòng)模式
# worker_processes number | auto;
# 如下配置:指定 4 個(gè)工作進(jìn)程,此時(shí)會(huì)生成一個(gè) master 進(jìn)程和 4 個(gè)工作進(jìn)程,總共五個(gè)
#  因此,可以配置工作進(jìn)程數(shù)為本機(jī) CPU 核心數(shù) n -1
worker_processes 4;
# 指定包含 nginx 主進(jìn)程的 PID 數(shù)值的文件路徑
# 用途:進(jìn)程管理、監(jiān)控與診斷、方便進(jìn)行自動(dòng)化腳本控制
pid logs/nginx.pid;
# 指定錯(cuò)誤日志的路徑和日志級(jí)別
# error_log [path] [debug | info | notice | warn | error | crit | alert | emerg] 
# 其中debug級(jí)別的日志需要編譯時(shí)使用--with-debug開(kāi)啟debug開(kāi)關(guān)
error_log  logs/error.log  info;
# 此指令可以在(全局塊 < http 塊 < server 塊 < location 塊)中配置,下面簡(jiǎn)單介紹下區(qū)別:
# 首先就是,配置在越低級(jí)的塊中優(yōu)先級(jí)越高;
# 各個(gè)級(jí)別的配置塊中設(shè)置的日志指令,將應(yīng)用于各自所有下級(jí);
# server 塊的配置,目的是不同的服務(wù)器配置不同的日志文件或日志級(jí)別;
# location 塊是最具體的配置級(jí)別,它可為特定的 URI 路徑或模式設(shè)置專門的日志指令。

5.2 events 塊

events 塊涉及的指令主要影響 Nginx 服務(wù)器與用戶的網(wǎng)絡(luò)連接。

常用到的設(shè)置包括:

  • 是否開(kāi)啟對(duì)多 worker process 下的網(wǎng)絡(luò)連接進(jìn)行序列化;
  • 是否允許同時(shí)接收多個(gè)網(wǎng)絡(luò)連接;
  • 選取哪種事件驅(qū)動(dòng)模型處理連接請(qǐng)求;
  • 每個(gè)worker process可以同時(shí)支持的最大連接數(shù)等。
# 當(dāng)某一時(shí)刻只有一個(gè)網(wǎng)絡(luò)連接到來(lái)時(shí),【多個(gè)睡眠進(jìn)程】會(huì)被同時(shí)喚醒,但只有【一個(gè)進(jìn)程】可獲得連接
# 如果【每次喚醒的進(jìn)程數(shù)目太多】,會(huì)影響一部分系統(tǒng)性能
# 開(kāi)啟的時(shí)候,將會(huì)對(duì)多個(gè) Nginx 進(jìn)程接收連接進(jìn)行序列化,【防止多個(gè)進(jìn)程對(duì)連接的爭(zhēng)搶】
# 有兩個(gè)枚舉值,默認(rèn)是開(kāi)啟狀態(tài),因此可以不進(jìn)行專門配置
# accept_mutex on | off;
accept_mutex on;
# multi_accept 配置,決定了當(dāng)有多個(gè)工作進(jìn)程監(jiān)聽(tīng)同一個(gè)端口時(shí),這些進(jìn)程如何處理到來(lái)的新請(qǐng)求,語(yǔ)法:
# multi_accept on | off;
# off 時(shí):當(dāng)有新連接到來(lái)時(shí),【所有等待的工作進(jìn)程都會(huì)被喚醒】來(lái)接受連接,這樣可以【提高處理效率】,尤其是在高并發(fā)的場(chǎng)景下
# on 時(shí):當(dāng)有新連接到來(lái)時(shí),【只有一個(gè)工作進(jìn)程數(shù)會(huì)被喚醒】,其他仍處于休眠狀態(tài) ,目的是【控制資源的使用】,避免在高并發(fā)情況下系統(tǒng)資源的過(guò)度消耗
# 如果在支持 kqueue 高效多路復(fù)用機(jī)制的操作系統(tǒng)(FreeBSD、macOS 等)上運(yùn)行 Nginx,那么這條指令會(huì)被忽略
# 【默認(rèn)是 off 狀態(tài)】
multi_accept off;
# 指定使用哪種網(wǎng)絡(luò) IO 模型,影響到 Nginx 處理并發(fā)連接的能力,語(yǔ)法:
# use method
# 其中 method 可選擇的內(nèi)容有:
# 【W(wǎng)indows 默認(rèn) select】【Linux 默認(rèn) epoll】【FreeBSD 默認(rèn) kqueue】
# select:這是最基本的網(wǎng)絡(luò) IO 模型,適用于低并發(fā)場(chǎng)景,它在處理大量連接時(shí)可能會(huì)變得效率低下
# poll:相比 select,poll 能夠處理更多的文件描述符,但在某些系統(tǒng)上性能提升有限
# kqueue:這是 FreeBSD 系統(tǒng)特有的高效網(wǎng)絡(luò) IO 模型,適用于高并發(fā)環(huán)境
# epoll:這是Linux 系統(tǒng)下的高效網(wǎng)絡(luò) IO 模型,同樣適合處理大量并發(fā)連。
# rtsig:這是一種實(shí)時(shí)信號(hào)驅(qū)動(dòng)的網(wǎng)絡(luò) IO 模型,它可以在不使用線程的情況下處理事件
# dev/poll:這是 Solaris 操作系統(tǒng)特有的網(wǎng)絡(luò) IO 模型,類似于 poll
# eventport:這是 NetBSD 和 GNU/Hurd 系統(tǒng)上的事件端口模型,用于處理網(wǎng)絡(luò)事件
# /dev/poll:這是 macOS 系統(tǒng)上的網(wǎng)絡(luò) IO 模型,類似于 poll
use epoll
# 設(shè)置允許每一個(gè) worker process 同時(shí)開(kāi)啟的最大連接數(shù)
# 當(dāng)每個(gè)工作進(jìn)程接受的連接數(shù)超過(guò)這個(gè)值時(shí)將不再接收連接,當(dāng)所有的工作進(jìn)程都接收滿時(shí),連接進(jìn)入 logback,logback 滿后連接被拒絕
worker_connections  1024;
# 注意:worker_connections * worker_process <= 系統(tǒng)的最大打開(kāi)文件數(shù)
#       worker_connections <= 單個(gè)進(jìn)程支持打開(kāi)的最大文件數(shù)
# 下文繼續(xù)詳解...

關(guān)于全局和單進(jìn)程最大打開(kāi)文件數(shù):

# 【全局限制】
# Linux 下執(zhí)行:cat /proc/sys/fs/file-nr
# 打印出結(jié)果:960     0       3228075
# 第三個(gè)數(shù)字 3228075 就是當(dāng)前系統(tǒng)的全局最大打開(kāi)文件數(shù)(Max Open Files)
# 也可以自行修改這個(gè)數(shù)值,用 root 權(quán)限修改 /etc/sysctl.conf 文件
#     fs.file-max = 3228075
#     net.ipv4.ip_conntrack_max = 3228075
#     net.ipv4.netfilter.ip_conntrack_max = 3228075
# 【進(jìn)程限制】
# Linux 下執(zhí)行:ulimit -n
# 打印出結(jié)果:655350
# 臨時(shí)修改(需 root 用戶):ulimit -n 3228075
# 永久修改:
# 打開(kāi)文件 /etc/security/limits.conf,加入如下行:
#     work         hard    nofile      3228075
#     work         soft    nofile      3228075
# 詳情參考:https://cloud.tencent.com/developer/article/1114773

5.3 http 塊

http 塊是 Nginx 服務(wù)器配置中的重要部分,代理、緩存和日志定義等絕大多數(shù)的功能和第三方模塊的配置都可以放在這個(gè)模塊中。

http 塊中可以包含自己的全局塊,其中配置的指令包括文件引入、MIME-Type 定義、日志自定義、是否使用 sendfile 傳輸文件、連接超時(shí)時(shí)間、單連接請(qǐng)求數(shù)上限等。

# include 指令,用于包含其他的配置文件,提高配置可讀性,避免單個(gè)配置文件過(guò)大,但必須符合配置規(guī)范
# 下面的指令將 mime.types 包含進(jìn)來(lái),mime.types 和 nginx.conf 同級(jí)目錄,不同級(jí)的話需要指定具體路徑
include  mime.types;
# 瀏覽器可以顯示的內(nèi)容有 HTML、XML、GIF 及 Flash 等種類繁多的文本、媒體等資源,瀏覽器為區(qū)分這些資源,需要使用MIME Type
# 換言之,MIME Type 是網(wǎng)絡(luò)資源的媒體類型。Nginx 服務(wù)器作為 Web 服務(wù)器,必須能夠識(shí)別前端請(qǐng)求的資源類型
# default_type 指令默認(rèn)類型,如果不加此指令【默認(rèn)值為 text/plain】
# 當(dāng) Web 程序無(wú)法識(shí)別對(duì)應(yīng)文件 MIME 類型時(shí),Nginx 會(huì)使用 default_type 指定的類型來(lái)告訴瀏覽器如何處理這個(gè)文件
# application/octet-stream,這是一種通用的二進(jìn)制流數(shù)據(jù)類型,通常用于未知或未指定類型的文件,瀏覽器不會(huì)直接打開(kāi)未知文件,而是提示下載
# 這樣可以確保在沒(méi)有明確指定 MIME 類型的情況下,用戶不會(huì)被誤導(dǎo)直接在瀏覽器中打開(kāi)可能是執(zhí)行代碼的文件,更加安全
# 此指令還可以在 http 塊、server 塊或者 location 塊中進(jìn)行配置
default_type  application/octet-stream;
# log_format 指令,用于定義日志格式,變量意義見(jiàn)后文表格
# main 為定義的格式名稱,這樣 access_log 就可以直接使用這個(gè)變量了
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 指令
# 在全局塊中,我們介紹過(guò) errer_log 指令,其用于配置 Nginx 進(jìn)程運(yùn)行時(shí)的日志存放和級(jí)別
# 此處所指的日志與常規(guī)的不同,它是指記錄 Nginx 服務(wù)器【提供服務(wù)過(guò)程應(yīng)答前端請(qǐng)求的日志】
# buffer=size:設(shè)置內(nèi)存緩存區(qū)的大小,不實(shí)時(shí)寫(xiě)入日志文件,可以減少磁盤 I/O 操作的次數(shù)
# access_log path [format [buffer=size]]
# 如果你要關(guān)閉 access_log,你可以使用下面的命令:access_log off;
# 此指令可以在 http 塊、server 塊或者 location 塊中進(jìn)行設(shè)置
access_log  logs/access.log  main;
# sendfile 指令用于配置,是否使用 sendfile()系統(tǒng)調(diào)用來(lái)高效的傳輸文件數(shù)據(jù),【特別適合于提供靜態(tài)內(nèi)容的場(chǎng)景】,語(yǔ)法:
# sendfile  on | off;
# 【默認(rèn)值是 off】但在大多數(shù)提供靜態(tài)內(nèi)容的 Nginx 服務(wù)器上,建議將其設(shè)置為 on 以利用其帶來(lái)的性能優(yōu)勢(shì)
# sendfile()系統(tǒng)調(diào)用模式,允許內(nèi)核直接將文件數(shù)據(jù)從磁盤傳輸?shù)骄W(wǎng)絡(luò) socket,而非先將數(shù)據(jù)讀取到用戶空間緩沖區(qū),再寫(xiě)入到 socket 的內(nèi)核緩沖區(qū)
# 這樣可以減少數(shù)據(jù)在用戶空間和內(nèi)核空間之間的拷貝次數(shù),從而顯著提高靜態(tài)文件傳輸?shù)男?
# 此指令可以在 http 塊、server 塊或者 location 塊中進(jìn)行配置
sendfile  on;
# sendfile_max_chunk 指令用于限制每個(gè) sendfile()調(diào)用傳輸數(shù)據(jù)的最大塊大小,語(yǔ)法:
# sendfile_max_chunk size;
# 此指令的最優(yōu)值取決于具體的系統(tǒng)環(huán)境和網(wǎng)絡(luò)條件
# 在高速網(wǎng)絡(luò)環(huán)境中,較大的塊大小可能更有利于提高傳輸效率;而在低速網(wǎng)絡(luò)或高延遲的環(huán)境中,較小的塊大小可能更合適
# 此外,還需要考慮到服務(wù)器的硬件資源,如 CPU 和內(nèi)存的限制
# size 值如果大于 0,Nginx 進(jìn)程的每個(gè) worker process 每次調(diào)用 sendfile()傳輸?shù)臄?shù)據(jù)量最大不能超過(guò)這個(gè)值
# 如果設(shè)置為0,則無(wú)限制【默認(rèn)值為 0】
# 此指令可以在 http 塊、server 塊或 location 塊中配置
sendfile_max_chunk 128k;
# 配置連接超時(shí)時(shí)間,與用戶建立會(huì)話連接后,Nginx 服務(wù)器可以保持這些連接打開(kāi)一段時(shí)間,語(yǔ)法:
# keepalive_timeout timeout [header_timeout]
# timeout:服務(wù)器端對(duì)連接的保持時(shí)間【默認(rèn)值為 75s】針對(duì)的是整個(gè) TCP 連接的生命周期
# header_timeout:為可選項(xiàng),是 timeout 的一個(gè)子集,在應(yīng)答報(bào)文頭部的 Keep-Alive 域設(shè)置超時(shí)時(shí)間,僅控制發(fā)送響應(yīng)頭之后的保持時(shí)間
# 此指令可以在 http 塊、server 塊或 location 塊中配置
# 下面配置的含義是,在服務(wù)器端保持連接的時(shí)間設(shè)置為 120s,發(fā)給用戶端的應(yīng)答報(bào)文頭部中 Keep-Alive 域的超時(shí)時(shí)間設(shè)置為 100s
keepalive_timeout 120s 100s;
# keepalive_requests 指令配置【單連接請(qǐng)求數(shù)上限】達(dá)到上限后自動(dòng)關(guān)閉
# 【默認(rèn)值為100】這意味著在默認(rèn)配置下,Nginx 會(huì)在處理了100個(gè)請(qǐng)求后關(guān)閉長(zhǎng)連接
# 此指令可以在 http 塊、server 塊或 location 塊中配置
keepalive_requests 100;
# error_page 指令用于定義在出現(xiàn)特定錯(cuò)誤時(shí) Nginx 應(yīng)該如何響應(yīng)
# 當(dāng)發(fā)生錯(cuò)誤時(shí),如請(qǐng)求的資源不存在(404錯(cuò)誤)或服務(wù)器內(nèi)部錯(cuò)誤(500錯(cuò)誤),Nginx 可以使用 error_page 指令來(lái)定制錯(cuò)誤響應(yīng)
# error_page <HTTP_Error> <value1> <value2>;
# <HTTP_Error>:表示要處理的 HTTP 錯(cuò)誤狀態(tài)碼,如 404、500 等
# <value1>:表示當(dāng)出現(xiàn) <HTTP_Error> 錯(cuò)誤時(shí),Nginx 返回的錯(cuò)誤頁(yè)面的 uri
# <value2>:可選參數(shù),表示是否允許重新定義該錯(cuò)誤頁(yè)面。默認(rèn)為“=”,即允許重新定義。如果設(shè)置為“=@”,則表示不允許重新定義
error_page 404 /404.html;
# http 塊中的 error_page 允許你指定一個(gè)特定的頁(yè)面作為錯(cuò)誤響應(yīng),而 location快中的 return 則只能返回標(biāo)準(zhǔn)的錯(cuò)誤響應(yīng)代碼和消息

log_fomat 變量值定義:

參數(shù)名參數(shù)意義
$remote_addr客戶端 IP
$remote_user遠(yuǎn)程客戶端用戶名,一般為:‘-’
$time_local時(shí)間和時(shí)區(qū)
$request請(qǐng)求的 url 以及 method
$status響應(yīng)狀態(tài)碼
$body_bytes_send響應(yīng)客戶端內(nèi)容字節(jié)數(shù)
$http_referer記錄用戶從哪個(gè)鏈接跳轉(zhuǎn)過(guò)來(lái)的
$http_user_agent用戶所使用的代理,一般來(lái)時(shí)都是瀏覽器
$http_x_forwarded_for通過(guò)代理服務(wù)器來(lái)記錄客戶端的 IP

5.4 server 塊

server 塊和“虛擬主機(jī)”的概念有密切聯(lián)系。

虛擬主機(jī),又稱虛擬服務(wù)器、主機(jī)空間或是網(wǎng)頁(yè)空間,該技術(shù)是為了節(jié)省互聯(lián)網(wǎng)服務(wù)器硬件成本而出現(xiàn)。這里的“主機(jī)”或“空間”是由實(shí)體的服務(wù)器延伸而來(lái),硬件系統(tǒng)可以基于服務(wù)器群,或者單個(gè)服務(wù)器等。虛擬主機(jī)技術(shù)主要應(yīng)用于 HTTP、FTP 及 EMAIL 等多項(xiàng)服務(wù),將一臺(tái)服務(wù)器的某項(xiàng)或者全部服務(wù)內(nèi)容邏輯劃分為多個(gè)服務(wù)單位,對(duì)外表現(xiàn)為多個(gè)服務(wù)器,從而充分利用服務(wù)器硬件資源。從用戶角度來(lái)看,一臺(tái)虛擬主機(jī)和一臺(tái)獨(dú)立的硬件主機(jī)是完全一樣的。

在使用 Nginx 服務(wù)器提供 Web 服務(wù)時(shí),利用虛擬主機(jī)的技術(shù),就可以在同一臺(tái)服務(wù)器上只運(yùn)行一組 Nginx 進(jìn)程,來(lái)對(duì)應(yīng)運(yùn)行多個(gè)網(wǎng)站。

每一個(gè) http 塊都可以包含多個(gè) server 塊,而每個(gè) server 塊就相當(dāng)于一臺(tái)虛擬主機(jī),它內(nèi)部可有多臺(tái)主機(jī)聯(lián)合提供服務(wù),一起對(duì)外提供一組邏輯上關(guān)系密切的服務(wù)(或網(wǎng)站)。

和 http 塊相同,server 塊也可以包含自己的全局塊,同時(shí)可以包含多個(gè) location 塊。在 server 全局塊中,最常見(jiàn)的兩個(gè)配置項(xiàng)是本虛擬主機(jī)的監(jiān)聽(tīng)配置本虛擬主機(jī)的名稱或 IP 配置。

5.4.1 listen 指令

server 塊中最重要的指令就是 listen 指令,這個(gè)指令有三種配置語(yǔ)法。這個(gè)指令默認(rèn)的配置值是:listen *:80 | *:8000;只能在server塊種配置這個(gè)指令。

# 【三種格式】
# 第一種
# listen address[:port] [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
# 第二種
# listen port [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
# 第三種(可以不用重點(diǎn)關(guān)注)
# listen unix:path [default_server] [ssl] [http2 | spdy] [proxy_protocol] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];

部分參數(shù)說(shuō)明:

  • address:監(jiān)聽(tīng)的 IP 地址(請(qǐng)求來(lái)源的 IP 地址),如果是 IPv6 的地址,需要使用中括號(hào)“[]”括起來(lái),比如 [fe80::1] 等;
  • port:端口號(hào),為空時(shí)默認(rèn) 80 端口。若未配置 listen 指令,那么如果 Nginx 以超級(jí)用戶權(quán)限運(yùn)行,則使用 *:80,否則使用 *:8000。多個(gè)虛擬主機(jī)可以同時(shí)監(jiān)聽(tīng)同一個(gè)端口,但是 server_name 需要設(shè)置成不一樣;
  • default_server:假如通過(guò) Host 沒(méi)匹配到對(duì)應(yīng)的虛擬主機(jī),則通過(guò)這臺(tái)虛擬主機(jī)處理;
  • backlog=number:設(shè)置監(jiān)聽(tīng)函數(shù) listen() 最多允許多少網(wǎng)絡(luò)連接同時(shí)處于掛起狀態(tài),在 FreeBSD 中默認(rèn)為 -1,其他平臺(tái)默認(rèn)為 511;
  • accept_filter=filter:設(shè)置監(jiān)聽(tīng)端口對(duì)請(qǐng)求的過(guò)濾,被過(guò)濾的內(nèi)容不能被接收和處理。本指令只在 FreeBSD 和 NetBSD 5.0+ 平臺(tái)下有效。filter 可以設(shè)置為 dataready 或 httpready,詳情可參閱 Nginx 的官方文檔;
  • bind:標(biāo)識(shí)符,使用獨(dú)立的 bind() 處理此 address:port;一般情況下,對(duì)于端口相同而 IP 地址不同的多個(gè)連接,Nginx 服務(wù)器將只使用一個(gè)監(jiān)聽(tīng)命令,并使用 bind() 處理端口相同的所有連接;
  • ssl:標(biāo)識(shí)符,設(shè)置會(huì)話連接使用 SSL 模式進(jìn)行,此標(biāo)識(shí)符和 Nginx 服務(wù)器提供的 HTTPS 服務(wù)有關(guān)

listen 指令的格式看起來(lái)比較復(fù)雜,但在實(shí)際應(yīng)用中并不會(huì)進(jìn)行太復(fù)雜的配置。

如下幾個(gè)簡(jiǎn)單的配置,可以單獨(dú)制定 IP,單獨(dú)指定端口或者同時(shí)指定 IP 和端口:

# 只監(jiān)聽(tīng)來(lái)自 127.0.0.1 這個(gè) IP,請(qǐng)求 8000 端口的請(qǐng)求
listen 127.0.0.1:8000;
listen localhost:8000;
# 只監(jiān)聽(tīng)來(lái)自 127.0.0.1 這個(gè) IP,請(qǐng)求 80 端口的請(qǐng)求(不指定端口,默認(rèn) 80)
listen 127.0.0.1;
# 監(jiān)聽(tīng)來(lái)自所有 IP,請(qǐng)求 8000 端口的請(qǐng)求
listen 8000;
listen *:8000;

5.4.2 server_name 指令

用于指定虛擬主機(jī)的域名,它決定了請(qǐng)求將被路由到哪個(gè)服務(wù)器塊處理。語(yǔ)法是:

# 【基本使用】
# 配置一個(gè)或多個(gè)具體的域名,以空格分隔,表示 Nginx 可接受指向這些域名的請(qǐng)求
# server_name name1 name2 ...;
server_name example.com www.example.com;
# 【通配符匹配】
# 使用通配符 * 只能用來(lái)匹配域名的【開(kāi)頭或結(jié)尾】部分,如下配置會(huì)匹配所有以 .example.com 結(jié)尾的域名
server_name *.example.com;
# 【正則表達(dá)式匹配】
# 支持使用正則表達(dá)式進(jìn)行更復(fù)雜的匹配,如下配置可以捕獲并使用正則表達(dá)式中的部分內(nèi)容
server_name ~^www\.(?<domain>.+\.com)$;
# 對(duì)于字符串 "www.example.com",它將匹配成功,并提取出 "example" 作為 "domain" 的值

關(guān)于優(yōu)先級(jí)和匹配順序:

  當(dāng)有多個(gè) server_name 配置時(shí),Nginx 會(huì)根據(jù)配置文件中的順序以及域名匹配的優(yōu)先級(jí)來(lái)決定使用哪個(gè) server_name。

  匹配順序:準(zhǔn)確匹配 > 通配符在開(kāi)頭匹配成功 > 通配符在結(jié)尾時(shí)匹配server_name成功 > 正則表達(dá)式匹配成功。

 在以上四種匹配方式中,如果 server_name 被處于同一優(yōu)先級(jí)的匹配方式多次匹配成功,則首次匹配成功的虛擬主機(jī)處理請(qǐng)求。

若未配置 server_name:

  就默認(rèn)為空字符串 "",這意味著它不會(huì)匹配任何基于域名的請(qǐng)求

  如果沒(méi)有其他 server 塊匹配請(qǐng)求,那么請(qǐng)求將被這個(gè)默認(rèn) server 塊處理。

HTTPS 配置:

  當(dāng)配置 HTTPS 時(shí),通常需要為 server_name 指定相應(yīng)的 SSL 證書(shū)。

  例如:listen 443 ssl; server_name abc.com;表示監(jiān)聽(tīng) 443 端口(HTTPS)并為 abc.com 提供 SSL 加密。

重定向配置:

  有時(shí)需要將 HTTP 請(qǐng)求重定向到 HTTPS,可以通過(guò) rewrite 指令實(shí)現(xiàn),例如:rewrite ^(.*) https://$server_name$1 permanent;表示將所有 HTTP 請(qǐng)求永久重定向到 HTTPS。

怎樣使用基于 IP 地址的虛擬主機(jī)配置?比如訪問(wèn) 192.168.1.31 由虛擬主機(jī)一處理,訪問(wèn) 192.168.1.32 由虛擬主機(jī)二處理。

這時(shí)要先在網(wǎng)卡綁定別名,比如說(shuō)網(wǎng)卡之前綁定的 IP 是 192.168.1.30,現(xiàn)在將 192.168.1.31 和 192.168.1.32 這兩個(gè) IP 都綁定到這個(gè)網(wǎng)卡上,那么請(qǐng)求這個(gè)兩個(gè) IP 的請(qǐng)求才會(huì)到達(dá)這臺(tái)物理主機(jī),然后再通過(guò) Nginx 路由轉(zhuǎn)發(fā)到指定的虛擬主機(jī)。

綁定別名后進(jìn)行以下配置即可:

http {
	server {
		listen:  80;
		server_name:  192.168.1.31;
		...
	}
	server {
		listen:  80;
		server_name:  192.168.1.32;
		...
	}
}

5.4.3 location 塊

用于匹配不同的 uri 請(qǐng)求,并對(duì)這些請(qǐng)求執(zhí)行特定的操作。地址定向、數(shù)據(jù)緩存和應(yīng)答控制等功能都是在這部分實(shí)現(xiàn)。許多第三方模塊的配置也是在 location 塊中提供功能。

在 Nginx 的官方文檔中定義的 location 的語(yǔ)法結(jié)構(gòu)為:

location [ = | ~ | ~* | ^~ ] uri { ... }

其中,uri 變量是待匹配的請(qǐng)求字符串,可以是不含正則表達(dá)的字符串,如 /myserver.php 等;也可以是包含有正則表達(dá)的字符串,如 .php$(表示以.php結(jié)尾的URL)等。

方括號(hào)里的部分,是可選項(xiàng),用來(lái)改變請(qǐng)求字符串與 uri 的匹配方式。在不添加此選項(xiàng)時(shí),Nginx 服務(wù)器首先在 server 塊的多個(gè) location 塊中搜索是否有【 uri 】和請(qǐng)求字符串匹配,如果有多個(gè)可以匹配,就記錄匹配度最高的一個(gè)。然后,服務(wù)器再用 location 塊中的【正則 uri 】和請(qǐng)求字符串匹配,當(dāng)?shù)谝粋€(gè)正則 uri 匹配成功,結(jié)束搜索,并使用這個(gè) location 塊處理此請(qǐng)求;如果正則匹配全部失敗,就使用剛才記錄的匹配度最高的 location 塊處理此請(qǐng)求。

下邊看下可選項(xiàng)的具體意義:

  • =:用于 uri 前,要求請(qǐng)求字符串與 uri 完全一樣。如果已經(jīng)匹配成功,就停止繼續(xù)向下搜索并立即處理此請(qǐng)求;
  • ^~:用于 uri 前,直接使用匹配度最高的 location 處理請(qǐng)求,不再使用正則 uri 和請(qǐng)求字符串做匹配;
  • ~:用于表示 uri 包含正則表達(dá)式,并且區(qū)分大小寫(xiě)
  • ~*:用于表示 uri 包含正則表達(dá)式,并且不區(qū)分大小寫(xiě)。

注意:如果 uri 包含正則表達(dá)式,就必須要使用“~”或者“~*”標(biāo)識(shí)

另外,經(jīng)過(guò) URL 編碼的 uri 也是可以匹配成功的。比如空格被編碼為“%20”,問(wèn)號(hào)被編碼為“%3f”等。選項(xiàng)“~”自動(dòng)對(duì) uri 中的這些符號(hào)將會(huì)進(jìn)行編碼處理。比如,如果 location 塊收到的 uri 為“/html/%20/data”,則當(dāng) Nginx 服務(wù)器搜索到配置為“~ /html/ /data”的 location 時(shí),可以匹配成功。

  • root 指令

用于設(shè)置請(qǐng)求尋找資源的跟目錄。當(dāng)瀏覽器請(qǐng)求某個(gè)資源時(shí),Nginx 會(huì)根據(jù) root 指令指定的路徑和 location 匹配的路徑組合成完整的文件路徑,以此來(lái)查找并返回對(duì)應(yīng)的靜態(tài)資源。

此指令可以在 http 塊、server 塊或者 location 塊中配置。

由于使用 Nginx 服務(wù)器多數(shù)情況下要配置多個(gè) location 塊對(duì)不同的請(qǐng)求分別做出處理,因此該指令通常在 location 塊中進(jìn)行設(shè)置。

root path;

root 指令通常與 location 指令配合使用。例如,配置如下 location:

如果 location 塊指定為 location /flv/ { root /data/web; },那么當(dāng)請(qǐng)求的 URL 為 /flv/example.txt 時(shí),Nginx 會(huì)在 /data/web/flv/example.txt 的位置查找文件。

location /flv/ {
	root /data/web;
}

那么當(dāng)請(qǐng)求的 URL 為 /flv/example.txt 時(shí),Nginx 會(huì)在 /data/web/flv/example.txt 的位置查找文件。

  • alias 指令

與 root 指令類似,但 alias 不會(huì)將 location 的值添加到文件路徑的末尾,而是直接使用 alias 指定的路徑作為文件路徑。

  • index 指令

定義請(qǐng)求 uri 指向的默認(rèn)文件名。如果請(qǐng)求的是一個(gè)目錄,Nginx 會(huì)嘗試尋找此目錄下的 index 文件中的文件并將其作為響應(yīng)返回。

  • return 指令

根據(jù)條件返回指定的HTTP狀態(tài)碼。例如,如果請(qǐng)求的資源不存在,可以返回404狀態(tài)碼。

http 塊中的 error_page 允許你指定一個(gè)特定的頁(yè)面作為錯(cuò)誤響應(yīng),而 location快中的 return 則只能返回標(biāo)準(zhǔn)的錯(cuò)誤響應(yīng)代碼和消息。

六、一個(gè)配置文件的示例 + 簡(jiǎn)介

單擊打開(kāi) 配置示例和簡(jiǎn)介

配置詳解參考:https://www.cnblogs.com/54chensongxia/p/12938929.html

到此這篇關(guān)于Nginx 簡(jiǎn)介、安裝與配置文件詳解的文章就介紹到這了,更多相關(guān)Nginx 配置文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論