Nginx?簡介、安裝與配置文件詳解
〇、前言
在日常工作中,Nginx 的重要性當然不言而喻。
經(jīng)常用,但并不意味著精通,還會有很多不清楚的方式和技巧,那么本文就簡單匯總下,幫助自己理解。
一、Nginx 簡介
1.1 關(guān)于 Nginx
Nginx(發(fā)音為“Engine X”)是一款輕量級和高性能的 Web 服務(wù)器、反向代理服務(wù)器、電子郵件(IMAP/POP3/SMTP)代理服務(wù)器,是帶有 BSD-like 協(xié)議的開源產(chǎn)品。
另外,關(guān)于 BSD-like 協(xié)議,它為開發(fā)者和企業(yè)提供了極大的靈活性,在確保尊重原作者工作的同時,允許代碼的自由流通和使用,無論是在開源社區(qū)還是商業(yè)應(yīng)用中。
其特點包括:
- 輕量級:Nginx 以其輕量級和高效性而聞名,對系統(tǒng)資源的占用非常??;
- 高并發(fā)能力:Nginx 能夠處理大量的并發(fā)連接,這使得它在面對高流量網(wǎng)站時表現(xiàn)出色,在同類 Web 服務(wù)器中是領(lǐng)先的;
- 反向代理功能:作為反向代理服務(wù)器,Nginx 可以幫助提高網(wǎng)站的響應(yīng)速度和可用性,同時隱藏后端服務(wù)器的復雜性,這使得 Nginx 在負載均衡和緩存方面非常有用;
- 社區(qū)支持:作為一個開源項目,Nginx 擁有一個活躍的開發(fā)者和用戶社區(qū),這意味著它經(jīng)常得到更新和改進,以適應(yīng)不斷變化的網(wǎng)絡(luò)環(huán)境;
- 安全性:Nginx 提供了多種安全措施,包括 SSL/TLS 加密支持,以及限制請求速率等,幫助網(wǎng)站防御各種網(wǎng)絡(luò)攻擊;
- 廣泛應(yīng)用:全球范圍內(nèi),許多知名的大型網(wǎng)站和服務(wù)都在使用 Nginx,這證明了它的可靠性和性能。
Nginx 是基于 C 語言開發(fā)的,擁有高性能的基本保證。
1.2 相關(guān)概念簡介
1.2.1 正向代理和反向代理
正向代理主要是為了客戶端服務(wù),而反向代理則是為了服務(wù)器端的服務(wù)優(yōu)化和安全考慮,都可以明顯提高數(shù)據(jù)傳輸?shù)男?。它們的特點如下:
正向代理(Forward Proxy):
- 位于客戶端和目標服務(wù)器之間,主要用途是代替客戶端訪問外部網(wǎng)絡(luò),隱藏客戶端的真實IP地址,提高訪問速度,突破訪問控制等。
- 客戶端主動使用代理服務(wù)器,服務(wù)端不知道實際發(fā)起請求的客戶端。
- 常用于公司內(nèi)部網(wǎng)絡(luò),通過一個或多個代理服務(wù)器訪問互聯(lián)網(wǎng)資源,以節(jié)省帶寬、提高訪問速度或進行內(nèi)容過濾。
由于防火墻的原因,我們并不能直接訪問谷歌,那么我們可以借助 VPN 來實現(xiàn),這就是一個簡單的正向代理的例子。這里你能夠發(fā)現(xiàn),正向代理“代理”的是客戶端,而且客戶端是知道目標的,而目標是不知道客戶端是通過 VPN 訪問的。
反向代理(Reverse Proxy):
- 位于服務(wù)器端和客戶端之間,主要用于服務(wù)器端的負載均衡、緩存靜態(tài)內(nèi)容、加密和SSL加速、安全防護等。
- 服務(wù)器主動使用代理服務(wù)器,客戶端不知道實際提供服務(wù)的服務(wù)端。
- 常用于網(wǎng)站后端,將客戶端的請求轉(zhuǎn)發(fā)到內(nèi)部服務(wù)器,然后將響應(yīng)返回給客戶端,對外表現(xiàn)為統(tǒng)一的服務(wù)地址。
當我們在外網(wǎng)訪問百度的時候,其實會進行一個轉(zhuǎn)發(fā),代理到內(nèi)網(wǎng)去,這就是所謂的反向代理,即反向代理“代理”的是服務(wù)器端,而且這一個過程對于客戶端而言是無感的。
正向代理和反向代理的關(guān)系示意圖如下:
無論是正向代理還是反向代理,都適用 Cache(緩存)技術(shù)。比如反向代理服務(wù)器,可以緩存一些從服務(wù)端取到的實時性要求不太高的數(shù)據(jù),當客戶端訪問已緩存的數(shù)據(jù)且沒有過期,就會 Cache 命中,不用再重復去服務(wù)端去獲取,減少響應(yīng)等待時間。
詳情可參考:https://zhuanlan.zhihu.com/p/68560128
1.2.2 負載均衡
負載均衡(Load Balance),意思是將負載(工作任務(wù),訪問請求)進行平衡、分攤到多個操作單元(服務(wù)器,組件)上進行執(zhí)行。是達到高性能,解決單點故障(高可用),增加擴展性(水平伸縮)的終極解決方案。
舉個事例,在早高峰乘地鐵時候,緊挨小區(qū)的地鐵口人特別多,一般會有限流,還會有個地鐵工作人員用大喇叭在喊“著急的人員請走B口,B口人少車空”。那么,地鐵工作人員就是負責負載均衡的。
為了提升網(wǎng)站的各方面能力,我們一般會把多臺機器組成一個集群對外提供服務(wù)。然而,一般網(wǎng)站對外提供的訪問入口都是一個。比如 www.taobao.com,當用戶在瀏覽器輸入 www.taobao.com 的時候如何將用戶的請求分發(fā)到集群中不同的機器上呢?這就是負載均衡在做的事情。
如下圖中的代理,就可以是 nginx 服務(wù)器,接收到請求后,分配給服務(wù)集群:
根據(jù)負載均衡技術(shù)實現(xiàn)在 OSI 七層模型(7應(yīng)用層、6表示層、5會話層、4傳輸層、3網(wǎng)絡(luò)層、2數(shù)據(jù)鏈路層、1物理層)的不同層次,可以給負載均衡分類。常見的實現(xiàn)方式中,主要可以在應(yīng)用層、傳輸層、網(wǎng)絡(luò)層和數(shù)據(jù)傳輸層做文章。所以,工作在應(yīng)用層的負載均衡,我們通常稱之為七層負載均衡;工作在傳輸層的我們稱之為四層負載均衡。
大致可以分為以下幾種,其中最常用的是四層和七層負載均衡:
- 二層負載均衡(不同的 MAC)
負載均衡服務(wù)器對外依然提供一個 VIP(虛 IP),集群中不同的機器采用相同 IP 地址,但是機器的 MAC 地址不一樣。當負載均衡服務(wù)器接受到請求之后,通過改寫報文的目標 MAC 地址的方式將請求轉(zhuǎn)發(fā)到目標機器實現(xiàn)負載均衡。
- 三層負載均衡(不同的 IP)
和二層負載均衡類似,負載均衡服務(wù)器對外依然提供一個 VIP(虛 IP),但是集群中不同的機器采用不同的 IP 地址。當負載均衡服務(wù)器接受到請求之后,根據(jù)不同的負載均衡算法,通過 IP 將請求轉(zhuǎn)發(fā)至不同的真實服務(wù)器。
- 四層負載均衡(IP + Port 組合)
四層負載均衡工作在 OSI 模型的傳輸層,由于在傳輸層,只有 TCP/UDP 協(xié)議,這兩種協(xié)議中除了包含源 IP、目標 IP 以外,還包含源端口號及目的端口號。四層負載均衡服務(wù)器在接受到客戶端請求后,以后通過修改數(shù)據(jù)包的地址信息(IP+端口號)將流量轉(zhuǎn)發(fā)到應(yīng)用服務(wù)器。
- 七層負載均衡
七層負載均衡工作在 OSI 模型的應(yīng)用層,應(yīng)用層協(xié)議較多,常用 http、radius、dns 等。七層負載就可以基于這些協(xié)議來負載。這些應(yīng)用層協(xié)議中會包含很多有意義的內(nèi)容。比如同一個 Web 服務(wù)器的負載均衡,除了根據(jù) IP 加端口進行負載外,還可根據(jù)七層的 URL、瀏覽器類別、語言來決定是否要進行負載均衡。
Nginx:主要用來做七層負載均衡。Nginx 是一個網(wǎng)頁服務(wù)器,它能反向代理 HTTP, HTTPS, SMTP, POP3, IMAP 的協(xié)議鏈接,以及一個負載均衡器和一 個HTTP 緩存。
詳細可參考:http://chabaoo.cn/server/319705oz1.htm
二、Windows 安裝 Nginx
2.1 下載安裝包
官網(wǎng)下載頁:nginx: download
可下載穩(wěn)定版:
另外 Mainline version 主線版本為新版的,Legacy version 歷史版本,可按需下載。
安裝包中的目錄與對應(yīng)功能:
2.2 開啟和關(guān)閉 Nginx 服務(wù)
Nginx 默認監(jiān)聽當前服務(wù)器的 80 端口,如下圖:(配置文件路徑示例:C:\nginx-1.24.0\conf\nginx.conf)
因此可先看下 80 端口有沒有被占用。方法是打開 cmd 窗口,用命令(...>netstat -ano)來查看當前端口使用情況,最后一列為 PID。使用命令(...>taskkill /f /t /pid PID編號)結(jié)束對應(yīng)的進程。如果占用 80 端口的是一個關(guān)鍵進程關(guān)不掉,那么就是惹不起得躲,將 Nginx 配置文件中的 80 端口改掉。
- 開啟服務(wù)
可以通過雙擊 nginx.exe,也可以通過命令的方式,如下在 Nginx 的主目錄地址欄輸入 cmd,并回車:
打開命令行窗口,路徑是在當前文件夾,如下圖,然后輸入命令:nginx 或者 start nginx 開啟服務(wù):
然后在地址欄輸入:http://localhost:80,查看服務(wù)是否啟動成功。
- 關(guān)閉服務(wù)
需要另開一個命令窗口通過命令(...>nginx -s stop)進行關(guān)閉。
參考:http://chabaoo.cn/program/319707u0k.htm
三、Linux 安裝 Nginx
3.1 下載和解壓
// 進入 opt 目錄,暫存安裝包 cd /opt // 下載 nginx 包,示例下載版本為 1.24.0 可根據(jù)實際修改 wget http://nginx.org/download/nginx-1.24.0.tar.gz // 創(chuàng)建目錄,用于存放 nginx 文件 mkdir /usr/local/nginxtest // 解壓安裝包內(nèi)容 // -zxvf:解壓詳細配置,略 // -C:解壓到指定目錄,后邊跟的是目標目錄 tar -zxvf nginx-1.24.0.tar.gz -C /usr/local/nginxtest
3.2 初始化與開啟服務(wù)
- 初始化和安裝
// 進入解壓后文件存放的文件夾 cd /usr/local/nginxtest/nginx-1.24.0 // 配置 nginx 編輯環(huán)境 ./configure // 編譯并安裝 make && make install
編譯安裝完成后,在 /usr/local/ 目錄下會自動生成一個 nginx 目錄,代表安裝成功。
- 開啟服務(wù)
// 進入 sbin 目錄 cd /usr/local/nginx/sbin/ // 啟動 Nginx 服務(wù) ./nginx
瀏覽器輸入服務(wù) IP,默認 80 端口:
3.3 異常提示:checking for C compiler ... not found
在執(zhí)行命令./configure
來配置 nginx 編輯環(huán)境時,如下異常提示:
[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,它是一個能夠編譯多種語言的編譯器。最開始 gcc 是作為 C 語言的編譯器(GNU C Compiler),現(xiàn)在除了 C 語言,還支持 C++、java、Pascal 等語言,gcc 還支持多種硬件平臺。
3.4 異常提示:the HTTP rewrite module requires the PCRE library.
在執(zhí)行命令./configure
來配置 nginx 編輯環(huán)境時,如下異常提示:
./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 庫(Perl Compatible Regular Expressions Library)是一個正則表達式庫,提供了與 Perl 語言兼容的正則表達式功能。它被廣泛用于各種編程語言和軟件中,用于處理字符串匹配、搜索、替換等操作。
如何解決:
yum -y install openssl openssl-devel
openssl 命令是強大的安全套接字層密碼庫。OpenSSL 是一種開源命令行工具,通常用于生成私鑰,創(chuàng)建 CSR,安裝 SSL / TLS 證書以及標識證書信息等等。通過使用 OpenSSL,用戶可以保護自己的數(shù)據(jù)不受未授權(quán)訪問,并確保通信的安全性。
參考:http://chabaoo.cn/article/140266.htm http://chabaoo.cn/article/106810.htm
四、常用命令(Windows、Linux 對比)
- 檢查配置文件是否配置成功,再開啟服務(wù)前執(zhí)行
// windows nginx -t // 小寫 t:檢查配置文件并顯示文件路徑;大寫 T:還額外顯示全部配置項和支持的文件類型 .\nginx -t nginx -c filename // 設(shè)置配置文件(默認是:/nginx/conf/nginx.conf) // Linux ./nginx -t ./nginx -c filename // 設(shè)置配置文件(默認是:/nginx/conf/nginx.conf)
- 開啟服務(wù)
// Windows nginx // 命令行運行(當前窗口關(guān)掉,不影響運行) .\nginx // 命令行運行(當前窗口關(guān)掉,不影響運行) start nginx // 后臺運行 // Linux ./nginx // 后臺運行
- 停止服務(wù)
// windows nginx -s quit // 等待任務(wù)完成后停止 .\nginx -s quit nginx -s stop // 強制停止 .\nginx -s stop // linux ./nginx -s quit // 等待任務(wù)完成后停止 ./nginx -s stop // 強制停止
- 重啟服務(wù)
// windows nginx -s reload .\nginx -s reload // linux ./nginx -s reload
- 查看版本
// 小寫 v:僅顯示版本;大寫 V:除了版本信息還顯示配置信息 // windows nginx -v .\nginx -v // linux ./nginx -v
- 查看 nginx 進程,以及關(guān)閉指定進程
// windows tasklist /fi "imagename eq nginx.exe" // 查看進程,包含 PID // fi:Filter 過濾器/篩選器 tskill PID數(shù)值 // 關(guān)閉指定進程 taskkill /im nginx.exe /f // 根據(jù)映像名稱關(guān)閉同名的全部進程 // im:映像名稱 f:強制 t:一起結(jié)束進程樹 taskkill /f /t /fi "imagename eq nginx.exe" // 根據(jù)映像名稱關(guān)閉同名的全部進程 // linux pgrep nginx // 根據(jù)進程名查詢 PID ps -ef | grep nginx // 根據(jù)進程名查詢詳細信息 // e:全部進程 f:顯示完整格式 kill PID數(shù)值 // 關(guān)閉指定 PID 的進程,以及子進程 pkill nginx // 根據(jù)進程名關(guān)閉 killall nginx // 關(guān)閉根據(jù)進程名得到的全部匹配項
- reopen 重新打開日志文件
當 nginx 日志文件內(nèi)容較多時,一般需要按天切割文件,每天的日志放在一個文件中,并用日期命名,方便日后查找。但是簡單的把文件移動并重新命名是無法及時生效的,因為在 linux 下的文件句柄,文件在被打開的情況下 mv 移走文件,操作這個文件的進程還是有這個文件的信息,原進程還是讀寫原來的文件。因此簡單的 mv 無法生效也就無法完成我們想要的文件分割。
此時就需要根據(jù)以下步驟:先移走文件并重命名;再利用 nginx 的 reopen 功能,完成新日志文件的生成。
// windows ren access.log access_20240410.log // 進入 logs 文件夾 ren 重命名日志文件 nginx -s reopen // 返回 nginx 目錄后,重新生成新的日志文件 .\nginx -s reopen // linux mv /usr/local/nginx/logs/access.log /usr/local/nginx/logs/access20240410.log // 通過絕對路徑重命名 ./nginx -s reopen // 重新生成新的日志文件 cd .. // 進入 logs 文件夾查看日志文件 cd logs ls // 結(jié)果:access20240410.log access.log error.log nginx.pid
五、配置文件
Nginx 的主配置文件是 nginx.conf,這個配置文件一共由三部分組成,分別為全局塊、events 塊和 http 塊。
在 http 塊中,又包含 http 全局塊、多個 server 塊。每個 server 塊中,可以包含 server 全局塊和多個 location 塊。在同一配置塊中嵌套的配置塊,各個之間不存在次序關(guān)系。
配置文件支持大量可配置的指令,絕大多數(shù)指令不是特定屬于某一個塊的。同一個指令放在不同層級的塊中,其作用域也不同。
一般情況下,高一級塊中的指令可以作用于自身所在的塊和此塊包含的所有低層級塊。如果某個指令在兩個不同層級的塊中同時出現(xiàn),則采用“就近原則”,即以較低層級塊中的配置為準。比如,某指令同時出現(xiàn)在 http 全局塊中和 server 塊中,并且配置不同,則應(yīng)該以 server 塊中的配置為準。
5.1 全局塊
全局塊是默認配置文件從開始到events塊之間的一部分內(nèi)容,主要設(shè)置一些影響Nginx服務(wù)器整體運行的配置指令,因此,這些指令的作用域是Nginx服務(wù)器全局。
通常包括配置運行 Nginx 服務(wù)器的用戶(組)、允許生成的 worker process 數(shù)、Nginx 進程 PID 存放路徑、日志的存放路徑和類型以及配置文件引入等。
# 指定可以運行 nginx 服務(wù)的用戶和用戶組 # user [user] [group] # 將user指令注釋掉,或者配置成 nobody 的話所有用戶都可以運行 # user nobody nobody; # user 指令在 Windows 上不生效,如果指定具體用戶和用戶組會報警告 # nginx: [warn] "user" is not supported, ignored in D:\software\nginx-1.18.0/conf/nginx.conf:2 user root; # 指定并發(fā)工作的進程數(shù),可以配置具體數(shù)字,也可使用自動模式 # worker_processes number | auto; # 如下配置:指定 4 個工作進程,此時會生成一個 master 進程和 4 個工作進程,總共五個 # 因此,可以配置工作進程數(shù)為本機 CPU 核心數(shù) n -1 worker_processes 4; # 指定包含 nginx 主進程的 PID 數(shù)值的文件路徑 # 用途:進程管理、監(jiān)控與診斷、方便進行自動化腳本控制 pid logs/nginx.pid; # 指定錯誤日志的路徑和日志級別 # error_log [path] [debug | info | notice | warn | error | crit | alert | emerg] # 其中debug級別的日志需要編譯時使用--with-debug開啟debug開關(guān) error_log logs/error.log info; # 此指令可以在(全局塊 < http 塊 < server 塊 < location 塊)中配置,下面簡單介紹下區(qū)別: # 首先就是,配置在越低級的塊中優(yōu)先級越高; # 各個級別的配置塊中設(shè)置的日志指令,將應(yīng)用于各自所有下級; # server 塊的配置,目的是不同的服務(wù)器配置不同的日志文件或日志級別; # location 塊是最具體的配置級別,它可為特定的 URI 路徑或模式設(shè)置專門的日志指令。
5.2 events 塊
events 塊涉及的指令主要影響 Nginx 服務(wù)器與用戶的網(wǎng)絡(luò)連接。
常用到的設(shè)置包括:
- 是否開啟對多 worker process 下的網(wǎng)絡(luò)連接進行序列化;
- 是否允許同時接收多個網(wǎng)絡(luò)連接;
- 選取哪種事件驅(qū)動模型處理連接請求;
- 每個worker process可以同時支持的最大連接數(shù)等。
# 當某一時刻只有一個網(wǎng)絡(luò)連接到來時,【多個睡眠進程】會被同時喚醒,但只有【一個進程】可獲得連接 # 如果【每次喚醒的進程數(shù)目太多】,會影響一部分系統(tǒng)性能 # 開啟的時候,將會對多個 Nginx 進程接收連接進行序列化,【防止多個進程對連接的爭搶】 # 有兩個枚舉值,默認是開啟狀態(tài),因此可以不進行專門配置 # accept_mutex on | off; accept_mutex on; # multi_accept 配置,決定了當有多個工作進程監(jiān)聽同一個端口時,這些進程如何處理到來的新請求,語法: # multi_accept on | off; # off 時:當有新連接到來時,【所有等待的工作進程都會被喚醒】來接受連接,這樣可以【提高處理效率】,尤其是在高并發(fā)的場景下 # on 時:當有新連接到來時,【只有一個工作進程數(shù)會被喚醒】,其他仍處于休眠狀態(tài) ,目的是【控制資源的使用】,避免在高并發(fā)情況下系統(tǒng)資源的過度消耗 # 如果在支持 kqueue 高效多路復用機制的操作系統(tǒng)(FreeBSD、macOS 等)上運行 Nginx,那么這條指令會被忽略 # 【默認是 off 狀態(tài)】 multi_accept off; # 指定使用哪種網(wǎng)絡(luò) IO 模型,影響到 Nginx 處理并發(fā)連接的能力,語法: # use method # 其中 method 可選擇的內(nèi)容有: # 【W(wǎng)indows 默認 select】【Linux 默認 epoll】【FreeBSD 默認 kqueue】 # select:這是最基本的網(wǎng)絡(luò) IO 模型,適用于低并發(fā)場景,它在處理大量連接時可能會變得效率低下 # 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:這是一種實時信號驅(qū)動的網(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è)置允許每一個 worker process 同時開啟的最大連接數(shù) # 當每個工作進程接受的連接數(shù)超過這個值時將不再接收連接,當所有的工作進程都接收滿時,連接進入 logback,logback 滿后連接被拒絕 worker_connections 1024; # 注意:worker_connections * worker_process <= 系統(tǒng)的最大打開文件數(shù) # worker_connections <= 單個進程支持打開的最大文件數(shù) # 下文繼續(xù)詳解...
關(guān)于全局和單進程最大打開文件數(shù):
# 【全局限制】 # Linux 下執(zhí)行:cat /proc/sys/fs/file-nr # 打印出結(jié)果:960 0 3228075 # 第三個數(shù)字 3228075 就是當前系統(tǒng)的全局最大打開文件數(shù)(Max Open Files) # 也可以自行修改這個數(shù)值,用 root 權(quán)限修改 /etc/sysctl.conf 文件 # fs.file-max = 3228075 # net.ipv4.ip_conntrack_max = 3228075 # net.ipv4.netfilter.ip_conntrack_max = 3228075 # 【進程限制】 # Linux 下執(zhí)行:ulimit -n # 打印出結(jié)果:655350 # 臨時修改(需 root 用戶):ulimit -n 3228075 # 永久修改: # 打開文件 /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ù)的功能和第三方模塊的配置都可以放在這個模塊中。
http 塊中可以包含自己的全局塊,其中配置的指令包括文件引入、MIME-Type 定義、日志自定義、是否使用 sendfile 傳輸文件、連接超時時間、單連接請求數(shù)上限等。
# include 指令,用于包含其他的配置文件,提高配置可讀性,避免單個配置文件過大,但必須符合配置規(guī)范 # 下面的指令將 mime.types 包含進來,mime.types 和 nginx.conf 同級目錄,不同級的話需要指定具體路徑 include mime.types; # 瀏覽器可以顯示的內(nèi)容有 HTML、XML、GIF 及 Flash 等種類繁多的文本、媒體等資源,瀏覽器為區(qū)分這些資源,需要使用MIME Type # 換言之,MIME Type 是網(wǎng)絡(luò)資源的媒體類型。Nginx 服務(wù)器作為 Web 服務(wù)器,必須能夠識別前端請求的資源類型 # default_type 指令默認類型,如果不加此指令【默認值為 text/plain】 # 當 Web 程序無法識別對應(yīng)文件 MIME 類型時,Nginx 會使用 default_type 指定的類型來告訴瀏覽器如何處理這個文件 # application/octet-stream,這是一種通用的二進制流數(shù)據(jù)類型,通常用于未知或未指定類型的文件,瀏覽器不會直接打開未知文件,而是提示下載 # 這樣可以確保在沒有明確指定 MIME 類型的情況下,用戶不會被誤導直接在瀏覽器中打開可能是執(zhí)行代碼的文件,更加安全 # 此指令還可以在 http 塊、server 塊或者 location 塊中進行配置 default_type application/octet-stream; # log_format 指令,用于定義日志格式,變量意義見后文表格 # main 為定義的格式名稱,這樣 access_log 就可以直接使用這個變量了 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 指令 # 在全局塊中,我們介紹過 errer_log 指令,其用于配置 Nginx 進程運行時的日志存放和級別 # 此處所指的日志與常規(guī)的不同,它是指記錄 Nginx 服務(wù)器【提供服務(wù)過程應(yīng)答前端請求的日志】 # buffer=size:設(shè)置內(nèi)存緩存區(qū)的大小,不實時寫入日志文件,可以減少磁盤 I/O 操作的次數(shù) # access_log path [format [buffer=size]] # 如果你要關(guān)閉 access_log,你可以使用下面的命令:access_log off; # 此指令可以在 http 塊、server 塊或者 location 塊中進行設(shè)置 access_log logs/access.log main; # sendfile 指令用于配置,是否使用 sendfile()系統(tǒng)調(diào)用來高效的傳輸文件數(shù)據(jù),【特別適合于提供靜態(tài)內(nèi)容的場景】,語法: # sendfile on | off; # 【默認值是 off】但在大多數(shù)提供靜態(tài)內(nèi)容的 Nginx 服務(wù)器上,建議將其設(shè)置為 on 以利用其帶來的性能優(yōu)勢 # sendfile()系統(tǒng)調(diào)用模式,允許內(nèi)核直接將文件數(shù)據(jù)從磁盤傳輸?shù)骄W(wǎng)絡(luò) socket,而非先將數(shù)據(jù)讀取到用戶空間緩沖區(qū),再寫入到 socket 的內(nèi)核緩沖區(qū) # 這樣可以減少數(shù)據(jù)在用戶空間和內(nèi)核空間之間的拷貝次數(shù),從而顯著提高靜態(tài)文件傳輸?shù)男? # 此指令可以在 http 塊、server 塊或者 location 塊中進行配置 sendfile on; # sendfile_max_chunk 指令用于限制每個 sendfile()調(diào)用傳輸數(shù)據(jù)的最大塊大小,語法: # 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 進程的每個 worker process 每次調(diào)用 sendfile()傳輸?shù)臄?shù)據(jù)量最大不能超過這個值 # 如果設(shè)置為0,則無限制【默認值為 0】 # 此指令可以在 http 塊、server 塊或 location 塊中配置 sendfile_max_chunk 128k; # 配置連接超時時間,與用戶建立會話連接后,Nginx 服務(wù)器可以保持這些連接打開一段時間,語法: # keepalive_timeout timeout [header_timeout] # timeout:服務(wù)器端對連接的保持時間【默認值為 75s】針對的是整個 TCP 連接的生命周期 # header_timeout:為可選項,是 timeout 的一個子集,在應(yīng)答報文頭部的 Keep-Alive 域設(shè)置超時時間,僅控制發(fā)送響應(yīng)頭之后的保持時間 # 此指令可以在 http 塊、server 塊或 location 塊中配置 # 下面配置的含義是,在服務(wù)器端保持連接的時間設(shè)置為 120s,發(fā)給用戶端的應(yīng)答報文頭部中 Keep-Alive 域的超時時間設(shè)置為 100s keepalive_timeout 120s 100s; # keepalive_requests 指令配置【單連接請求數(shù)上限】達到上限后自動關(guān)閉 # 【默認值為100】這意味著在默認配置下,Nginx 會在處理了100個請求后關(guān)閉長連接 # 此指令可以在 http 塊、server 塊或 location 塊中配置 keepalive_requests 100; # error_page 指令用于定義在出現(xiàn)特定錯誤時 Nginx 應(yīng)該如何響應(yīng) # 當發(fā)生錯誤時,如請求的資源不存在(404錯誤)或服務(wù)器內(nèi)部錯誤(500錯誤),Nginx 可以使用 error_page 指令來定制錯誤響應(yīng) # error_page <HTTP_Error> <value1> <value2>; # <HTTP_Error>:表示要處理的 HTTP 錯誤狀態(tài)碼,如 404、500 等 # <value1>:表示當出現(xiàn) <HTTP_Error> 錯誤時,Nginx 返回的錯誤頁面的 uri # <value2>:可選參數(shù),表示是否允許重新定義該錯誤頁面。默認為“=”,即允許重新定義。如果設(shè)置為“=@”,則表示不允許重新定義 error_page 404 /404.html; # http 塊中的 error_page 允許你指定一個特定的頁面作為錯誤響應(yīng),而 location快中的 return 則只能返回標準的錯誤響應(yīng)代碼和消息
log_fomat 變量值定義:
參數(shù)名 | 參數(shù)意義 |
$remote_addr | 客戶端 IP |
$remote_user | 遠程客戶端用戶名,一般為:‘-’ |
$time_local | 時間和時區(qū) |
$request | 請求的 url 以及 method |
$status | 響應(yīng)狀態(tài)碼 |
$body_bytes_send | 響應(yīng)客戶端內(nèi)容字節(jié)數(shù) |
$http_referer | 記錄用戶從哪個鏈接跳轉(zhuǎn)過來的 |
$http_user_agent | 用戶所使用的代理,一般來時都是瀏覽器 |
$http_x_forwarded_for | 通過代理服務(wù)器來記錄客戶端的 IP |
5.4 server 塊
server 塊和“虛擬主機”的概念有密切聯(lián)系。
虛擬主機,又稱虛擬服務(wù)器、主機空間或是網(wǎng)頁空間,該技術(shù)是為了節(jié)省互聯(lián)網(wǎng)服務(wù)器硬件成本而出現(xiàn)。這里的“主機”或“空間”是由實體的服務(wù)器延伸而來,硬件系統(tǒng)可以基于服務(wù)器群,或者單個服務(wù)器等。虛擬主機技術(shù)主要應(yīng)用于 HTTP、FTP 及 EMAIL 等多項服務(wù),將一臺服務(wù)器的某項或者全部服務(wù)內(nèi)容邏輯劃分為多個服務(wù)單位,對外表現(xiàn)為多個服務(wù)器,從而充分利用服務(wù)器硬件資源。從用戶角度來看,一臺虛擬主機和一臺獨立的硬件主機是完全一樣的。
在使用 Nginx 服務(wù)器提供 Web 服務(wù)時,利用虛擬主機的技術(shù),就可以在同一臺服務(wù)器上只運行一組 Nginx 進程,來對應(yīng)運行多個網(wǎng)站。
每一個 http 塊都可以包含多個 server 塊,而每個 server 塊就相當于一臺虛擬主機,它內(nèi)部可有多臺主機聯(lián)合提供服務(wù),一起對外提供一組邏輯上關(guān)系密切的服務(wù)(或網(wǎng)站)。
和 http 塊相同,server 塊也可以包含自己的全局塊,同時可以包含多個 location 塊。在 server 全局塊中,最常見的兩個配置項是本虛擬主機的監(jiān)聽配置和本虛擬主機的名稱或 IP 配置。
5.4.1 listen 指令
server 塊中最重要的指令就是 listen 指令,這個指令有三種配置語法。這個指令默認的配置值是:listen *:80 | *:8000;只能在server塊種配置這個指令。
# 【三種格式】 # 第一種 # 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]]; # 第三種(可以不用重點關(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ù)說明:
- address:監(jiān)聽的 IP 地址(請求來源的 IP 地址),如果是 IPv6 的地址,需要使用中括號“[]”括起來,比如 [fe80::1] 等;
- port:端口號,為空時默認 80 端口。若未配置 listen 指令,那么如果 Nginx 以超級用戶權(quán)限運行,則使用 *:80,否則使用 *:8000。多個虛擬主機可以同時監(jiān)聽同一個端口,但是 server_name 需要設(shè)置成不一樣;
- default_server:假如通過 Host 沒匹配到對應(yīng)的虛擬主機,則通過這臺虛擬主機處理;
- backlog=number:設(shè)置監(jiān)聽函數(shù) listen() 最多允許多少網(wǎng)絡(luò)連接同時處于掛起狀態(tài),在 FreeBSD 中默認為 -1,其他平臺默認為 511;
- accept_filter=filter:設(shè)置監(jiān)聽端口對請求的過濾,被過濾的內(nèi)容不能被接收和處理。本指令只在 FreeBSD 和 NetBSD 5.0+ 平臺下有效。filter 可以設(shè)置為 dataready 或 httpready,詳情可參閱 Nginx 的官方文檔;
- bind:標識符,使用獨立的 bind() 處理此 address:port;一般情況下,對于端口相同而 IP 地址不同的多個連接,Nginx 服務(wù)器將只使用一個監(jiān)聽命令,并使用 bind() 處理端口相同的所有連接;
- ssl:標識符,設(shè)置會話連接使用 SSL 模式進行,此標識符和 Nginx 服務(wù)器提供的 HTTPS 服務(wù)有關(guān)
listen 指令的格式看起來比較復雜,但在實際應(yīng)用中并不會進行太復雜的配置。
如下幾個簡單的配置,可以單獨制定 IP,單獨指定端口或者同時指定 IP 和端口:
# 只監(jiān)聽來自 127.0.0.1 這個 IP,請求 8000 端口的請求 listen 127.0.0.1:8000; listen localhost:8000; # 只監(jiān)聽來自 127.0.0.1 這個 IP,請求 80 端口的請求(不指定端口,默認 80) listen 127.0.0.1; # 監(jiān)聽來自所有 IP,請求 8000 端口的請求 listen 8000; listen *:8000;
5.4.2 server_name 指令
用于指定虛擬主機的域名,它決定了請求將被路由到哪個服務(wù)器塊處理。語法是:
# 【基本使用】 # 配置一個或多個具體的域名,以空格分隔,表示 Nginx 可接受指向這些域名的請求 # server_name name1 name2 ...; server_name example.com www.example.com; # 【通配符匹配】 # 使用通配符 * 只能用來匹配域名的【開頭或結(jié)尾】部分,如下配置會匹配所有以 .example.com 結(jié)尾的域名 server_name *.example.com; # 【正則表達式匹配】 # 支持使用正則表達式進行更復雜的匹配,如下配置可以捕獲并使用正則表達式中的部分內(nèi)容 server_name ~^www\.(?<domain>.+\.com)$; # 對于字符串 "www.example.com",它將匹配成功,并提取出 "example" 作為 "domain" 的值
關(guān)于優(yōu)先級和匹配順序:
當有多個 server_name 配置時,Nginx 會根據(jù)配置文件中的順序以及域名匹配的優(yōu)先級來決定使用哪個 server_name。
匹配順序:準確匹配 > 通配符在開頭匹配成功 > 通配符在結(jié)尾時匹配server_name成功 > 正則表達式匹配成功。
在以上四種匹配方式中,如果 server_name 被處于同一優(yōu)先級的匹配方式多次匹配成功,則首次匹配成功的虛擬主機處理請求。
若未配置 server_name:
就默認為空字符串 "",這意味著它不會匹配任何基于域名的請求。
如果沒有其他 server 塊匹配請求,那么請求將被這個默認 server 塊處理。
HTTPS 配置:
當配置 HTTPS 時,通常需要為 server_name 指定相應(yīng)的 SSL 證書。
例如:listen 443 ssl; server_name abc.com;
表示監(jiān)聽 443 端口(HTTPS)并為 abc.com 提供 SSL 加密。
重定向配置:
有時需要將 HTTP 請求重定向到 HTTPS,可以通過 rewrite 指令實現(xiàn),例如:rewrite ^(.*) https://$server_name$1 permanent;
表示將所有 HTTP 請求永久重定向到 HTTPS。
怎樣使用基于 IP 地址的虛擬主機配置?比如訪問 192.168.1.31 由虛擬主機一處理,訪問 192.168.1.32 由虛擬主機二處理。
這時要先在網(wǎng)卡綁定別名,比如說網(wǎng)卡之前綁定的 IP 是 192.168.1.30,現(xiàn)在將 192.168.1.31 和 192.168.1.32 這兩個 IP 都綁定到這個網(wǎng)卡上,那么請求這個兩個 IP 的請求才會到達這臺物理主機,然后再通過 Nginx 路由轉(zhuǎn)發(fā)到指定的虛擬主機。
綁定別名后進行以下配置即可:
http { server { listen: 80; server_name: 192.168.1.31; ... } server { listen: 80; server_name: 192.168.1.32; ... } }
5.4.3 location 塊
用于匹配不同的 uri 請求,并對這些請求執(zhí)行特定的操作。地址定向、數(shù)據(jù)緩存和應(yīng)答控制等功能都是在這部分實現(xiàn)。許多第三方模塊的配置也是在 location 塊中提供功能。
在 Nginx 的官方文檔中定義的 location 的語法結(jié)構(gòu)為:
location [ = | ~ | ~* | ^~ ] uri { ... }
其中,uri 變量是待匹配的請求字符串,可以是不含正則表達的字符串,如 /myserver.php 等;也可以是包含有正則表達的字符串,如 .php$(表示以.php結(jié)尾的URL)等。
方括號里的部分,是可選項,用來改變請求字符串與 uri 的匹配方式。在不添加此選項時,Nginx 服務(wù)器首先在 server 塊的多個 location 塊中搜索是否有【 uri 】和請求字符串匹配,如果有多個可以匹配,就記錄匹配度最高的一個。然后,服務(wù)器再用 location 塊中的【正則 uri 】和請求字符串匹配,當?shù)谝粋€正則 uri 匹配成功,結(jié)束搜索,并使用這個 location 塊處理此請求;如果正則匹配全部失敗,就使用剛才記錄的匹配度最高的 location 塊處理此請求。
下邊看下可選項的具體意義:
- =:用于 uri 前,要求請求字符串與 uri 完全一樣。如果已經(jīng)匹配成功,就停止繼續(xù)向下搜索并立即處理此請求;
- ^~:用于 uri 前,直接使用匹配度最高的 location 處理請求,不再使用正則 uri 和請求字符串做匹配;
- ~:用于表示 uri 包含正則表達式,并且區(qū)分大小寫;
- ~*:用于表示 uri 包含正則表達式,并且不區(qū)分大小寫。
注意:如果 uri 包含正則表達式,就必須要使用“~”或者“~*”標識
另外,經(jīng)過 URL 編碼的 uri 也是可以匹配成功的。比如空格被編碼為“%20”,問號被編碼為“%3f”等。選項“~”自動對 uri 中的這些符號將會進行編碼處理。比如,如果 location 塊收到的 uri 為“/html/%20/data”,則當 Nginx 服務(wù)器搜索到配置為“~ /html/ /data”的 location 時,可以匹配成功。
- root 指令
用于設(shè)置請求尋找資源的跟目錄。當瀏覽器請求某個資源時,Nginx 會根據(jù) root 指令指定的路徑和 location 匹配的路徑組合成完整的文件路徑,以此來查找并返回對應(yīng)的靜態(tài)資源。
此指令可以在 http 塊、server 塊或者 location 塊中配置。
由于使用 Nginx 服務(wù)器多數(shù)情況下要配置多個 location 塊對不同的請求分別做出處理,因此該指令通常在 location 塊中進行設(shè)置。
root path;
root 指令通常與 location 指令配合使用。例如,配置如下 location:
如果 location 塊指定為 location /flv/ { root /data/web; },那么當請求的 URL 為 /flv/example.txt 時,Nginx 會在 /data/web/flv/example.txt 的位置查找文件。
location /flv/ { root /data/web; }
那么當請求的 URL 為 /flv/example.txt
時,Nginx 會在 /data/web/flv/example.txt
的位置查找文件。
- alias 指令
與 root 指令類似,但 alias 不會將 location 的值添加到文件路徑的末尾,而是直接使用 alias 指定的路徑作為文件路徑。
- index 指令
定義請求 uri 指向的默認文件名。如果請求的是一個目錄,Nginx 會嘗試尋找此目錄下的 index 文件中的文件并將其作為響應(yīng)返回。
- return 指令
根據(jù)條件返回指定的HTTP狀態(tài)碼。例如,如果請求的資源不存在,可以返回404狀態(tài)碼。
http 塊中的 error_page 允許你指定一個特定的頁面作為錯誤響應(yīng),而 location快中的 return 則只能返回標準的錯誤響應(yīng)代碼和消息。
六、一個配置文件的示例 + 簡介
單擊打開 配置示例和簡介
配置詳解參考:https://www.cnblogs.com/54chensongxia/p/12938929.html
到此這篇關(guān)于Nginx 簡介、安裝與配置文件詳解的文章就介紹到這了,更多相關(guān)Nginx 配置文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
nginx 502、413和404錯誤原因排查和解決辦法總結(jié)
這篇文章主要給大家介紹了NGINX 502錯誤排查,辦法總結(jié),Nginx 413錯誤的排查以及Nginx 400錯誤排查,文中通過代碼示例給出了詳細的排查方法和解決方案,需要的朋友可以參考下2023-12-12利用Nginx_geo模塊實現(xiàn)CDN調(diào)度的配置方法
今天小編就為大家分享一篇利用Nginx_geo模塊實現(xiàn)CDN調(diào)度的配置方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08nginx如何實現(xiàn)同個ip、端口訪問不同的項目(以路徑區(qū)分項目)
這篇文章主要介紹了nginx如何實現(xiàn)同個ip、端口訪問不同的項目(以路徑區(qū)分項目),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12Nginx 壓縮(gzip、gunzip、gzip_static、send_file)的實現(xiàn)
在Web應(yīng)用開發(fā)中,優(yōu)化網(wǎng)站速度是一個非常重要的工作,本文主要介紹了Nginx 壓縮(gzip、gunzip、gzip_static、send_file)的實現(xiàn),感興趣的可以了解一下2024-09-09