談?wù)?Nginx 那點事【一】
為什么突然決定總結(jié)Nginx ?
不知不覺8月份又要過完了,時間真是個無情的崽種。
寫Nginx 首先,主要源于最近項目部署工作中和公司技術(shù)中心的人對接部署相關(guān)事宜流程太繁瑣了。每個部門有各自的工作安排 要協(xié)調(diào)要溝通就會有耗時。博主是一個不想麻煩別人的人 非外部或依托平臺的自身條件限制等原因,能自己解決的就都自己解決。
其次,工作幾年來,或多或少都有用到Nginx的相關(guān)場景,也相當(dāng)于是自己的一次梳理,將知識結(jié)構(gòu)化和體系化。
Nginx簡介
背景介紹
Nginx(“engine x”)一個具有高性能的【HTTP】和【反向代理】的【W(wǎng)EB服務(wù)器】,同時也是一個【POP3/SMTP/IMAP代理服務(wù)器】,是由伊戈爾·賽索耶夫(俄羅斯人)使用C語言編寫的,Nginx的第一個版本是2004年10月4號發(fā)布的0.1.0版本。另外值得一提的是伊戈爾·賽索耶夫?qū)ginx的源碼進(jìn)行了開源,這也為Nginx的發(fā)展提供了良好的保障。

名詞解釋
- WEB服務(wù)器:
WEB服務(wù)器也叫網(wǎng)頁服務(wù)器,英文名叫Web Server,主要功能是為用戶提供網(wǎng)上信息瀏覽服務(wù)。
- HTTP:
HTTP是超文本傳輸協(xié)議的縮寫,是用于從WEB服務(wù)器傳輸超文本到本地瀏覽器的傳輸協(xié)議,也是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議。HTTP是一個客戶端和服務(wù)器端請求和應(yīng)答的標(biāo)準(zhǔn),客戶端是終端用戶,服務(wù)端是網(wǎng)站,通過使用Web瀏覽器、網(wǎng)絡(luò)爬蟲或者其他工具,客戶端發(fā)起一個到服務(wù)器上指定端口的HTTP請求。
- POP3/SMTP/IMAP:
POP3(Post Offic Protocol 3)郵局協(xié)議的第三個版本,
SMTP(Simple Mail Transfer Protocol)簡單郵件傳輸協(xié)議,
IMAP(Internet Mail Access Protocol)交互式郵件存取協(xié)議,
通過上述名詞的解釋,我們可以了解到Nginx也可以作為電子郵件代理服務(wù)器。
- 反向代理
正向代理

反向代理

常見服務(wù)器對比
在介紹這一節(jié)內(nèi)容之前,我們先來認(rèn)識一家公司叫Netcraft。
Netcraft公司于1994年底在英國成立,多年來一直致力于互聯(lián)網(wǎng)市場以及在線安全方面的咨詢服務(wù),其中在國際上最具影響力的當(dāng)屬其針對網(wǎng)站服務(wù)器、SSL市場所做的客觀嚴(yán)謹(jǐn)?shù)姆治鲅芯?,公司官網(wǎng)每月公布的調(diào)研數(shù)據(jù)(Web Server Survey)已成為當(dāng)今人們了解全球網(wǎng)站數(shù)量以及服務(wù)器市場分額情況的主要參考依據(jù),時常被諸如華爾街雜志,英國BBC,Slashdot等媒體報道或引用。
我們先來看一組數(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等,而我們在了解新事物的時候,往往習(xí)慣通過類比來幫助自己理解事物的概貌。所以下面我們把幾種常見的服務(wù)器來給大家簡單介紹下:
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可能就會被"冷落".
Tomcat
? Tomcat是一個運行Servlet和JSP的Web應(yīng)用軟件,Tomcat技術(shù)先進(jìn)、性能穩(wěn)定而且開放源代碼,因此深受Java愛好者的喜愛并得到了部分軟件開發(fā)商的認(rèn)可,成為目前比較流行的Web應(yīng)用服務(wù)器。但是Tomcat天生是一個重量級的Web服務(wù)器,對靜態(tài)文件和高并發(fā)的處理比較弱。
Apache
? Apache的發(fā)展時期很長,同時也有過一段輝煌的業(yè)績。從上圖可以看出大概在2014年以前都是市場份額第一的服務(wù)器。Apache有很多優(yōu)點,如穩(wěn)定、開源、跨平臺等。但是它出現(xiàn)的時間太久了,在它興起的年代,互聯(lián)網(wǎng)的產(chǎn)業(yè)規(guī)模遠(yuǎn)遠(yuǎn)不如今天,所以它被設(shè)計成一個重量級的、不支持高并發(fā)的Web服務(wù)器。在Apache服務(wù)器上,如果有數(shù)以萬計的并發(fā)HTTP請求同時訪問,就會導(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)。
Lighttpd
? Lighttpd是德國的一個開源的Web服務(wù)器軟件,它和Nginx一樣,都是輕量級、高性能的Web服務(wù)器,歐美的業(yè)界開發(fā)者比較鐘愛Lighttpd,而國內(nèi)的公司更多的青睞Nginx,同時網(wǎng)上Nginx的資源要更豐富些。
其他的服務(wù)器
Google Servers,Weblogic, Webshpere(IBM)...
經(jīng)過各個服務(wù)器的對比,種種跡象都表明,Nginx將以性能為王。這也是我們?yōu)槭裁催x擇Nginx的理由。
Nginx的優(yōu)點
(1)速度更快、并發(fā)更高
單次請求或者高并發(fā)請求的環(huán)境下,Nginx都會比其他Web服務(wù)器響應(yīng)的速度更快。一方面在正常情況下,單次請求會得到更快的響應(yīng),另一方面,在高峰期(如有數(shù)以萬計的并發(fā)請求),Nginx比其他Web服務(wù)器更快的響應(yīng)請求。Nginx之所以有這么高的并發(fā)處理能力和這么好的性能原因在于Nginx采用了多進(jìn)程和I/O多路復(fù)用(epoll)的底層實現(xiàn)。
(2)配置簡單,擴展性強
Nginx的設(shè)計極具擴展性,它本身就是由很多模塊組成,這些模塊的使用可以通過配置文件的配置來添加。這些模塊有官方提供的也有第三方提供的模塊,如果需要完全可以開發(fā)服務(wù)自己業(yè)務(wù)特性的定制模塊。
(3)高可靠性
Nginx采用的是多進(jìn)程模式運行,其中有一個master主進(jìn)程和N多個worker進(jìn)程,worker進(jìn)程的數(shù)量我們可以手動設(shè)置,每個worker進(jìn)程之間都是相互獨立提供服務(wù),并且master主進(jìn)程可以在某一個worker進(jìn)程出錯時,快速去"拉起"新的worker進(jìn)程提供服務(wù)。
(4)熱部署
現(xiàn)在互聯(lián)網(wǎng)項目都要求以7*24小時進(jìn)行服務(wù)的提供,針對于這一要求,Nginx也提供了熱部署功能,即可以在Nginx不停止的情況下,對Nginx進(jìn)行文件升級、更新配置和更換日志文件等功能。
(5)成本低、BSD許可證
BSD是一個開源的許可證,世界上的開源許可證有很多,現(xiàn)在比較流行的有六種分別是GPL、BSD、MIT、Mozilla、Apache、LGPL。這六種的區(qū)別是什么,我們可以通過下面一張圖來解釋下:

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

Nginx的官方下載網(wǎng)站為http://nginx.org/en/download.html,當(dāng)然你也可以之間在首頁選中右邊的download進(jìn)入版本下載網(wǎng)頁。在下載頁面我們會看到如下內(nèi)容:

獲取Nginx源碼
打開上述網(wǎng)站,就可以查看到Nginx的所有版本,選中自己需要的版本進(jìn)行下載。下載我們可以直接在windows上下載然后上傳到服務(wù)器,也可以直接從服務(wù)器上下載,這個時候就需要準(zhǔn)備一臺服務(wù)器。

準(zhǔn)備服務(wù)器系統(tǒng)
環(huán)境準(zhǔn)備
VMware WorkStation
Centos7
MobaXterm
xsheel,SecureCRT
網(wǎng)絡(luò)
(1)確認(rèn)centos的內(nèi)核
準(zhǔn)備一個內(nèi)核為2.6及以上版本的操作系統(tǒng),因為linux2.6及以上內(nèi)核才支持epoll,而Nginx需要解決高并發(fā)壓力問題是需要用到epoll,所以我們需要有這樣的版本要求。
我們可以使用uname -a命令來查詢linux的內(nèi)核版本。

(2)確保centos能聯(lián)網(wǎng)
ping www.baidu.com

(3)確認(rèn)關(guān)閉防火墻
這一項的要求僅針對于那些對linux系統(tǒng)的防火墻設(shè)置規(guī)則不太清楚的,建議大家把防火墻都關(guān)閉掉,因為我們此次課程主要的內(nèi)容是對Nginx的學(xué)習(xí),把防火墻關(guān)閉掉,可以省掉后續(xù)Nginx學(xué)習(xí)過程中遇到的諸多問題。
關(guān)閉的方式有如下兩種:
systemctl stop firewalld 關(guān)閉運行的防火墻,系統(tǒng)重新啟動后,防火墻將重新打開
systemctl disable firewalld 永久關(guān)閉防火墻,,系統(tǒng)重新啟動后,防火墻依然關(guān)閉
systemctl status firewalld 查看防火墻狀態(tài)
(4)確認(rèn)停用selinux
selinux(security-enhanced linux),美國安全局對于強制訪問控制的實現(xiàn),在linux2.6內(nèi)核以后的版本中,selinux已經(jīng)成功內(nèi)核中的一部分。可以說selinux是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

Nginx安裝方式介紹
Nginx的安裝方式有兩種分別是:
通過Nginx源碼
通過Nginx源碼簡單安裝 (1)
通過Nginx源碼復(fù)雜安裝 (3)
通過yum安裝 (2)
如果通過Nginx源碼安裝需要提前準(zhǔn)備的內(nèi)容:
GCC編譯器
Nginx是使用C語言編寫的程序,因此想要運行Nginx就需要安裝一個編譯工具。GCC就是一個開源的編譯器集合,用于處理各種各樣的語言,其中就包含了C語言。
使用命令yum install -y gcc來安裝
安裝成功后,可以通過gcc --version來查看gcc是否安裝成功
PCRE
Nginx在編譯過程中需要使用到PCRE庫(perl Compatible Regular Expressoin 兼容正則表達(dá)式庫),因為在Nginx的Rewrite模塊和http核心模塊都會使用到PCRE正則表達(dá)式語法。
可以使用命令yum install -y pcre pcre-devel來進(jìn)行安裝
安裝成功后,可以通過rpm -qa pcre pcre-devel來查看是否安裝成功
zlib
zlib庫提供了開發(fā)人員的壓縮算法,在Nginx的各個模塊中需要使用gzip壓縮,所以我們也需要提前安裝其庫及源代碼zlib和zlib-devel
可以使用命令yum install -y zlib zlib-devel來進(jìn)行安裝
安裝成功后,可以通過rpm -qa zlib zlib-devel來查看是否安裝成功
OpenSSL
OpenSSL是一個開放源代碼的軟件庫包,應(yīng)用程序可以使用這個包進(jìn)行安全通信,并且避免被竊聽。
SSL:Secure Sockets Layer安全套接協(xié)議的縮寫,可以在Internet上提供秘密性傳輸,其目標(biāo)是保證兩個應(yīng)用間通信的保密性和可靠性。在Nginx中,如果服務(wù)器需要提供安全網(wǎng)頁時就需要用到OpenSSL庫,所以我們需要對OpenSSL的庫文件及它的開發(fā)安裝包進(jìn)行一個安裝。
可以使用命令yum install -y openssl openssl-devel來進(jìn)行安裝
安裝成功后,可以通過rpm -qa openssl openssl-devel來查看是否安裝成功
上述命令,一個個來的話比較麻煩,我們也可以通過一條命令來進(jìn)行安裝
yum install -y gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel進(jìn)行全部安裝。
方案一:Nginx的源碼簡單安裝
(1)進(jìn)入官網(wǎng)查找需要下載版本的鏈接地址,然后使用wget命令進(jìn)行下載
wget http://nginx.org/download/nginx-1.16.1.tar.gz
(2)建議大家將下載的資源進(jìn)行包管理
mkdir -p nginx/core
mv nginx-1.16.1.tar.gz nginx/core
(3)解壓縮
tar -xzf nginx-1.16.1.tar.gz
(4)進(jìn)入資源文件中,發(fā)現(xiàn)configure
./configure
(5)編譯
make
(6)安裝
make install
方案二:yum安裝
使用源碼進(jìn)行簡單安裝,我們會發(fā)現(xiàn)安裝的過程比較繁瑣,需要提前準(zhǔn)備GCC編譯器、PCRE兼容正則表達(dá)式庫、zlib壓縮庫、OpenSSL安全通信的軟件庫包,然后才能進(jìn)行Nginx的安裝。
(1)安裝yum-utils
sudo yum install -y yum-utils
(2)添加yum源文件
vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
(3)查看是否安裝成功
yum list | grep nginx

(4)使用yum進(jìn)行安裝
yun install -y nginx
(5)查看nginx的安裝位置
whereis nginx

(6)啟動測試
源碼簡單安裝和yum安裝的差異:
這里先介紹一個命令: ./nginx -V,通過該命令可以查看到所安裝Nginx的版本及相關(guān)配置信息。
簡單安裝

yum安裝

解壓Nginx目錄
執(zhí)行tar -zxvf nginx-1.16.1.tar.gz對下載的資源進(jìn)行解壓縮,進(jìn)入壓縮后的目錄,可以看到如下結(jié)構(gòu)

內(nèi)容解釋:
auto:存放的是編譯相關(guān)的腳本
CHANGES:版本變更記錄
CHANGES.ru:俄羅斯文的版本變更記錄
conf:nginx默認(rèn)的配置文件
configure:nginx軟件的自動腳本程序,是一個比較重要的文件,作用如下:
? (1)檢測環(huán)境及根據(jù)環(huán)境檢測結(jié)果生成C代碼
? (2)生成編譯代碼需要的Makefile文件
contrib:存放的是幾個特殊的腳本文件,其中README中對腳本有著詳細(xì)的說明
html:存放的是Nginx自帶的兩個html頁面,訪問Nginx的首頁和錯誤頁面
LICENSE:許可證的相關(guān)描述文件
man:nginx的man手冊
README:Nginx的閱讀指南
src:Nginx的源代碼
方案三:Nginx的源碼復(fù)雜安裝
這種方式和簡單的安裝配置不同的地方在第一步,通過./configure來對編譯參數(shù)進(jìn)行設(shè)置,需要我們手動來指定。那么都有哪些參數(shù)可以進(jìn)行設(shè)置,接下來我們進(jìn)行一個詳細(xì)的說明。
PATH:是和路徑相關(guān)的配置信息
with:是啟動模塊,默認(rèn)是關(guān)閉的
without:是關(guān)閉模塊,默認(rèn)是開啟的
我們先來認(rèn)識一些簡單的路徑配置已經(jīng)通過這些配置來完成一個簡單的編譯:
--prefix=PATH
指向Nginx的安裝目錄,默認(rèn)值為/usr/local/nginx
--sbin-path=PATH
指向(執(zhí)行)程序文件(nginx)的路徑,默認(rèn)值為<prefix>/sbin/nginx
--modules-path=PATH
指向Nginx動態(tài)模塊安裝目錄,默認(rèn)值為<prefix>/modules
--conf-path=PATH
指向配置文件(nginx.conf)的路徑,默認(rèn)值為<prefix>/conf/nginx.conf
--error-log-path=PATH
指向錯誤日志文件的路徑,默認(rèn)值為<prefix>/logs/error.log
--http-log-path=PATH
指向訪問日志文件的路徑,默認(rèn)值為<prefix>/logs/access.log
--pid-path=PATH
指向Nginx啟動后進(jìn)行ID的文件路徑,默認(rèn)值為<prefix>/logs/nginx.pid
--lock-path=PATH
指向Nginx鎖文件的存放路徑,默認(rèn)值為<prefix>/logs/nginx.lock
要想使用可以通過如下命令
./configure \
--prefix=/usr/local/tempdata/soft/nginx \
--sbin-path=/usr/local/tempdata/soft/nginx/sbin/nginx \
--modules-path=/usr/local/tempdata/soft/nginx/modules \
--conf-path=/usr/local/tempdata/soft/nginx/conf/nginx.conf \
--error-log-path=/usr/local/tempdata/soft/nginx/logs/error.log \
--http-log-path=/usr/local/tempdata/soft/nginx/logs/access.log \
--pid-path=/usr/local/tempdata/soft/nginx/logs/nginx.pid \
--lock-path=/usr/local/tempdata/soft/nginx/logs/nginx.lock
在使用上述命令之前,需要將之前服務(wù)器已經(jīng)安裝的nginx進(jìn)行卸載,卸載的步驟分為三步驟:
步驟一:需要將nginx的進(jìn)程關(guān)閉
./nginx -s stop
步驟二:將安裝的nginx進(jìn)行刪除
rm -rf /usr/local/nginx
步驟三:將安裝包之前編譯的環(huán)境清除掉
make clean
Nginx目錄結(jié)構(gòu)分析
在使用Nginx之前,我們先對安裝好的Nginx目錄文件進(jìn)行一個分析,在這塊給大家介紹一個工具tree,通過tree我們可以很方面的去查看centos系統(tǒng)上的文件目錄結(jié)構(gòu),當(dāng)然,如果想使用tree工具,就得先通過yum install -y tree來進(jìn)行安裝,安裝成功后,可以通過執(zhí)行tree /usr/local/nginx(tree后面跟的是Nginx的安裝目錄),獲取的結(jié)果如下:

conf:nginx所有配置文件目錄
? CGI(Common Gateway Interface)通用網(wǎng)關(guān)【接口】,主要解決的問題是從客戶端發(fā)送一個請求和數(shù)據(jù),服務(wù)端獲取到請求和數(shù)據(jù)后可以調(diào)用調(diào)用CGI【程序】處理及相應(yīng)結(jié)果給客戶端的一種標(biāo)準(zhǔn)規(guī)范。
? fastcgi.conf:fastcgi相關(guān)配置文件
? fastcgi.conf.default:fastcgi.conf的備份文件
? fastcgi_params:fastcgi的參數(shù)文件
? fastcgi_params.default:fastcgi的參數(shù)備份文件
? scgi_params:scgi的參數(shù)文件
? scgi_params.default:scgi的參數(shù)備份文件
? uwsgi_params:uwsgi的參數(shù)文件
? uwsgi_params.default:uwsgi的參數(shù)備份文件
? mime.types:記錄的是HTTP協(xié)議中的Content-Type的值和文件后綴名的對應(yīng)關(guān)系
? mime.types.default:mime.types的備份文件
? nginx.conf:這個是Nginx的核心配置文件,這個文件非常重要,也是我們即將要學(xué)習(xí)的重點
? nginx.conf.default:nginx.conf的備份文件
? koi-utf、koi-win、win-utf這三個文件都是與編碼轉(zhuǎn)換映射相關(guān)的配置文件,用來將一種編碼轉(zhuǎn)換成另一種編碼
html:存放nginx自帶的兩個靜態(tài)的html頁面
? 50x.html:訪問失敗后的失敗頁面
? index.html:成功訪問的默認(rèn)首頁
logs:記錄入門的文件,當(dāng)nginx服務(wù)器啟動后,這里面會有 access.log error.log 和nginx.pid三個文件出現(xiàn)。
sbin:是存放執(zhí)行程序文件nginx
? nginx是用來控制Nginx的啟動和停止等相關(guān)的命令。
Nginx服務(wù)器啟停命令
Nginx安裝完成后,接下來我們要學(xué)習(xí)的是如何啟動、重啟和停止Nginx的服務(wù)。
對于Nginx的啟停在linux系統(tǒng)中也有很多種方式,我們本次課程介紹兩種方式:
-
Nginx服務(wù)的信號控制
-
Nginx的命令行控制
方式一:Nginx服務(wù)的信號控制
Nginx中的master和worker進(jìn)程?
Nginx的工作方式?
如何獲取進(jìn)程的PID?
信號有哪些?
如何通過信號控制Nginx的啟停等相關(guān)操作?
前面在提到Nginx的高性能,其實也和它的架構(gòu)模式有關(guān)。Nginx默認(rèn)采用的是多進(jìn)程的方式來工作的,當(dāng)將Nginx啟動后,我們通過ps -ef | grep nginx命令可以查看到如下內(nèi)容:

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

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

- 發(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:在配置測試期間禁止顯示非錯誤消息
-s:signal信號,后面可以跟 :
? stop[快速關(guān)閉,類似于TERM/INT信號的作用]
? quit[優(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:用來補充Nginx配置文件,向Nginx服務(wù)指定啟動時應(yīng)用全局的配置
Nginx服務(wù)器版本升級和新增模塊
如果想對Nginx的版本進(jìn)行更新,或者要應(yīng)用一些新的模塊,最簡單的做法就是停止當(dāng)前的Nginx服務(wù),然后開啟新的Nginx服務(wù)。但是這樣會導(dǎo)致在一段時間內(nèi),用戶是無法訪問服務(wù)器。為了解決這個問題,我們就需要用到Nginx服務(wù)器提供的平滑升級功能。這個也是Nginx的一大特點,使用這種方式,就可以使Nginx在7*24小時不間斷的提供服務(wù)了。接下來我們分析下需求:
需求:Nginx的版本最開始使用的是Nginx-1.14.2,由于服務(wù)升級,需要將Nginx的版本升級到Nginx-1.16.1,要求Nginx不能中斷提供服務(wù)。
為了應(yīng)對上述的需求,這里我們給大家提供兩種解決方案:
方案一:使用Nginx服務(wù)信號完成Nginx的升級
方案二:使用Nginx安裝目錄的make命令完成升級
環(huán)境準(zhǔn)備
(1)先準(zhǔn)備兩個版本的Nginx分別是 1.14.2和1.16.1
(2)使用Nginx源碼安裝的方式將1.14.2版本安裝成功并正確訪問
進(jìn)入安裝目錄
./configure
make && make install
(3)將Nginx1.16.1進(jìn)行參數(shù)配置和編譯,不需要進(jìn)行安裝。
進(jìn)入安裝目錄
./configure
make
方案一:使用Nginx服務(wù)信號進(jìn)行升級
第一步:將1.14.2版本的sbin目錄下的nginx進(jìn)行備份
cd /usr/local/nginx/sbin
mv nginx nginxold
第二步:將Nginx1.16.1安裝目錄編譯后的objs目錄下的nginx文件,拷貝到原來/usr/local/nginx/sbin目錄下
cd ~/nginx/core/nginx-1.16.1/objs
cp nginx /usr/local/nginx/sbin
第三步:發(fā)送信號USR2給Nginx的1.14.2版本對應(yīng)的master進(jìn)程
第四步:發(fā)送信號QUIT給Nginx的1.14.2版本對應(yīng)的master進(jìn)程
kill -QUIT `more /usr/local/logs/nginx.pid.oldbin`
方案二:使用Nginx安裝目錄的make命令完成升級
第一步:將1.14.2版本的sbin目錄下的nginx進(jìn)行備份
cd /usr/local/nginx/sbin
mv nginx nginxold
第二步:將Nginx1.16.1安裝目錄編譯后的objs目錄下的nginx文件,拷貝到原來/usr/local/nginx/sbin目錄下
cd ~/nginx/core/nginx-1.16.1/objs
cp nginx /usr/local/nginx/sbin
第三步:進(jìn)入到安裝目錄,執(zhí)行make upgrade

第四步:查看是否更新成功
./nginx -v
在整個過程中,其實Nginx是一直對外提供服務(wù)的。并且當(dāng)Nginx的服務(wù)器啟動成功后,我們是可以通過瀏覽器進(jìn)行直接訪問的,同時我們可以通過更改html目錄下的頁面來修改我們在頁面上所看到的內(nèi)容,那么問題來了,為什么我們要修改html目錄下的文件,能不能多添加一些頁面是Nginx的功能更加豐富,還有前面聊到Nginx的前端功能又是如何來實現(xiàn)的,這就需要我們對Nginx的核心配置文件進(jìn)行一個詳細(xì)的學(xué)習(xí)。
Nginx核心配置文件結(jié)構(gòu)
從前面的內(nèi)容學(xué)習(xí)中,我們知道Nginx的核心配置文件默認(rèn)是放在/usr/local/nginx/conf/nginx.conf,這一節(jié),我們就來學(xué)習(xí)下nginx.conf的內(nèi)容和基本配置方法。
讀取Nginx自帶的Nginx配置文件,我們將其中的注釋部分【學(xué)習(xí)一個技術(shù)點就是在Nginx的配置文件中可以使用#來注釋】刪除掉后,就剩下下面內(nèi)容:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
指令名 指令值; #全局塊,主要設(shè)置Nginx服務(wù)器整體運行的配置指令
#events塊,主要設(shè)置,Nginx服務(wù)器與用戶的網(wǎng)絡(luò)連接,這一部分對Nginx服務(wù)器的性能影響較大
events {
指令名 指令值;
}
#http塊,是Nginx服務(wù)器配置中的重要部分,代理、緩存、日志記錄、第三方模塊配置...
http {
指令名 指令值;
server { #server塊,是Nginx配置和虛擬主機相關(guān)的內(nèi)容
指令名 指令值;
location / {
#location塊,基于Nginx服務(wù)器接收請求字符串與location后面的值進(jìn)行匹配,對特定請求進(jìn)行處理
指令名 指令值;
}
}
...
}
簡單小結(jié)下:
nginx.conf配置文件中默認(rèn)有三大塊:全局塊、events塊、http塊
http塊中可以配置多個server塊,每個server塊又可以配置多個location塊。
全局塊
user指令
(1)user:用于配置運行Nginx服務(wù)器的worker進(jìn)程的用戶和用戶組。
| 語法 | user user [group] |
|---|---|
| 默認(rèn)值 | nobody |
| 位置 | 全局塊 |
該屬性也可以在編譯的時候指定,語法如下./configure --user=user --group=group,如果兩個地方都進(jìn)行了設(shè)置,最終生效的是配置文件中的配置。
該指令的使用步驟:
(1)設(shè)置一個用戶信息"www"
user www;

(2) 創(chuàng)建一個用戶
useradd www
(3)修改user屬性
user www
(4)創(chuàng)建/root/html/index.html頁面,添加如下內(nèi)容
<!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>I am WWW</em></p>
</body>
</html>
(5)修改nginx.conf
location / {
root /root/html;
index index.html index.htm;
}
(5)測試啟動訪問
頁面會報403拒絕訪問的錯誤
(6)分析原因
因為當(dāng)前用戶沒有訪問/root/html目錄的權(quán)限
(7)將文件創(chuàng)建到 /home/www/html/index.html,修改配置
location / {
root /home/www/html;
index index.html index.htm;
}
(8)再次測試啟動訪問
能正常訪問。
綜上所述,使用user指令可以指定啟動運行工作進(jìn)程的用戶及用戶組,這樣對于系統(tǒng)的權(quán)限訪問控制的更加精細(xì),也更加安全。
work process指令
master_process:用來指定是否開啟工作進(jìn)程。
| 語法 | master_process on|off; |
|---|---|
| 默認(rèn)值 | master_process on; |
| 位置 | 全局塊 |
worker_processes:用于配置Nginx生成工作進(jìn)程的數(shù)量,這個是Nginx服務(wù)器實現(xiàn)并發(fā)處理服務(wù)的關(guān)鍵所在。理論上來說workder process的值越大,可以支持的并發(fā)處理量也越多,但事實上這個值的設(shè)定是需要受到來自服務(wù)器自身的限制,建議將該值和服務(wù)器CPU的內(nèi)核數(shù)保存一致。
| 語法 | worker_processes num/auto; |
|---|---|
| 默認(rèn)值 | 1 |
| 位置 | 全局塊 |
如果將worker_processes設(shè)置成2,則會看到如下內(nèi)容:

其他指令
daemon:設(shè)定Nginx是否以守護(hù)進(jìn)程的方式啟動。
守護(hù)式進(jìn)程是linux后臺執(zhí)行的一種服務(wù)進(jìn)程,特點是獨立于控制終端,不會隨著終端關(guān)閉而停止。
| 語法 | daemon on|off; |
|---|---|
| 默認(rèn)值 | daemon on; |
| 位置 | 全局塊 |
pid:用來配置Nginx當(dāng)前master進(jìn)程的進(jìn)程號ID存儲的文件路徑。
| 語法 | pid file; |
|---|---|
| 默認(rèn)值 | 默認(rèn)為:/usr/local/nginx/logs/nginx.pid |
| 位置 | 全局塊 |
該屬性可以通過./configure --pid-path=PATH來指定
error_log:用來配置Nginx的錯誤日志存放路徑
| 語法 | 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,翻譯過來為試|信息|通知|警告|錯誤|臨界|警報|緊急,這塊建議大家設(shè)置的時候不要設(shè)置成info以下的等級,因為會帶來大量的磁盤I/O消耗,影響Nginx的性能。
(5)include:用來引入其他配置文件,使Nginx的配置更加靈活
| 語法 | include file; |
|---|---|
| 默認(rèn)值 | 無 |
| 位置 | any |
events塊
(1)accept_mutex:用來設(shè)置Nginx網(wǎng)絡(luò)連接序列化
| 語法 | accept_mutex on|off; |
|---|---|
| 默認(rèn)值 | accept_mutex on; |
| 位置 | events |
這個配置主要可以用來解決常說的"驚群"問題。大致意思是在某一個時刻,客戶端發(fā)來一個請求連接,Nginx后臺是以多進(jìn)程的工作模式,也就是說有多個worker進(jìn)程會被同時喚醒,但是最終只會有一個進(jìn)程可以獲取到連接,如果每次喚醒的進(jìn)程數(shù)目太多,就會影響Nginx的整體性能。如果將上述值設(shè)置為on(開啟狀態(tài)),將會對多個Nginx進(jìn)程接收連接進(jìn)行序列號,一個個來喚醒接收,就防止了多個進(jìn)程對連接的爭搶。

(2)multi_accept:用來設(shè)置是否允許同時接收多個網(wǎng)絡(luò)連接
| 語法 | multi_accept on|off; |
|---|---|
| 默認(rèn)值 | multi_accept off; |
| 位置 | events |
如果multi_accept被禁止了,nginx一個工作進(jìn)程只能同時接受一個新的連接。否則,一個工作進(jìn)程可以同時接受所有的新連接
(3)worker_connections:用來配置單個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ū)動來處理網(wǎng)絡(luò)消息。
| 語法 | use method; |
|---|---|
| 默認(rèn)值 | 根據(jù)操作系統(tǒng)定 |
| 位置 | events |
注意:此處所選擇事件處理模型是Nginx優(yōu)化部分的一個重要內(nèi)容,method的可選值有select/poll/epoll/kqueue等,之前在準(zhǔn)備centos環(huán)境的時候,我們強調(diào)過要使用linux內(nèi)核在2.6以上,就是為了能使用epoll函數(shù)來優(yōu)化Nginx。
另外這些值的選擇,我們也可以在編譯的時候使用
--with-select_module、--without-select_module、
--with-poll_module、 --without-poll_module來設(shè)置是否需要將對應(yīng)的事件驅(qū)動模塊編譯到Nginx的內(nèi)核。
events指令配置實例
打開Nginx的配置文件 nginx.conf,添加如下配置
events{
accept_mutex on;
multi_accept on;
worker_commections 1024;
use epoll;
}
啟動測試
./nginx -t
./nginx -s reload
http塊
定義MIME-Type
我們都知道瀏覽器中可以顯示的內(nèi)容有HTML、XML、GIF等種類繁多的文件、媒體等資源,瀏覽器為了區(qū)分這些資源,就需要使用MIME Type。所以說MIME Type是網(wǎng)絡(luò)資源的媒體類型。Nginx作為web服務(wù)器,也需要能夠識別前端請求的資源類型。
在Nginx的配置文件中,默認(rèn)有兩行配置
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)前的配置文件中。
舉例來說明:
有些時候請求某些接口的時候需要返回指定的文本字符串或者json字符串,如果邏輯非常簡單或者干脆是固定的字符串,那么可以使用nginx快速實現(xiàn),這樣就不用編寫程序響應(yīng)請求了,可以減少服務(wù)器資源占用并且響應(yīng)性能非???。
如何實現(xiàn):
location /get_text {
#這里也可以設(shè)置成text/plain
default_type text/html;
return 200 "This is nginx's text";
}
location /get_json{
default_type application/json;
return 200 '{"name":"TOM","age":18}';
}
自定義服務(wù)日志
Nginx中日志的類型分access.log、error.log。
access.log:用來記錄用戶所有的訪問請求。
error.log:記錄nginx本身運行時的錯誤信息,不會記錄用戶的訪問請求。
Nginx服務(wù)器支持對服務(wù)日志的格式、大小、輸出等進(jìn)行設(shè)置,需要使用到兩個指令,分別是access_log和log_format指令。
(1)access_log:用來設(shè)置用戶訪問日志的相關(guān)屬性。
| 語法 | access_log path[format[buffer=size]] |
|---|---|
| 默認(rèn)值 | access_log logs/access.log combined; |
| 位置 | http, server, location |
(2)log_format:用來指定日志的輸出格式。
| 語法 | log_format name [escape=default|json|none] string....; |
|---|---|
| 默認(rèn)值 | log_format combined "..."; |
| 位置 | http |
其他配置指令
(1)sendfile:用來設(shè)置Nginx服務(wù)器是否使用sendfile()傳輸文件,該屬性可以大大提高Nginx處理靜態(tài)資源的性能
| 語法 | sendfile on|off; |
|---|---|
| 默認(rèn)值 | sendfile off; |
| 位置 | http、server、location |
(2)keepalive_timeout:用來設(shè)置長連接的超時時間。
》為什么要使用keepalive?
我們都知道HTTP是一種無狀態(tài)協(xié)議,客戶端向服務(wù)端發(fā)送一個TCP請求,服務(wù)端響應(yīng)完畢后斷開連接。
如何客戶端向服務(wù)端發(fā)送多個請求,每個請求都需要重新創(chuàng)建一次連接,效率相對來說比較多,使用keepalive模式,可以告訴服務(wù)器端在處理完一個請求后保持這個TCP連接的打開狀態(tài),若接收到來自這個客戶端的其他請求,服務(wù)端就會利用這個未被關(guān)閉的連接,而不需要重新創(chuàng)建一個新連接,提升效率,但是這個連接也不能一直保持,這樣的話,連接如果過多,也會是服務(wù)端的性能下降,這個時候就需要我們進(jìn)行設(shè)置其的超時時間。
| 語法 | keepalive_timeout time; |
|---|---|
| 默認(rèn)值 | keepalive_timeout 75s; |
| 位置 | http、server、location |
(3)keepalive_requests:用來設(shè)置一個keep-alive連接使用的次數(shù)。
| 語法 | keepalive_requests number; |
|---|---|
| 默認(rèn)值 | keepalive_requests 100; |
| 位置 | http、server、location |
server塊和location塊
server塊和location塊都是我們要重點講解和學(xué)習(xí)的內(nèi)容,因為我們后面會對Nginx的功能進(jìn)行詳細(xì)講解,所以這塊內(nèi)容就放到靜態(tài)資源部署的地方給大家詳細(xì)說明。
本節(jié)我們主要來認(rèn)識下Nginx默認(rèn)給的nginx.conf中的相關(guān)內(nèi)容,以及server塊與location塊在使用的時候需要注意的一些內(nèi)容。
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 404 /50x.html;
location = /50x.html {
root html;
}
}

浙公網(wǎng)安備 33010602011771號