Nginx-文章總綱
友情鏈接
1、基礎(chǔ)篇:ngxin 的簡介,安裝,目錄說明,配置文件詳解(理論為主)
http://www.itdecent.cn/p/d46dc6bce6ed
2、應(yīng)用篇:靜態(tài)部署,后端配置,反向代碼,負(fù)載均衡,緩存集成(實(shí)操為主)
http://www.itdecent.cn/p/3a39e18550b5
3、集群篇:集群搭建,高可用解決方案,制作下載站點(diǎn)和用戶認(rèn)證(提升)
http://www.itdecent.cn/p/2e9ca678ef73
4、模塊篇:ngx-lua的結(jié)合使用,lua基本語法介紹(綜合)
http://www.itdecent.cn/p/2e9ca678ef73
一、Nginx簡介
1、背景介紹:
Nginx(“engine x”)一個(gè)具有高性能的【HTTP】和【反向代理】的【W(wǎng)EB服務(wù)器】,同時(shí)也是一【POP3/SMTP/IMAP代理服務(wù)器】,是由伊戈?duì)枴べ愃饕?俄羅斯人)使用C語言編寫的,Nginx的第一個(gè)版本是
2004年10月4號發(fā)布的0.1.0版本。另外值得一提的是伊戈?duì)枴べ愃饕驅(qū)ginx的源碼進(jìn)行了開源,這也為Nginx的發(fā)展提供了良好的保障。
2、涉及的名詞解釋
(1)1. WEB服務(wù)器:
WEB服務(wù)器也叫網(wǎng)頁服務(wù)器,英文名叫Web Server,主要功能是為用戶
提供網(wǎng)上信息瀏覽服務(wù)。
(2)2. HTTP:
HTTP是超文本傳輸協(xié)議的縮寫,是用于從WEB服務(wù)器傳輸超文本到本地瀏覽器的傳輸協(xié)議,也是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議。HTTP是一個(gè)客戶端和服務(wù)器端請求和應(yīng)答的標(biāo)準(zhǔn),客戶端是終端用戶,服務(wù)端是網(wǎng)站,通過使用Web瀏覽器、網(wǎng)絡(luò)爬蟲或者其他工具,客戶端發(fā)起一個(gè)到服務(wù)器上指定端口的HTTP請求。
(3)3. POP3/SMTP/IMAP:
POP3(Post Offic Protocol 3)郵局協(xié)議的第三個(gè)版本,SMTP(Simple Mail Transfer Protocol)簡單郵件傳輸協(xié)議,IMAP(Internet Mail Access Protocol)交互式郵件存取協(xié)議,通過上述名詞的解釋,我們可以了解到Nginx也可以作為電子郵件代理服務(wù)器。
(4)4. 反向代理


3、常見服務(wù)器對比
先扯一家公司:Netcraft
Netcraft公司于1994年底在英國成立,多年來一直致力于互聯(lián)網(wǎng)市場以 及在線安全方面的咨詢服務(wù),
其中在國際上最具影響力的當(dāng)屬其針對網(wǎng)站 服務(wù)器、SSL市場所做的客觀嚴(yán)謹(jǐn)?shù)姆治鲅芯浚?br>
公司官網(wǎng)每月公布的調(diào)研 數(shù)據(jù)(Web Server Survey)已成為當(dāng)今人們了解全球網(wǎng)站數(shù)量以及服
務(wù)器市場分額情況的主要參考依據(jù),時(shí)常被諸如華爾街雜志,英國BBC, Slashdot等媒體報(bào)道或引用
我們先來看一組數(shù)據(jù),我們先打開Nginx的官方網(wǎng)站 http://nginx.org/,找到Netcraft公司公布的數(shù)據(jù),
對當(dāng)前主流服務(wù)器產(chǎn)品進(jìn)行介紹。

上面這張圖展示了2019年全球主流Web服務(wù)器的市場情況,其中有Apache、Microsoft-IIS、
google Servers、Nginx、Tomcat等,而我們在了解新事物的時(shí)候,往往習(xí)慣通過類比來幫助自己
理解事物的概貌。所以下面我們把幾種常見的服務(wù)器來給大家簡單介紹下:
(1)IIS:
全稱(Internet Information Services)即互聯(lián)網(wǎng)信息服務(wù),是由微軟公司提供的基于windows系統(tǒng)的
互聯(lián)網(wǎng)基本服務(wù)。windows作為服務(wù)器在穩(wěn)定性與其他一些性能上都不如類UNIX操作系統(tǒng),
因此在需要高性能Web服務(wù)器的場合下,IIS可能就會被"冷落
(2)Tomcat:
Tomcat是一個(gè)運(yùn)行Servlet和JSP的Web應(yīng)用軟件,Tomcat技術(shù)先進(jìn)、性能穩(wěn)定而且開放源代碼,
因此深受Java愛好者的喜愛并得到了部分軟件開發(fā)商的認(rèn)可,成為目前比較流行的Web應(yīng)用服務(wù)器。
但是Tomcat天生是一個(gè)重量級的Web服務(wù)器,對靜態(tài)文件和高并發(fā)的處理比較弱。
(3)Apache:
Apache的發(fā)展時(shí)期很長,同時(shí)也有過一段輝煌的業(yè)績。從上圖可以看出大概在2014年以前都是
市場份額第一的服務(wù)器。Apache有很多優(yōu)點(diǎn),如穩(wěn)定、開源、跨平臺等。但是它出現(xiàn)的時(shí)間太久了,
在它興起的年代,互聯(lián)網(wǎng)的產(chǎn)業(yè)規(guī)模遠(yuǎn)遠(yuǎn)不如今天,所以它被設(shè)計(jì)成一個(gè)重量級的、不支持高并發(fā)
的Web服務(wù)器。在Apache服務(wù)器上,如果有數(shù)以萬計(jì)的并發(fā)HTTP請求同時(shí)訪問,就會導(dǎo)致服務(wù)器上
消耗大量能存,操作系統(tǒng)內(nèi)核對成百上千的Apache進(jìn)程做進(jìn)程間切換也會消耗大量的CUP資源,
并導(dǎo)致HTTP請求的平均響應(yīng)速度降低,這些都決定了Apache不可能成為高性能的Web服務(wù)器。
這也促使了Lighttpd和Nginx的出現(xiàn)。
(4)Lighttpd:
Lighttpd是德國的一個(gè)開源的Web服務(wù)器軟件,它和Nginx一樣,都是輕量級、高性能的Web服務(wù)器,
歐美的業(yè)界開發(fā)者比較鐘愛Lighttpd,而國內(nèi)的公司更多的青睞Nginx,同時(shí)網(wǎng)上Nginx的資源要更豐富些。
(5)其他的服務(wù)器:
Google Servers,Weblogic, Webshpere(IBM)...
經(jīng)過各個(gè)服務(wù)器的對比,種種跡象都表明,Nginx將以性能為王。這也是我們?yōu)槭裁催x擇Nginx的理由。
4、nginx 的優(yōu)點(diǎn)
(1)速度更快、并發(fā)更高
單次請求或者高并發(fā)請求的環(huán)境下,Nginx都會比其他Web服務(wù)器響應(yīng)的速度更快。一方面在正常情況下,
單次請求會得到更快的響應(yīng),另一方面,在高峰期(如有數(shù)以萬計(jì)的并發(fā)請求),Nginx比其他Web服務(wù)器更
快的響應(yīng)請求。Nginx之所以有這么高的并發(fā)處理能力和這么好的性能原因在于Nginx采用了多進(jìn)程和I/O
多路復(fù)用(epoll)的底層實(shí)現(xiàn)。
(2)配置簡單,擴(kuò)展性強(qiáng)
Nginx的設(shè)計(jì)極具擴(kuò)展性,它本身就是由很多模塊組成,這些模塊的使用可以通過配置文件的配置來添加。
這些模塊有官方提供的也有第三方提供的模塊,如果需要完全可以開發(fā)服務(wù)自己業(yè)務(wù)特性的定制模塊。
(3)高可靠性
Nginx采用的是多進(jìn)程模式運(yùn)行,其中有一個(gè)master主進(jìn)程和N多個(gè)worker進(jìn)程,worker進(jìn)程的數(shù)量我們
可以手動(dòng)設(shè)置,每個(gè)worker進(jìn)程之間都是相互獨(dú)立提供服務(wù),并且master主進(jìn)程可以在某一個(gè)worker進(jìn)
程出錯(cuò)時(shí),快速去"拉起"新的worker進(jìn)程提供服務(wù)。
(4)熱部署
現(xiàn)在互聯(lián)網(wǎng)項(xiàng)目都要求以7*24小時(shí)進(jìn)行服務(wù)的提供,針對于這一要求,Nginx也提供了熱部署功能,
即可以在Nginx不停止的情況下,對Nginx進(jìn)行文件升級、更新配置和更換日志文件等功能。
(5)成本低、BSD許可證
BSD是一個(gè)開源的許可證,世界上的開源許可證有很多,現(xiàn)在比較流行的有六種分別是GPL、BSD、
MIT、Mozilla、Apache、LGPL。這六種的區(qū)別是什么,我們可以通過下面一張圖來解釋下:

Nginx本身是開源的,我們不僅可以免費(fèi)的將Nginx應(yīng)用在商業(yè)領(lǐng)域,而且還可以在項(xiàng)目中直接修改Nginx
的源碼來定制自己的特殊要求。這些點(diǎn)也都是Nginx為什么能吸引無數(shù)開發(fā)者繼續(xù)為Nginx來貢獻(xiàn)自己的
智慧和青春。OpenRestry [Nginx+Lua] Tengine[淘寶]
5、Nginx的功能特性及常用功能
Nginx提供的基本功能服務(wù)從大體上歸納為"基本HTTP服務(wù)"、“高級HTTP服務(wù)”和"郵件服務(wù)"等三大類。
一、基本HTTP服務(wù)
Nginx可以提供基本HTTP服務(wù),可以作為HTTP代理服務(wù)器和反向代理服務(wù)器,支持通過緩存加速訪問,可以完成簡單的負(fù)載均衡和容錯(cuò),支持包過濾功能,支持SSL等。
(1)處理靜態(tài)文件、處理索引文件以及支持自動(dòng)索引;
(2)提供反向代理服務(wù)器,并可以使用緩存加上反向代理,同時(shí)完成負(fù)載均衡和容錯(cuò);
(3)提供對FastCGI、memcached等服務(wù)的緩存機(jī)制,,同時(shí)完成負(fù)載均衡和容錯(cuò);
(4)使用Nginx的模塊化特性提供過濾器功能。Nginx基本過濾器包括gzip壓縮、ranges支持、
chunked響應(yīng)、XSLT、SSI以及圖像縮放等。其中針對包含多個(gè)SSI的頁面,經(jīng)由FastCGI或反向代理,
SSI過濾器可以并行處理。
(5)支持HTTP下的安全套接層安全協(xié)議SSL
(6)支持基于加權(quán)和依賴的優(yōu)先權(quán)的HTTP/2
二、高級HTTP服務(wù)
(1)支持基于名字和IP的虛擬主機(jī)設(shè)置
(2)支持HTTP/1.0中的KEEP-Alive模式和管線(PipeLined)模型連接
(3)自定義訪問日志格式、帶緩存的日志寫操作以及快速日志輪轉(zhuǎn)。
(4)提供3xx~5xx錯(cuò)誤代碼重定向功能
(5)支持重寫(Rewrite)模塊擴(kuò)展
(6)支持重新加載配置以及在線升級時(shí)無需中斷正在處理的請求
(7)支持網(wǎng)絡(luò)監(jiān)控
(8)支持FLV和MP4流媒體傳輸
三、郵件服務(wù)
Nginx提供郵件代理服務(wù)也是其基本開發(fā)需求之一,主要包含以下特性:
(1)支持IMPA/POP3代理服務(wù)功能
(2)支持內(nèi)部SMTP代理服務(wù)功能
四、Nginx常用的功能模塊
靜態(tài)資源部署
Rewrite地址重寫
正則表達(dá)式
反向代理
負(fù)載均衡
輪詢、加權(quán)輪詢、ip_hash、url_hash、fair
Web緩存
環(huán)境部署
高可用的環(huán)境
用戶認(rèn)證模塊...
五、Nginx的核心組成
(1)nginx二進(jìn)制可執(zhí)行文件
(2)nginx.conf配置文件
(3)error.log錯(cuò)誤的日志記錄
(4)access.log訪問日志記錄
二、Nginx環(huán)境準(zhǔn)備 ★
1、版本說明
Nginx的官方網(wǎng)站為: http://nginx.org
Nginx的官方下載網(wǎng)站為 http://nginx.org/en/download.html

2、獲取源碼

3、準(zhǔn)備服務(wù)器系統(tǒng)
(1)確認(rèn)關(guān)閉防火墻,如下兩種方式
# 關(guān)閉運(yùn)行的防火墻,系統(tǒng)重新啟 動(dòng)后,防火墻將重新打開
systemctl stop firewalld
# 永久關(guān)閉防火墻,,系統(tǒng)重新啟 動(dòng)后,防火墻依然關(guān)閉
systemctl disable firewalld
# 查看防火墻狀態(tài)
systemctl status firewalld
(2)確認(rèn)停用selinux
selinux(security-enhanced linux),美國安全局對于強(qiáng)制訪問控制的實(shí)現(xiàn),在linux2.6內(nèi)核以后的版本中,selinux已經(jīng)成功內(nèi)核中的一部分??梢哉fselinux是linux史上最杰出的新安全子系統(tǒng)之一。雖然有了selinux,我們的系統(tǒng)會更安全,但是對于我們的學(xué)習(xí)Nginx的歷程中,會多很多設(shè)置,所以這塊建議大家將selinux
進(jìn)行關(guān)閉。
① sestatus查看狀態(tài)

② 如果查看不是disabled狀態(tài),我們可以通過修改配置文件來進(jìn)行設(shè)置,修 改SELINUX=disabled,然后重啟下系統(tǒng)即可生效。
vim /etc/selinux/config

4、Nginx安裝方式
(1)Nginx的安裝方式有兩種分別是:
????????????????1 通過Nginx源碼
????????????????????????????????通過Nginx源碼簡單安裝
????????????????????????????????通過Nginx源碼復(fù)雜安裝
????????????????2 通過yum安裝
(2)GCC編譯器:
Nginx是使用C語言編寫的程序,因此想要運(yùn)行Nginx就需要安裝一個(gè)編譯工具。GCC就是一個(gè)
開源的編譯器集合,用于處理各種各樣的語言,其中就包含了C語言。
① 使用命令yum install -y gcc來安裝
② 安裝成功后,可以通過gcc --version來查看gcc是否安裝成功
(3)PCRE:
Nginx在編譯過程中需要使用到PCRE庫(perl Compatible RegularExpressoin 兼容正則表達(dá)式庫),
因?yàn)樵贜ginx的Rewrite模塊和http核心模塊都會使用到PCRE正則表達(dá)式語法。
① 可以使用命令yum install -y pcre pcre-devel來進(jìn)行安裝
② 安裝成功后,可以通過rpm -qa pcre pcre-devel來查看是否安裝成功
(4)zlib:
# 可以使用命令安裝
yum install -y zlib zlib-devel
# 查看是否安裝成功
rpm -qa zlib zlib-devel
(5)OpenSSL:
OpenSSL是一個(gè)開放源代碼的軟件庫包,應(yīng)用程序可以使用這個(gè)包進(jìn)行安全通信,并且避免被竊聽。
SSL:Secure Sockets Layer安全套接協(xié)議的縮寫,可以在Internet上提供秘密性傳輸,其目標(biāo)是保證兩個(gè)
應(yīng)用間通信的保密性和可靠性。在Nginx中,如果服務(wù)器需要提供安全網(wǎng)頁時(shí)就需要用到OpenSSL庫,
所以我們需要對OpenSSL的庫文件及它的開發(fā)安裝包進(jìn)行一個(gè)安裝。
① 可以使用命令yum install -y openssl openssl-devel來進(jìn)行安裝
② 安裝成功后,可以通過rpm -qa openssl openssl-devel來查看是否安
裝成功
上述命令,一個(gè)個(gè)來的話比較麻煩,我們也可以通過一條命令來進(jìn)行安
③裝yum install -y gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel進(jìn)行全部安裝。
5、Nginx安裝方案 ★ 方案一:Nginx的源碼簡單安裝
http://www.itdecent.cn/p/93f8f568b5ec
6、Nginx安裝方案 ★ 方案二:yum安裝
http://www.itdecent.cn/p/93f8f568b5ec
7、Nginx安裝方案 ★ 方案三:Nginx的源碼復(fù)雜安裝
http://www.itdecent.cn/p/93f8f568b5ec
8、Nginx服務(wù)器啟停命令
一、方式一:Nginx服務(wù)的信號控制
Nginx中的master和worker進(jìn)程?
Nginx的工作方式?
如何獲取進(jìn)程的PID?
信號有哪些?
如何通過信號控制Nginx的啟停等相關(guān)操作?
前面在提到Nginx的高性能,其實(shí)也和它的架構(gòu)模式有關(guān)。Nginx默認(rèn)采用的是多進(jìn)程的方式來工作的,
當(dāng)將Nginx啟動(dòng)后,我們通過ps -ef | grep nginx命令可以查看到如下內(nèi)容:

從上圖中可以看到,Nginx后臺進(jìn)程中包含一個(gè)master進(jìn)程和多個(gè)worker進(jìn)程,master進(jìn)程主要用來
管理worker進(jìn)程,包含接收外界的信息,并將接收到的信號發(fā)送給各個(gè)worker進(jìn)程,監(jiān)控worker進(jìn)
程的狀態(tài),當(dāng)worker進(jìn)程出現(xiàn)異常退出后,會自動(dòng)重新啟動(dòng)新的worker進(jìn)程。而worker進(jìn)程則是專
門用來處理用戶請求的,各個(gè)worker進(jìn)程之間是平等的并且相互獨(dú)立,處理請求的機(jī)會也是一樣的。
nginx的進(jìn)程模型,我們可以通過下圖來說明下:

我們現(xiàn)在作為管理員,只需要通過給master進(jìn)程發(fā)送信號就可以來控制Nginx,這個(gè)時(shí)候我們需要有
兩個(gè)前提條件,一個(gè)是要操作的master進(jìn)程,一個(gè)是信號。
(1)要想操作Nginx的master進(jìn)程,就需要獲取到master進(jìn)程的進(jìn)程號ID。獲取方式簡單介紹兩個(gè),
方式一:通過ps -ef | grep nginx
方式二:./configure的配置參數(shù)的時(shí)候,有一個(gè)參數(shù)是--pid-path=PATH默認(rèn)是/usr/local/nginx/logs/nginx.pid ,所以可以通過查看該文件來獲取nginx的master進(jìn)程ID.
(2)信號
| 信號 | 作用 |
|---|---|
| TERM/INT | 立即關(guān)閉整個(gè)服務(wù) |
| QUIT | "優(yōu)雅"地關(guān)閉整個(gè)服務(wù) |
| HUP | 重讀配置文件并使用服務(wù)對新配置項(xiàng)生效 |
| USR1 | 重新打開日志文件,可以用來進(jìn)行日志切割 |
| USR2 | 平滑升級到最新版的nginx |
| WINCH | 所有子進(jìn)程不在接收處理新連接,相當(dāng)于給work進(jìn)程發(fā)送QUIT指令 |
調(diào)用命令為kill -signal PID
signal:即為信號;PID即為獲取到的master線程ID
① 1. 發(fā)送TERM/INT信號給master進(jìn)程,會將Nginx服務(wù)立即關(guān)閉。
kill -TERM PID / kill -TERM `cat /usr/local/nginx/logs/nginx.pid`
kill -INT PID / kill -INT `cat /usr/local/nginx/logs/nginx.pid`
② 2.發(fā)送QUIT信號給master進(jìn)程,master進(jìn)程會控制所有的work進(jìn)程不
再接收新的請求,等所有請求處理完后,在把進(jìn)程都關(guān)閉掉。
kill -QUIT PID / kill -TERM `cat /usr/local/nginx/logs/nginx.pid`
③ 3. 發(fā)送HUP信號給master進(jìn)程,master進(jìn)程會把控制舊的work進(jìn)程不再接收新的請求,
等處理完請求后將舊的work進(jìn)程關(guān)閉掉,然后根據(jù)nginx的配置文件重新啟動(dòng)新的work進(jìn)程
kill -HUP PID / kill -TERM `cat /usr/local/nginx/logs/nginx.pid`
④ 4. 發(fā)送USR1信號給master進(jìn)程,告訴Nginx重新開啟日志文件
kill -USR1 PID / kill -TERM `cat /usr/local/nginx/logs/nginx.pid`
⑤ 發(fā)送USR2信號給master進(jìn)程,告訴master進(jìn)程要平滑升級,這個(gè)時(shí)候,會重新開啟對應(yīng)的master
進(jìn)程和work進(jìn)程,整個(gè)系統(tǒng)中將會有兩個(gè)master進(jìn)程,并且新的master進(jìn)程的PID會被記錄
在/usr/local/nginx/logs/nginx.pid而之前的舊的master進(jìn)程 PID會被記錄在/usr/local/nginx/logs/nginx.pid.oldbin文件中,接著再次發(fā)送QUIT信號給舊的master進(jìn)程,
讓其處理完請求后再進(jìn)行關(guān)閉
kill -USR2 PID / kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
kill -QUIT PID / kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`

⑥ 6. 發(fā)送WINCH信號給master進(jìn)程,讓master進(jìn)程控制不讓所有的work進(jìn)程在接收新的請求了,
請求處理完后關(guān)閉work進(jìn)程。注意master 進(jìn)程不會被關(guān)閉掉
kill -WINCH PID /kill -WINCH`cat /usr/local/nginx/logs/nginx.pid`
方式二:Nginx的命令行控制(推薦)
此方式是通過Nginx安裝目錄下的sbin下的可執(zhí)行文件nginx來進(jìn)行Nginx狀態(tài)的控制,我們可以通過
./nginx -h來查看都有哪些參數(shù)可以用:

-?和-h:顯示幫助信息
-v:打印版本號信息并退出
-V:打印版本號信息和配置信息并退出
-t:測試nginx的配置文件語法是否正確并退出
-T:測試nginx的配置文件語法是否正確并列出用到的配置文件信息然后
退出
-q:在配置測試期間禁止顯示非錯(cuò)誤消息
-s:signal信號,后面可以跟 :
stop[快速關(guān)閉,類似于TERM/INT信號的作用] kill -WINCH PID /kill -WINCH
cat /usr/local/nginx/logs/nginx.pid 1quit[優(yōu)雅的關(guān)閉,類似于QUIT信號的作用] reopen[重新打開日志文件類似于USR1信號的作用] reload[類似于HUP信號的作用]
-p:prefix,指定Nginx的prefix路徑,(默認(rèn)為: /usr/local/nginx/)
-c:filename,指定Nginx的配置文件路徑,(默認(rèn)為: conf/nginx.conf)
-g:用來補(bǔ)充Nginx配置文件,向Nginx服務(wù)指定啟動(dòng)時(shí)應(yīng)用全局的配置
9、Nginx服務(wù)器版本升級和新增模塊
(1)1.14.2版本的sbin目錄下的nginx進(jìn)行備份
cd /usr/local/nginx/sbin
mv nginx nginxold
(2)將Nginx1.16.1安裝目錄編譯后的objs目錄下的nginx文件,拷貝
到原來/usr/local/nginx/sbin目錄下
cd ~/nginx/core/nginx-1.16.1/objs
cp nginx /usr/local/nginx/sbin
(3)進(jìn)入到安裝目錄,執(zhí)行 make upgrade
(4)查看是否更新成功:./nginx -v
在整個(gè)過程中,其實(shí)Nginx是一直對外提供服務(wù)的。并且當(dāng)Nginx的服務(wù)器啟動(dòng)成功后,我們是可以通過
瀏覽器進(jìn)行直接訪問的,同時(shí)我們可以通過更改html目錄下的頁面來修改我們在頁面上所看到的內(nèi)容,
那么問題來了,為什么我們要修改html目錄下的文件,能不能多添加一些頁面是Nginx的功能更加豐富,
還有前面聊到Nginx的前端功能又是如何來實(shí)現(xiàn)的,這就需要我們對Nginx的核心配置文件進(jìn)行一個(gè)詳細(xì)
的學(xué)習(xí)。
三、Nginx核心配置文件結(jié)構(gòu)
★ 核心既:/usr/local/nginx/conf/nginx.conf,此配置文件
讀取Nginx自帶的Nginx配置文件,我們將其中的注釋部分【學(xué)習(xí)一個(gè)技術(shù)點(diǎn)就是在Nginx的配置文件中
可以使用#來注釋】刪除掉后,就剩下面內(nèi)容。
# 指令名 指令值;
# 全局塊,主要設(shè)置Nginx服務(wù)器整體運(yùn)行的配置指令
worker_processes 1;
# events塊,主要設(shè)置,Nginx服務(wù)器與用戶的網(wǎng)絡(luò)連接,這一部分對 Nginx服務(wù)器的性能影響較大
events {
# 指令名 指令值;
worker_connections 1024;
}
# http塊,是Nginx服務(wù)器配置中的重要部分,代理、緩存、日志記錄、 第三方模塊配置...
http {
# 指令名 指令值;
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# server塊,是Nginx配置和虛擬主機(jī)相關(guān)的內(nèi)容
server {
# 指令名 指令值;
listen 80;
server_name localhost;
# location塊,基于Nginx服務(wù)器接收請求字符串與 location后面的值進(jìn)行匹配,對特定請求進(jìn)行處理
location / {
# 指令名 指令值;
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
簡單小結(jié)下:
nginx.conf配置文件中默認(rèn)有三大塊:全局塊、events塊、http塊
http塊中可以配置多個(gè)server塊,每個(gè)server塊又可以配置多個(gè)location
塊。
一、全局塊
1、User 指令
(1)user:用于配置運(yùn)行Nginx服務(wù)器的worker進(jìn)程的用戶和用戶組。
| 語法 | user user [group] |
|---|---|
| 默認(rèn)值 | nobody |
| 位置 | 全局塊 |
該屬性也可以在編譯的時(shí)候指定,語法如下./configure --user=user --group=group ,如果兩個(gè)地方都進(jìn)行了設(shè)置,最終生效的是配置文件中的配置。
① 打開配置文件 vim /conf/nginx.conf

② 創(chuàng)建一個(gè)用戶:
useradd www③ 重新啟動(dòng),重新加載配置:
./nginx -s reload④ 再次查看 進(jìn)程信息
ps -ef|grep nginx
⑤ 創(chuàng)建/root/html/index.html頁面,添加如下內(nèi)容
mkdir /root/html/vim /root/html/index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans- serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and working. Further configuration is
required.</p>
<p>For online documentation and support please refer to<a >nginx.org</a>.<br /> Commercial
support is available at <a >nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
<p><em>阿 K 是 個(gè) 大 帥 哥</em></p>
</body>
</html>
⑥ 修改nginx.conf
location / {
root /root/html;
index index.html index.htm;
}
⑦ 測試啟動(dòng)訪問:頁面會報(bào)403拒絕訪問的錯(cuò)誤

⑧ 分析原因,因?yàn)楫?dāng)前用戶(www用戶)沒有訪問 /root/html目錄的權(quán)限
⑨ 將文件創(chuàng)建到 /home/www/html/index.html ,修改配置
location / {
root /home/www/html;
index index.html index.htm;
}
⑩ 測試

綜上所述,使用user指令可以指定啟動(dòng)運(yùn)行工作進(jìn)程的用戶及用戶組,
這樣對于系統(tǒng)的權(quán)限訪問控制的更加精細(xì),也更加安全。
2、work process指令
master_process:用來指定是否開啟工作進(jìn)程。
| 語法 | master_process on|off; |
|---|---|
| 默認(rèn)值 | master_process on; |
| 位置 | 全局塊 |
worker_processes:用于配置Nginx生成工作進(jìn)程的數(shù)量,這個(gè)是Nginx服務(wù)器實(shí)現(xiàn)并發(fā)處理服務(wù)的
關(guān)鍵所在。理論上來說workder process的值越大,可以支持的并發(fā)處理量也越多,但事實(shí)上這個(gè)
值的設(shè)定是需要受到來自服務(wù)器自身的限制,建議將該值和服務(wù)器CPU的內(nèi)核數(shù)保存一致。
| 語法 | worker_processes num/auto; |
|---|---|
| 默認(rèn)值 | 1 |
| 位置 | 全局塊 |
如果將worker_processes設(shè)置成6 ,則會看到如下內(nèi)容:

3、其他指令
(1)daemon:設(shè)定Nginx是否以守護(hù)進(jìn)程的方式啟動(dòng)。
守護(hù)式進(jìn)程是linux后臺執(zhí)行的一種服務(wù)進(jìn)程,特點(diǎn)是獨(dú)立于控制終端,不會隨著終端關(guān)閉而停止。
| 語法 | daemon on|off; |
|---|---|
| 默認(rèn)值 | daemon on; |
| 位置 | 全局塊 |

(2)不重要:pid:用來配置Nginx當(dāng)前master進(jìn)程的進(jìn)程號ID存儲的文件路徑。
| 語法 | pid file; |
|---|---|
| 默認(rèn)值 | 默認(rèn)為:/usr/local/nginx/logs/nginx.pid |
| 位置 | 全局塊 |
(3)重要:該屬性可以通過./configure --pid-path=PATH來指定
error_log:用來配置Nginx的錯(cuò)誤日志存放路徑
| 語法 | error_log file [日志級別]; |
|---|---|
| 默認(rèn)值 | error_log logs/error.log error; |
| 位置 | 全局塊、http、server、location |
該屬性可以通過./configure --error-log-path=PATH來指定
其中日志級別的值有:
debug|info|notice|warn|error|crit|alert|emerg,翻譯過來為試|信 息|通知|警告|錯(cuò)誤|臨界|警報(bào)|緊急,這塊建議大家設(shè)置的時(shí)候不要設(shè)置成info以下的等級,因?yàn)闀泶罅康拇疟PI/O消耗,影響Nginx的性能
(4)include:用來引入其他配置文件,使Nginx的配置更加靈活
| 語法 | include file; |
|---|---|
| 默認(rèn)值 | 無 |
| 位置 | any |
include案例:
① 在 nginx.conf 同級創(chuàng)建一個(gè) main.conf 用于引入,在里面 輸入如下內(nèi)容:

② 將 nginx.conf 部分注釋,并引入 main.conf

③ 重啟測試:
./nginx -s reload④ 查看進(jìn)程狀態(tài)
ps -ef|grep nginx
二、events塊
1、accept_mutex:用來設(shè)置Nginx網(wǎng)絡(luò)連接序列化
| 語法 | accept_mutex on|off; |
|---|---|
| 默認(rèn)值 | accept_mutex on; |
| 位置 | events |
這個(gè)配置主要可以用來解決常說的"驚群"問題。大致意思是在某一個(gè)時(shí)刻,客戶端發(fā)來一個(gè)請求連接,
Nginx后臺是以多進(jìn)程的工作模式,也就是說有多個(gè)worker進(jìn)程會被同時(shí)喚醒,但是最終只會有一個(gè)
進(jìn)程可以獲取到連接,如果每次喚醒的進(jìn)程數(shù)目太多,就會影響Nginx的整體性能。如果將上述值設(shè)
置為on(開啟狀態(tài)),將會對多個(gè)Nginx進(jìn)程接收連接進(jìn)行序列號,一個(gè)個(gè)來喚醒接收,就防止了多個(gè)
進(jìn)程對連接的爭搶。

2、multi_accept:用來設(shè)置是否允許同時(shí)接收多個(gè)網(wǎng)絡(luò)連接
| 語法 | multi_accept on|off; |
|---|---|
| 默認(rèn)值 | multi_accept off; |
| 位置 | events |
如果multi_accept被禁止了,nginx一個(gè)工作進(jìn)程只能同時(shí)接受一個(gè)新的連接。否則,
一個(gè)工作進(jìn)程可以同時(shí)接受所有的新連接
3、worker_connections:用來配置單個(gè)worker進(jìn)程最大的連接數(shù)
| 語法 | worker_connections number; |
|---|---|
| 默認(rèn)值 | worker_commections 512; |
| 位置 | events |
這里的連接數(shù)不僅僅包括和前端用戶建立的連接數(shù),而是包括所有可能的連接數(shù)。另外,
number值不能大于操作系統(tǒng)支持打開的最大文件句柄數(shù)量。
4、use:用來設(shè)置Nginx服務(wù)器選擇哪種事件驅(qū)動(dòng)來處理網(wǎng)絡(luò)消息。
| 語法 | use method; |
|---|---|
| 默認(rèn)值 | 根據(jù)操作系統(tǒng)定 |
| 位置 | events |
注意:此處所選擇事件處理模型是Nginx優(yōu)化部分的一個(gè)重要內(nèi)容,method的可選值有select/poll/epoll/kqueue等,之前在準(zhǔn)備centos環(huán)境的時(shí)候,我們強(qiáng)調(diào)過要使用linux內(nèi)核在2.6以上,
就是為了能使用epoll函數(shù)來優(yōu)化Nginx
5、events指令配置實(shí)例
events{
accept_mutex on;
multi_accept on;
worker_commections 1024;
use epoll;
}
啟動(dòng)測試
./nginx -t
./nginx -s reload
三、http塊
1、定義MIME-Type
我們都知道瀏覽器中可以顯示的內(nèi)容有HTML、XML、GIF等種類繁多的文件、媒體等資源,瀏覽器為了
區(qū)分這些資源,就需要使用MIME Type。所以說MIME Type是網(wǎng)絡(luò)資源的媒體類型。Nginx作為web服務(wù)
器,也需要能夠識別前端請求的資源類型。
include mime.types;
default_type application/octet-stream;

(1)default_type:用來配置Nginx響應(yīng)前端請求默認(rèn)的MIME類型。
| 語法 | default_type mime-type; |
|---|---|
| 默認(rèn)值 | default_type text/plain; |
| 位置 | http、server、location |
① 在default_type之前還有一句include mime.types ,include之前我們已經(jīng)介紹過,相當(dāng)于把mime.types文件
中MIMT類型與相關(guān)類型文件的文件后綴名的對應(yīng)關(guān)系加入到當(dāng)前的配置文件中。
② 舉例來說明:
有些時(shí)候請求某些接口的時(shí)候需要返回指定的文本字符串或者json字符串,如果邏輯非常簡單或者干脆是
固定的字符串,那么可以使用nginx快速實(shí)現(xiàn),這樣就不用編寫程序響應(yīng)請求了,可以減少服務(wù)器資源占用
并且響應(yīng)性能非???/p>
③ 如何實(shí)現(xiàn):改完記得重啟哦,./nginx -t reload
location /get_text {
#這里也可以設(shè)置成text/plain
#沒加這句默認(rèn)打開以二進(jìn)制流
default_type text/html;
return 200 "This is nginx's text";
}
location /get_json{
default_type application/json;
return 200 '{"name":"TOM","age":18}';
}
(2)自定義服務(wù)日志
Nginx中日志的類型分access.log、error.log。
① access.log:用來記錄用戶所有的訪問請求。
② error.log:記錄nginx本身運(yùn)行時(shí)的錯(cuò)誤信息,不會記錄用戶的訪問請
求。
Nginx服務(wù)器支持對服務(wù)日志的格式、大小、輸出等進(jìn)行設(shè)置,需要使用到兩個(gè)指令,分別是access_log和log_format指令。
(一)access_log:用來設(shè)置用戶訪問日志的相關(guān)屬性。
| 語法 | access_log path[format[buffer=size]] |
|---|---|
| 默認(rèn)值 | access_log logs/access.log combined; |
| 位置 | http , server , location |
(二)log_format:用來指定日志的輸出格式。
| 語法 | log_format name [escape=default|json|none] string....; |
|---|---|
| 默認(rèn)值 | log_format combined "..."; |
| 位置 | http |
(3)其他指令
(一)sendfile:用來設(shè)置Nginx服務(wù)器是否使用sendfile()傳輸文件,該屬
性可以大大提高Nginx處理靜態(tài)資源的性能
| 語法 | sendfile on|off; |
|---|---|
| 默認(rèn)值 | sendfile off; |
| 位置 | http、server、location |
(二)keepalive_timeout:用來設(shè)置長連接的超時(shí)時(shí)間。為什么要使用keepalive?
我們都知道HTTP是一種無狀態(tài)協(xié)議,客戶端向服務(wù)端發(fā)送一個(gè)TCP請求, 服務(wù)端響應(yīng)完畢后斷開連接。 如何客戶端向服務(wù)端發(fā)送多個(gè)請求,每個(gè)請求都需要重新創(chuàng)建一次連接, 效率相對來說比較多,使用keepalive模式,可以告訴服務(wù)器端在處理完 一個(gè)請求后保持這個(gè)TCP連接的打開狀態(tài),若接收到來自這個(gè)客戶端的其 他請求,服務(wù)端就會利用這個(gè)未被關(guān)閉的連接,而不需要重新創(chuàng)建一個(gè)新 連接,提升效率,但是這個(gè)連接也不能一直保持,這樣的話,連接如果過 多,也會是服務(wù)端的性能下降,這個(gè)時(shí)候就需要我們進(jìn)行設(shè)置其的超時(shí)時(shí) 間。
| 語法 | keepalive_timeout time; |
|---|---|
| 默認(rèn)值 | keepalive_timeout 75s; |
| 位置 | http、server、location |
(三)keepalive_requests:用來設(shè)置一個(gè)keep-alive連接使用的次數(shù)。
| 語法 | keepalive_requests number; |
|---|---|
| 默認(rèn)值 | keepalive_requests 100; |
| 位置 | http、server、location |