為什麼突然決定總結Nginx ?

  1. 不知不覺8月份又要過完了,時間真是個無情的崽種。
  2. Nginx 首先,主要源於最近專案部署工作中和公司技術中心的人對接部署相關事宜流程太繁瑣了。每個部門有各自的工作安排 要協調要溝通就會有耗時。博主是一個不想麻煩別人的人 非外部或依託平臺的自身條件限制等原因,能自己解決的就都自己解決。
  3. 其次,工作幾年來,或多或少都有用到Nginx的相關場景,也相當於是自己的一次梳理,將知識結構化和體系化。

Nginx簡介

背景介紹

Nginx(“engine x”)一個具有高效能的【HTTP】和【反向代理】的【WEB伺服器】,同時也是一個【POP3/SMTP/IMAP代理伺服器】,是由伊戈爾·賽索耶夫(俄羅斯人)使用C語言編寫的,Nginx的第一個版本是2004年10月4號釋出的0.1.0版本。另外值得一提的是伊戈爾·賽索耶夫將Nginx的原始碼進行了開源,這也為Nginx的發展提供了良好的保障。

名詞解釋

  1. WEB伺服器:

WEB伺服器也叫網頁伺服器,英文名叫Web Server,主要功能是為使用者提供網上資訊瀏覽服務。

  1. HTTP:

HTTP是超文字傳輸協議的縮寫,是用於從WEB伺服器傳輸超文字到本地瀏覽器的傳輸協議,也是網際網路上應用最為廣泛的一種網路協議。HTTP是一個客戶端和伺服器端請求和應答的標準,客戶端是終端使用者,服務端是網站,通過使用Web瀏覽器、網路爬蟲或者其他工具,客戶端發起一個到伺服器上指定埠的HTTP請求。

  1. POP3/SMTP/IMAP:

POP3(Post Offic Protocol 3)郵局協議的第三個版本,

SMTP(Simple Mail Transfer Protocol)簡單郵件傳輸協議,

IMAP(Internet Mail Access Protocol)互動式郵件存取協議,

通過上述名詞的解釋,我們可以瞭解到Nginx也可以作為電子郵件代理伺服器。

  1. 反向代理

正向代理

反向代理

常見伺服器對比

在介紹這一節內容之前,我們先來認識一家公司叫Netcraft。

  1. Netcraft公司於1994年底在英國成立,多年來一直致力於網際網路市場以及線上安全方面的諮詢服務,其中在國際上最具影響力的當屬其針對網站伺服器、SSL市場所做的客觀嚴謹的分析研究,公司官網每月公佈的調研資料(Web Server Survey)已成為當今人們瞭解全球網站數量以及伺服器市場分額情況的主要參考依據,時常被諸如華爾街雜誌,英國BBCSlashdot等媒體報道或引用。

我們先來看一組資料,我們先開啟Nginx的官方網站 http://nginx.org/,找到Netcraft公司公佈的資料,對當前主流伺服器產品進行介紹。

上面這張圖展示了2019年全球主流Web伺服器的市場情況,其中有Apache、Microsoft-IIS、google Servers、Nginx、Tomcat等,而我們在瞭解新事物的時候,往往習慣通過類比來幫助自己理解事物的概貌。所以下面我們把幾種常見的伺服器來給大家簡單介紹下:

IIS

​ 全稱(Internet Information Services)即網際網路資訊服務,是由微軟公司提供的基於windows系統的網際網路基本服務。windows作為伺服器在穩定性與其他一些效能上都不如類UNIX作業系統,因此在需要高效能Web伺服器的場合下,IIS可能就會被"冷落".

Tomcat

​ Tomcat是一個執行Servlet和JSP的Web應用軟體,Tomcat技術先進、效能穩定而且開放原始碼,因此深受Java愛好者的喜愛並得到了部分軟體開發商的認可,成為目前比較流行的Web應用伺服器。但是Tomcat天生是一個重量級的Web伺服器,對靜態檔案和高併發的處理比較弱。

Apache

​ Apache的發展時期很長,同時也有過一段輝煌的業績。從上圖可以看出大概在2014年以前都是市場份額第一的伺服器。Apache有很多優點,如穩定、開源、跨平臺等。但是它出現的時間太久了,在它興起的年代,網際網路的產業規模遠遠不如今天,所以它被設計成一個重量級的、不支援高併發的Web伺服器。在Apache伺服器上,如果有數以萬計的併發HTTP請求同時訪問,就會導致伺服器上消耗大量能存,作業系統核心對成百上千的Apache程序做程序間切換也會消耗大量的CUP資源,並導致HTTP請求的平均響應速度降低,這些都決定了Apache不可能成為高效能的Web伺服器。這也促使了Lighttpd和Nginx的出現。

Lighttpd

​ Lighttpd是德國的一個開源的Web伺服器軟體,它和Nginx一樣,都是輕量級、高效能的Web伺服器,歐美的業界開發者比較鍾愛Lighttpd,而國內的公司更多的青睞Nginx,同時網上Nginx的資源要更豐富些。

其他的伺服器

Google Servers,Weblogic, Webshpere(IBM)...

經過各個伺服器的對比,種種跡象都表明,Nginx將以效能為王。這也是我們為什麼選擇Nginx的理由。

Nginx的優點

(1)速度更快、併發更高

單次請求或者高併發請求的環境下,Nginx都會比其他Web伺服器響應的速度更快。一方面在正常情況下,單次請求會得到更快的響應,另一方面,在高峰期(如有數以萬計的併發請求),Nginx比其他Web伺服器更快的響應請求。Nginx之所以有這麼高的併發處理能力和這麼好的效能原因在於Nginx採用了多程序和I/O多路複用(epoll)的底層實現。

(2)配置簡單,擴充套件性強

Nginx的設計極具擴充套件性,它本身就是由很多模組組成,這些模組的使用可以通過配置檔案的配置來新增。這些模組有官方提供的也有第三方提供的模組,如果需要完全可以開發服務自己業務特性的定製模組。

(3)高可靠性

Nginx採用的是多程序模式執行,其中有一個master主程序和N多個worker程序,worker程序的數量我們可以手動設定,每個worker程序之間都是相互獨立提供服務,並且master主程序可以在某一個worker程序出錯時,快速去"拉起"新的worker程序提供服務。

(4)熱部署

現在網際網路專案都要求以7*24小時進行服務的提供,針對於這一要求,Nginx也提供了熱部署功能,即可以在Nginx不停止的情況下,對Nginx進行檔案升級、更新配置和更換日誌檔案等功能。

(5)成本低、BSD許可證

BSD是一個開源的許可證,世界上的開源許可證有很多,現在比較流行的有六種分別是GPL、BSD、MIT、Mozilla、Apache、LGPL。這六種的區別是什麼,我們可以通過下面一張圖來解釋下:

Nginx本身是開源的,我們不僅可以免費的將Nginx應用在商業領域,而且還可以在專案中直接修改Nginx的原始碼來定製自己的特殊要求。這些點也都是Nginx為什麼能吸引無數開發者繼續為Nginx來貢獻自己的智慧和青春。OpenRestry [Nginx+Lua] Tengine[淘寶]

Nginx的功能特性及常用功能

Nginx提供的基本功能服務從大體上歸納為"基本HTTP服務"、“高階HTTP服務”和"郵件服務"等三大類。

基本HTTP服務

Nginx可以提供基本HTTP服務,可以作為HTTP代理伺服器和反向代理伺服器,支援通過快取加速訪問,可以完成簡單的負載均衡和容錯,支援包過濾功能,支援SSL等。

  • 處理靜態檔案、處理索引檔案以及支援自動索引;
  • 提供反向代理伺服器,並可以使用快取加上反向代理,同時完成負載均衡和容錯;
  • 提供對FastCGI、memcached等服務的快取機制,,同時完成負載均衡和容錯;
  • 使用Nginx的模組化特性提供過濾器功能。Nginx基本過濾器包括gzip壓縮、ranges支援、chunked響應、XSLT、SSI以及影象縮放等。其中針對包含多個SSI的頁面,經由FastCGI或反向代理,SSI過濾器可以並行處理。
  • 支援HTTP下的安全套接層安全協議SSL.
  • 支援基於加權和依賴的優先權的HTTP/2

高階HTTP服務

  • 支援基於名字和IP的虛擬主機設定
  • 支援HTTP/1.0中的KEEP-Alive模式和管線(PipeLined)模型連線
  • 自定義訪問日誌格式、帶快取的日誌寫操作以及快速日誌輪轉。
  • 提供3xx~5xx錯誤程式碼重定向功能
  • 支援重寫(Rewrite)模組擴充套件
  • 支援重新載入配置以及線上升級時無需中斷正在處理的請求
  • 支援網路監控
  • 支援FLV和MP4流媒體傳輸

郵件服務

Nginx提供郵件代理服務也是其基本開發需求之一,主要包含以下特性:

  • 支援IMPA/POP3代理服務功能
  • 支援內部SMTP代理服務功能

Nginx常用的功能模組

  1. 靜態資源部署
  2. Rewrite地址重寫
  3. 正則表示式
  4. 反向代理
  5. 負載均衡
  6. 輪詢、加權輪詢、ip_hashurl_hashfair
  7. Web快取
  8. 環境部署
  9. 高可用的環境
  10. 使用者認證模組...

Nginx的核心組成

  1. nginx二進位制可執行檔案
  2. nginx.conf配置檔案
  3. error.log錯誤的日誌記錄
  4. access.log訪問日誌記錄

Nginx環境準備

Nginx版本介紹

Nginx的官方網站為: http://nginx.org

開啟原始碼可以看到如下的頁面內容

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

獲取Nginx原始碼

http://nginx.org/download/

開啟上述網站,就可以檢視到Nginx的所有版本,選中自己需要的版本進行下載。下載我們可以直接在windows上下載然後上傳到伺服器,也可以直接從伺服器上下載,這個時候就需要準備一臺伺服器。

準備伺服器系統

環境準備

  1. VMware WorkStation
  2. Centos7
  3. MobaXterm
  4. xsheel,SecureCRT
  5. 網路

(1)確認centos的核心

準備一個核心為2.6及以上版本的作業系統,因為linux2.6及以上核心才支援epoll,而Nginx需要解決高併發壓力問題是需要用到epoll,所以我們需要有這樣的版本要求。

我們可以使用uname -a命令來查詢linux的核心版本。

(2)確保centos能聯網

  1. ping www.baidu.com

(3)確認關閉防火牆

這一項的要求僅針對於那些對linux系統的防火牆設定規則不太清楚的,建議大家把防火牆都關閉掉,因為我們此次課程主要的內容是對Nginx的學習,把防火牆關閉掉,可以省掉後續Nginx學習過程中遇到的諸多問題。

關閉的方式有如下兩種:

  1. systemctl stop firewalld 關閉執行的防火牆,系統重新啟動後,防火牆將重新開啟
  2. systemctl disable firewalld 永久關閉防火牆,,系統重新啟動後,防火牆依然關閉
  3. systemctl status firewalld 檢視防火牆狀態

(4)確認停用selinux

selinux(security-enhanced linux),美國安全域性對於強制訪問控制的實現,在linux2.6核心以後的版本中,selinux已經成功核心中的一部分。可以說selinux是linux史上最傑出的新安全子系統之一。雖然有了selinux,我們的系統會更安全,但是對於我們的學習Nginx的歷程中,會多很多設定,所以這塊建議大家將selinux進行關閉。

sestatus檢視狀態

如果檢視不是disabled狀態,我們可以通過修改配置檔案來進行設定,修改SELINUX=disabled,然後重啟下系統即可生效。

  1. vim /etc/selinux/config

Nginx安裝方式介紹

Nginx的安裝方式有兩種分別是:

  1. 通過Nginx原始碼
  2. 通過Nginx原始碼簡單安裝 (1)
  3. 通過Nginx原始碼複雜安裝 (3)
  4. 通過yum安裝 (2)

如果通過Nginx原始碼安裝需要提前準備的內容:

GCC編譯器

Nginx是使用C語言編寫的程式,因此想要執行Nginx就需要安裝一個編譯工具。GCC就是一個開源的編譯器集合,用於處理各種各樣的語言,其中就包含了C語言。

使用命令yum install -y gcc來安裝

安裝成功後,可以通過gcc --version來檢視gcc是否安裝成功

PCRE

Nginx在編譯過程中需要使用到PCRE庫(perl Compatible Regular Expressoin 相容正則表示式庫),因為在Nginx的Rewrite模組和http核心模組都會使用到PCRE正則表示式語法。

可以使用命令yum install -y pcre pcre-devel來進行安裝

安裝成功後,可以通過rpm -qa pcre pcre-devel來檢視是否安裝成功

zlib

zlib庫提供了開發人員的壓縮演算法,在Nginx的各個模組中需要使用gzip壓縮,所以我們也需要提前安裝其庫及原始碼zlib和zlib-devel

可以使用命令yum install -y zlib zlib-devel來進行安裝

安裝成功後,可以通過rpm -qa zlib zlib-devel來檢視是否安裝成功

OpenSSL

OpenSSL是一個開放原始碼的軟體庫包,應用程式可以使用這個包進行安全通訊,並且避免被竊聽。

SSL:Secure Sockets Layer安全套接協議的縮寫,可以在Internet上提供祕密性傳輸,其目標是保證兩個應用間通訊的保密性和可靠性。在Nginx中,如果伺服器需要提供安全網頁時就需要用到OpenSSL庫,所以我們需要對OpenSSL的庫檔案及它的開發安裝包進行一個安裝。

可以使用命令yum install -y openssl openssl-devel來進行安裝

安裝成功後,可以通過rpm -qa openssl openssl-devel來檢視是否安裝成功

上述命令,一個個來的話比較麻煩,我們也可以通過一條命令來進行安裝

yum install -y gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel進行全部安裝。

方案一:Nginx的原始碼簡單安裝

(1)進入官網查詢需要下載版本的連結地址,然後使用wget命令進行下載

  1. wget http://nginx.org/download/nginx-1.16.1.tar.gz

(2)建議大家將下載的資源進行包管理

  1. mkdir -p nginx/core
  2. mv nginx-1.16.1.tar.gz nginx/core

(3)解壓縮

  1. tar -xzf nginx-1.16.1.tar.gz

(4)進入資原始檔中,發現configure

  1. ./configure

(5)編譯

  1. make

(6)安裝

  1. make install

方案二:yum安裝

使用原始碼進行簡單安裝,我們會發現安裝的過程比較繁瑣,需要提前準備GCC編譯器、PCRE相容正則表示式庫、zlib壓縮庫、OpenSSL安全通訊的軟體庫包,然後才能進行Nginx的安裝。

(1)安裝yum-utils

  1. sudo yum install -y yum-utils

(2)新增yum原始檔

  1. vim /etc/yum.repos.d/nginx.repo
  1. [nginx-stable]
  2. name=nginx stable repo
  3. baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
  4. gpgcheck=1
  5. enabled=1
  6. gpgkey=https://nginx.org/keys/nginx_signing.key
  7. module_hotfixes=true
  8. [nginx-mainline]
  9. name=nginx mainline repo
  10. baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
  11. gpgcheck=1
  12. enabled=0
  13. gpgkey=https://nginx.org/keys/nginx_signing.key
  14. module_hotfixes=true

(3)檢視是否安裝成功

  1. yum list | grep nginx

(4)使用yum進行安裝

  1. yun install -y nginx

(5)檢視nginx的安裝位置

  1. whereis nginx

(6)啟動測試

原始碼簡單安裝和yum安裝的差異:

這裡先介紹一個命令: ./nginx -V,通過該命令可以檢視到所安裝Nginx的版本及相關配置資訊。

簡單安裝

yum安裝

解壓Nginx目錄

執行tar -zxvf nginx-1.16.1.tar.gz對下載的資源進行解壓縮,進入壓縮後的目錄,可以看到如下結構

內容解釋:

auto:存放的是編譯相關的指令碼

CHANGES:版本變更記錄

CHANGES.ru:俄羅斯文的版本變更記錄

conf:nginx預設的配置檔案

configure:nginx軟體的自動指令碼程式,是一個比較重要的檔案,作用如下:

​ (1)檢測環境及根據環境檢測結果生成C程式碼

​ (2)生成編譯程式碼需要的Makefile檔案

contrib:存放的是幾個特殊的指令碼檔案,其中README中對指令碼有著詳細的說明

html:存放的是Nginx自帶的兩個html頁面,訪問Nginx的首頁和錯誤頁面

LICENSE:許可證的相關描述檔案

man:nginx的man手冊

README:Nginx的閱讀指南

src:Nginx的原始碼

方案三:Nginx的原始碼複雜安裝

這種方式和簡單的安裝配置不同的地方在第一步,通過./configure來對編譯引數進行設定,需要我們手動來指定。那麼都有哪些引數可以進行設定,接下來我們進行一個詳細的說明。

PATH:是和路徑相關的配置資訊

with:是啟動模組,預設是關閉的

without:是關閉模組,預設是開啟的

我們先來認識一些簡單的路徑配置已經通過這些配置來完成一個簡單的編譯:

--prefix=PATH

  1. 指向Nginx的安裝目錄,預設值為/usr/local/nginx

--sbin-path=PATH

  1. 指向(執行)程式檔案(nginx)的路徑,預設值為<prefix>/sbin/nginx

--modules-path=PATH

  1. 指向Nginx動態模組安裝目錄,預設值為<prefix>/modules

--conf-path=PATH

  1. 指向配置檔案(nginx.conf)的路徑,預設值為<prefix>/conf/nginx.conf

--error-log-path=PATH

  1. 指向錯誤日誌檔案的路徑,預設值為<prefix>/logs/error.log

--http-log-path=PATH

  1. 指向訪問日誌檔案的路徑,預設值為<prefix>/logs/access.log

--pid-path=PATH

  1. 指向Nginx啟動後進行ID的檔案路徑,預設值為<prefix>/logs/nginx.pid

--lock-path=PATH

  1. 指向Nginx鎖檔案的存放路徑,預設值為<prefix>/logs/nginx.lock

要想使用可以通過如下命令

  1. ./configure \
  2. --prefix=/usr/local/tempdata/soft/nginx \
  3. --sbin-path=/usr/local/tempdata/soft/nginx/sbin/nginx \
  4. --modules-path=/usr/local/tempdata/soft/nginx/modules \
  5. --conf-path=/usr/local/tempdata/soft/nginx/conf/nginx.conf \
  6. --error-log-path=/usr/local/tempdata/soft/nginx/logs/error.log \
  7. --http-log-path=/usr/local/tempdata/soft/nginx/logs/access.log \
  8. --pid-path=/usr/local/tempdata/soft/nginx/logs/nginx.pid \
  9. --lock-path=/usr/local/tempdata/soft/nginx/logs/nginx.lock

在使用上述命令之前,需要將之前伺服器已經安裝的nginx進行解除安裝,解除安裝的步驟分為三步驟:

步驟一:需要將nginx的程序關閉

  1. ./nginx -s stop

步驟二:將安裝的nginx進行刪除

  1. rm -rf /usr/local/nginx

步驟三:將安裝包之前編譯的環境清除掉

  1. make clean

Nginx目錄結構分析

在使用Nginx之前,我們先對安裝好的Nginx目錄檔案進行一個分析,在這塊給大家介紹一個工具tree,通過tree我們可以很方面的去檢視centos系統上的檔案目錄結構,當然,如果想使用tree工具,就得先通過yum install -y tree來進行安裝,安裝成功後,可以通過執行tree /usr/local/nginx(tree後面跟的是Nginx的安裝目錄),獲取的結果如下:

conf:nginx所有配置檔案目錄

​ CGI(Common Gateway Interface)通用閘道器【介面】,主要解決的問題是從客戶端傳送一個請求和資料,服務端獲取到請求和資料後可以呼叫呼叫CGI【程式】處理及相應結果給客戶端的一種標準規範。

​ fastcgi.conf:fastcgi相關配置檔案

​ fastcgi.conf.default:fastcgi.conf的備份檔案

​ fastcgi_params:fastcgi的引數檔案

​ fastcgi_params.default:fastcgi的引數備份檔案

​ scgi_params:scgi的引數檔案

​ scgi_params.default:scgi的引數備份檔案

​ uwsgi_params:uwsgi的引數檔案

​ uwsgi_params.default:uwsgi的引數備份檔案

​ mime.types:記錄的是HTTP協議中的Content-Type的值和檔案字尾名的對應關係

​ mime.types.default:mime.types的備份檔案

​ nginx.conf:這個是Nginx的核心配置檔案,這個檔案非常重要,也是我們即將要學習的重點

​ nginx.conf.default:nginx.conf的備份檔案

​ koi-utf、koi-win、win-utf這三個檔案都是與編碼轉換對映相關的配置檔案,用來將一種編碼轉換成另一種編碼

html:存放nginx自帶的兩個靜態的html頁面

​ 50x.html:訪問失敗後的失敗頁面

​ index.html:成功訪問的預設首頁

logs:記錄入門的檔案,當nginx伺服器啟動後,這裡面會有 access.log error.log 和nginx.pid三個檔案出現。

sbin:是存放執行程式檔案nginx

​ nginx是用來控制Nginx的啟動和停止等相關的命令。

Nginx伺服器啟停命令

Nginx安裝完成後,接下來我們要學習的是如何啟動、重啟和停止Nginx的服務。

對於Nginx的啟停在linux系統中也有很多種方式,我們本次課程介紹兩種方式:

  1. Nginx服務的訊號控制

  2. Nginx的命令列控制

方式一:Nginx服務的訊號控制

  1. Nginx中的masterworker程序?
  2. Nginx的工作方式?
  3. 如何獲取程序的PID?
  4. 訊號有哪些?
  5. 如何通過訊號控制Nginx的啟停等相關操作?

前面在提到Nginx的高效能,其實也和它的架構模式有關。Nginx預設採用的是多程序的方式來工作的,當將Nginx啟動後,我們通過ps -ef | grep nginx命令可以檢視到如下內容:

從上圖中可以看到,Nginx後臺程序中包含一個master程序和多個worker程序,master程序主要用來管理worker程序,包含接收外界的資訊,並將接收到的訊號傳送給各個worker程序,監控worker程序的狀態,當worker程序出現異常退出後,會自動重新啟動新的worker程序。而worker程序則是專門用來處理使用者請求的,各個worker程序之間是平等的並且相互獨立,處理請求的機會也是一樣的。nginx的程序模型,我們可以通過下圖來說明下:

我們現在作為管理員,只需要通過給master程序傳送訊號就可以來控制Nginx,這個時候我們需要有兩個前提條件,一個是要操作的master程序,一個是訊號。

(1)要想操作Nginx的master程序,就需要獲取到master程序的程序號ID。獲取方式簡單介紹兩個,

方式一:通過ps -ef | grep nginx

方式二:在講解nginx的./configure的配置引數的時候,有一個引數是--pid-path=PATH預設是/usr/local/nginx/logs/nginx.pid,所以可以通過檢視該檔案來獲取nginx的master程序ID.

(2)訊號

訊號 作用
TERM/INT 立即關閉整個服務
QUIT "優雅"地關閉整個服務
HUP 重讀配置檔案並使用服務對新配置項生效
USR1 重新開啟日誌檔案,可以用來進行日誌切割
USR2 平滑升級到最新版的nginx
WINCH 所有子程序不在接收處理新連線,相當於給work程序傳送QUIT指令

呼叫命令為kill -signal PID

signal:即為訊號;PID即為獲取到的master執行緒ID

  1. 傳送TERM/INT訊號給master程序,會將Nginx服務立即關閉。
  1. kill -TERM PID / kill -TERM `cat /usr/local/nginx/logs/nginx.pid`
  2. kill -INT PID / kill -INT `cat /usr/local/nginx/logs/nginx.pid`
  1. 傳送QUIT訊號給master程序,master程序會控制所有的work程序不再接收新的請求,等所有請求處理完後,在把程序都關閉掉。
  1. kill -QUIT PID / kill -TERM `cat /usr/local/nginx/logs/nginx.pid`
  1. 傳送HUP訊號給master程序,master程序會把控制舊的work程序不再接收新的請求,等處理完請求後將舊的work程序關閉掉,然後根據nginx的配置檔案重新啟動新的work程序
  1. kill -HUP PID / kill -TERM `cat /usr/local/nginx/logs/nginx.pid`
  1. 傳送USR1訊號給master程序,告訴Nginx重新開啟日誌檔案
  1. kill -USR1 PID / kill -TERM `cat /usr/local/nginx/logs/nginx.pid`
  1. 傳送USR2訊號給master程序,告訴master程序要平滑升級,這個時候,會重新開啟對應的master程序和work程序,整個系統中將會有兩個master程序,並且新的master程序的PID會被記錄在/usr/local/nginx/logs/nginx.pid而之前的舊的master程序PID會被記錄在/usr/local/nginx/logs/nginx.pid.oldbin檔案中,接著再次傳送QUIT訊號給舊的master程序,讓其處理完請求後再進行關閉
  1. kill -USR2 PID / kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
  1. kill -QUIT PID / kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`

  1. 傳送WINCH訊號給master程序,讓master程序控制不讓所有的work程序在接收新的請求了,請求處理完後關閉work程序。注意master程序不會被關閉掉
  1. kill -WINCH PID /kill -WINCH`cat /usr/local/nginx/logs/nginx.pid`

方式二:Nginx的命令列控制

此方式是通過Nginx安裝目錄下的sbin下的可執行檔案nginx來進行Nginx狀態的控制,我們可以通過nginx -h來檢視都有哪些引數可以用:

-?和-h:顯示幫助資訊

-v:列印版本號資訊並退出

-V:列印版本號資訊和配置資訊並退出

-t:測試nginx的配置檔案語法是否正確並退出

-T:測試nginx的配置檔案語法是否正確並列出用到的配置檔案資訊然後退出

-q:在配置測試期間禁止顯示非錯誤訊息

-s:signal訊號,後面可以跟 :

​ stop[快速關閉,類似於TERM/INT訊號的作用]

​ quit[優雅的關閉,類似於QUIT訊號的作用]

​ reopen[重新開啟日誌檔案類似於USR1訊號的作用]

​ reload[類似於HUP訊號的作用]

-p:prefix,指定Nginx的prefix路徑,(預設為: /usr/local/nginx/)

-c:filename,指定Nginx的配置檔案路徑,(預設為: conf/nginx.conf)

-g:用來補充Nginx配置檔案,向Nginx服務指定啟動時應用全域性的配置

Nginx伺服器版本升級和新增模組

如果想對Nginx的版本進行更新,或者要應用一些新的模組,最簡單的做法就是停止當前的Nginx服務,然後開啟新的Nginx服務。但是這樣會導致在一段時間內,使用者是無法訪問伺服器。為了解決這個問題,我們就需要用到Nginx伺服器提供的平滑升級功能。這個也是Nginx的一大特點,使用這種方式,就可以使Nginx在7*24小時不間斷的提供服務了。接下來我們分析下需求:

  1. 需求:Nginx的版本最開始使用的是Nginx-1.14.2,由於服務升級,需要將Nginx的版本升級到Nginx-1.16.1,要求Nginx不能中斷提供服務。

為了應對上述的需求,這裡我們給大家提供兩種解決方案:

方案一:使用Nginx服務訊號完成Nginx的升級

方案二:使用Nginx安裝目錄的make命令完成升級

環境準備

(1)先準備兩個版本的Nginx分別是 1.14.2和1.16.1

(2)使用Nginx原始碼安裝的方式將1.14.2版本安裝成功並正確訪問

  1. 進入安裝目錄
  2. ./configure
  3. make && make install

(3)將Nginx1.16.1進行引數配置和編譯,不需要進行安裝。

  1. 進入安裝目錄
  2. ./configure
  3. make

方案一:使用Nginx服務訊號進行升級

第一步:將1.14.2版本的sbin目錄下的nginx進行備份

  1. cd /usr/local/nginx/sbin
  2. mv nginx nginxold

第二步:將Nginx1.16.1安裝目錄編譯後的objs目錄下的nginx檔案,拷貝到原來/usr/local/nginx/sbin目錄下

  1. cd ~/nginx/core/nginx-1.16.1/objs
  2. cp nginx /usr/local/nginx/sbin

第三步:傳送訊號USR2給Nginx的1.14.2版本對應的master程序

第四步:傳送訊號QUIT給Nginx的1.14.2版本對應的master程序

  1. kill -QUIT `more /usr/local/logs/nginx.pid.oldbin`

方案二:使用Nginx安裝目錄的make命令完成升級

第一步:將1.14.2版本的sbin目錄下的nginx進行備份

  1. cd /usr/local/nginx/sbin
  2. mv nginx nginxold

第二步:將Nginx1.16.1安裝目錄編譯後的objs目錄下的nginx檔案,拷貝到原來/usr/local/nginx/sbin目錄下

  1. cd ~/nginx/core/nginx-1.16.1/objs
  2. cp nginx /usr/local/nginx/sbin

第三步:進入到安裝目錄,執行make upgrade

第四步:檢視是否更新成功

  1. ./nginx -v

在整個過程中,其實Nginx是一直對外提供服務的。並且當Nginx的伺服器啟動成功後,我們是可以通過瀏覽器進行直接訪問的,同時我們可以通過更改html目錄下的頁面來修改我們在頁面上所看到的內容,那麼問題來了,為什麼我們要修改html目錄下的檔案,能不能多新增一些頁面是Nginx的功能更加豐富,還有前面聊到Nginx的前端功能又是如何來實現的,這就需要我們對Nginx的核心配置檔案進行一個詳細的學習。

Nginx核心配置檔案結構

從前面的內容學習中,我們知道Nginx的核心配置檔案預設是放在/usr/local/nginx/conf/nginx.conf,這一節,我們就來學習下nginx.conf的內容和基本配置方法。

讀取Nginx自帶的Nginx配置檔案,我們將其中的註釋部分【學習一個技術點就是在Nginx的配置檔案中可以使用#來註釋】刪除掉後,就剩下下面內容:

  1. worker_processes 1;
  2. events {
  3. worker_connections 1024;
  4. }
  5. http {
  6. include mime.types;
  7. default_type application/octet-stream;
  8. sendfile on;
  9. keepalive_timeout 65;
  10. server {
  11. listen 80;
  12. server_name localhost;
  13. location / {
  14. root html;
  15. index index.html index.htm;
  16. }
  17. error_page 500 502 503 504 /50x.html;
  18. location = /50x.html {
  19. root html;
  20. }
  21. }
  22. }
  1. 指令名 指令值; #全域性塊,主要設定Nginx伺服器整體執行的配置指令
  2. #events塊,主要設定,Nginx伺服器與使用者的網路連線,這一部分對Nginx伺服器的效能影響較大
  3. events {
  4. 指令名 指令值;
  5. }
  6. #http塊,是Nginx伺服器配置中的重要部分,代理、快取、日誌記錄、第三方模組配置...
  7. http {
  8. 指令名 指令值;
  9. server { #server塊,是Nginx配置和虛擬主機相關的內容
  10. 指令名 指令值;
  11. location / {
  12. #location塊,基於Nginx伺服器接收請求字串與location後面的值進行匹配,對特定請求進行處理
  13. 指令名 指令值;
  14. }
  15. }
  16. ...
  17. }

簡單小結下:

nginx.conf配置檔案中預設有三大塊:全域性塊、events塊、http塊

http塊中可以配置多個server塊,每個server塊又可以配置多個location塊。

全域性塊

user指令

(1)user:用於配置執行Nginx伺服器的worker程序的使用者和使用者組。

語法 user user [group]
預設值 nobody
位置 全域性塊

該屬性也可以在編譯的時候指定,語法如下./configure --user=user --group=group,如果兩個地方都進行了設定,最終生效的是配置檔案中的配置。

該指令的使用步驟:

(1)設定一個使用者資訊"www"

  1. user www;

(2) 建立一個使用者

  1. useradd www

(3)修改user屬性

  1. user www

(4)建立/root/html/index.html頁面,新增如下內容


  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>Welcome to nginx!</title>
  5. <style>
  6. body {
  7. width: 35em;
  8. margin: 0 auto;
  9. font-family: Tahoma, Verdana, Arial, sans-serif;
  10. }
  11. </style>
  12. </head>
  13. <body>
  14. <h1>Welcome to nginx!</h1>
  15. <p>If you see this page, the nginx web server is successfully installed and
  16. working. Further configuration is required.</p>
  17. <p>For online documentation and support please refer to
  18. <a href="http://nginx.org/">nginx.org</a>.<br/>
  19. Commercial support is available at
  20. <a href="http://nginx.com/">nginx.com</a>.</p>
  21. <p><em>Thank you for using nginx.</em></p>
  22. <p><em>I am WWW</em></p>
  23. </body>
  24. </html>

(5)修改nginx.conf

  1. location / {
  2. root /root/html;
  3. index index.html index.htm;
  4. }

(5)測試啟動訪問

  1. 頁面會報403拒絕訪問的錯誤

(6)分析原因

  1. 因為當前使用者沒有訪問/root/html目錄的許可權

(7)將檔案建立到 /home/www/html/index.html,修改配置

  1. location / {
  2. root /home/www/html;
  3. index index.html index.htm;
  4. }

(8)再次測試啟動訪問

  1. 能正常訪問。

綜上所述,使用user指令可以指定啟動執行工作程序的使用者及使用者組,這樣對於系統的許可權訪問控制的更加精細,也更加安全。

work process指令

master_process:用來指定是否開啟工作程序。

語法 master_process on|off;
預設值 master_process on;
位置 全域性塊

worker_processes:用於配置Nginx生成工作程序的數量,這個是Nginx伺服器實現併發處理服務的關鍵所在。理論上來說workder process的值越大,可以支援的併發處理量也越多,但事實上這個值的設定是需要受到來自伺服器自身的限制,建議將該值和伺服器CPU的核心數儲存一致。

語法 worker_processes num/auto;
預設值 1
位置 全域性塊

如果將worker_processes設定成2,則會看到如下內容:

其他指令

daemon:設定Nginx是否以守護程序的方式啟動。

守護式程序是linux後臺執行的一種服務程序,特點是獨立於控制終端,不會隨著終端關閉而停止。

語法 daemon on|off;
預設值 daemon on;
位置 全域性塊

pid:用來配置Nginx當前master程序的程序號ID儲存的檔案路徑。

語法 pid file;
預設值 預設為:/usr/local/nginx/logs/nginx.pid
位置 全域性塊

該屬性可以通過./configure --pid-path=PATH來指定

error_log:用來配置Nginx的錯誤日誌存放路徑

語法 error_log file [日誌級別];
預設值 error_log logs/error.log error;
位置 全域性塊、http、server、location

該屬性可以通過./configure --error-log-path=PATH來指定

其中日誌級別的值有:debug|info|notice|warn|error|crit|alert|emerg,翻譯過來為試|資訊|通知|警告|錯誤|臨界|警報|緊急,這塊建議大家設定的時候不要設定成info以下的等級,因為會帶來大量的磁碟I/O消耗,影響Nginx的效能。

(5)include:用來引入其他配置檔案,使Nginx的配置更加靈活

語法 include file;
預設值
位置 any

events塊

(1)accept_mutex:用來設定Nginx網路連線序列化

語法 accept_mutex on|off;
預設值 accept_mutex on;
位置 events

這個配置主要可以用來解決常說的"驚群"問題。大致意思是在某一個時刻,客戶端發來一個請求連線,Nginx後臺是以多程序的工作模式,也就是說有多個worker程序會被同時喚醒,但是最終只會有一個程序可以獲取到連線,如果每次喚醒的程序數目太多,就會影響Nginx的整體效能。如果將上述值設定為on(開啟狀態),將會對多個Nginx程序接收連線進行序列號,一個個來喚醒接收,就防止了多個程序對連線的爭搶。

(2)multi_accept:用來設定是否允許同時接收多個網路連線

語法 multi_accept on|off;
預設值 multi_accept off;
位置 events

如果multi_accept被禁止了,nginx一個工作程序只能同時接受一個新的連線。否則,一個工作程序可以同時接受所有的新連線

(3)worker_connections:用來配置單個worker程序最大的連線數

語法 worker_connections number;
預設值 worker_commections 512;
位置 events

這裡的連線數不僅僅包括和前端使用者建立的連線數,而是包括所有可能的連線數。另外,number值不能大於作業系統支援開啟的最大檔案控制代碼數量。

(4)use:用來設定Nginx伺服器選擇哪種事件驅動來處理網路訊息。

語法 use method;
預設值 根據作業系統定
位置 events

注意:此處所選擇事件處理模型是Nginx優化部分的一個重要內容,method的可選值有select/poll/epoll/kqueue等,之前在準備centos環境的時候,我們強調過要使用linux核心在2.6以上,就是為了能使用epoll函式來優化Nginx。

另外這些值的選擇,我們也可以在編譯的時候使用

--with-select_module--without-select_module

--with-poll_module --without-poll_module來設定是否需要將對應的事件驅動模組編譯到Nginx的核心。

events指令配置例項

開啟Nginx的配置檔案 nginx.conf,新增如下配置

  1. events{
  2. accept_mutex on;
  3. multi_accept on;
  4. worker_commections 1024;
  5. use epoll;
  6. }

啟動測試

  1. ./nginx -t
  2. ./nginx -s reload

http塊

定義MIME-Type

我們都知道瀏覽器中可以顯示的內容有HTML、XML、GIF等種類繁多的檔案、媒體等資源,瀏覽器為了區分這些資源,就需要使用MIME Type。所以說MIME Type是網路資源的媒體型別。Nginx作為web伺服器,也需要能夠識別前端請求的資源型別。

在Nginx的配置檔案中,預設有兩行配置

  1. include mime.types;
  2. default_type application/octet-stream;

(1)default_type:用來配置Nginx響應前端請求預設的MIME型別。

語法 default_type mime-type;
預設值 default_type text/plain;
位置 http、server、location

在default_type之前還有一句include mime.types,include之前我們已經介紹過,相當於把mime.types檔案中MIMT型別與相關型別檔案的檔案字尾名的對應關係加入到當前的配置檔案中。

舉例來說明:

有些時候請求某些介面的時候需要返回指定的文字字串或者json字串,如果邏輯非常簡單或者乾脆是固定的字串,那麼可以使用nginx快速實現,這樣就不用編寫程式響應請求了,可以減少伺服器資源佔用並且響應效能非常快。

如何實現:

  1. location /get_text {
  2. #這裡也可以設定成text/plain
  3. default_type text/html;
  4. return 200 "This is nginx's text";
  5. }
  6. location /get_json{
  7. default_type application/json;
  8. return 200 '{"name":"TOM","age":18}';
  9. }

自定義服務日誌

Nginx中日誌的型別分access.log、error.log。

access.log:用來記錄使用者所有的訪問請求。

error.log:記錄nginx本身執行時的錯誤資訊,不會記錄使用者的訪問請求。

Nginx伺服器支援對服務日誌的格式、大小、輸出等進行設定,需要使用到兩個指令,分別是access_log和log_format指令。

(1)access_log:用來設定使用者訪問日誌的相關屬性。

語法 access_log path[format[buffer=size]]
預設值 access_log logs/access.log combined;
位置 http, server, location

(2)log_format:用來指定日誌的輸出格式。

語法 log_format name [escape=default|json|none] string....;
預設值 log_format combined "...";
位置 http

其他配置指令

(1)sendfile:用來設定Nginx伺服器是否使用sendfile()傳輸檔案,該屬性可以大大提高Nginx處理靜態資源的效能

語法 sendfile on|off;
預設值 sendfile off;
位置 http、server、location

(2)keepalive_timeout:用來設定長連線的超時時間。

》為什麼要使用keepalive?

  1. 我們都知道HTTP是一種無狀態協議,客戶端向服務端傳送一個TCP請求,服務端響應完畢後斷開連線。
  2. 如何客戶端向服務端傳送多個請求,每個請求都需要重新建立一次連線,效率相對來說比較多,使用keepalive模式,可以告訴伺服器端在處理完一個請求後保持這個TCP連線的開啟狀態,若接收到來自這個客戶端的其他請求,服務端就會利用這個未被關閉的連線,而不需要重新建立一個新連線,提升效率,但是這個連線也不能一直保持,這樣的話,連線如果過多,也會是服務端的效能下降,這個時候就需要我們進行設定其的超時時間。
語法 keepalive_timeout time;
預設值 keepalive_timeout 75s;
位置 http、server、location

(3)keepalive_requests:用來設定一個keep-alive連線使用的次數。

語法 keepalive_requests number;
預設值 keepalive_requests 100;
位置 http、server、location

server塊和location塊

server塊和location塊都是我們要重點講解和學習的內容,因為我們後面會對Nginx的功能進行詳細講解,所以這塊內容就放到靜態資源部署的地方給大家詳細說明。

本節我們主要來認識下Nginx預設給的nginx.conf中的相關內容,以及server塊與location塊在使用的時候需要注意的一些內容。

  1. server {
  2. listen 80;
  3. server_name localhost;
  4. location / {
  5. root html;
  6. index index.html index.htm;
  7. }
  8. error_page 500 502 503 504 404 /50x.html;
  9. location = /50x.html {
  10. root html;
  11. }
  12. }