1. 程式人生 > 其它 >意外發現,原來你不知道自己每天都在用門面模式

意外發現,原來你不知道自己每天都在用門面模式

Nginx官網:http://nginx.org

1.Nginx 基礎特性

特性:
模組化設計,較好的擴充套件性
高可靠性
支援熱部署:不停機更新配置檔案,升級版本,更換日誌檔案
低記憶體消耗:10000個keep-alive連線模式下的非活動連線,僅需2.5M記憶體
event-driven,aio,mmap,sendfile
基本功能:
靜態資源的web伺服器
http協議反向代理伺服器
pop3/imap4協議反向代理伺服器
FastCGI(LNMP),uWSGI(python)等協議
模組化(非DSO),如zip,SSL模組

2.web服務相關的功能

虛擬主機(server)
支援 keep-alive 和管道連線(利用一個連線做多次請求)
訪問日誌(支援基於日誌緩衝提高其效能)
url rewirte
路徑別名
基於IP及使用者的訪問控制
支援速率限制及併發數限制
重新配置和線上升級而無須中斷客戶的工作程序

3.Nginx組織結構

3.1.web請求處理機制:

3.1.1.多程序方式:

伺服器每接收到一個客戶端請求就有伺服器的主程序生成一個子程序響應客
戶端,直到使用者關閉連線,這樣的優勢是處理速度快,各子程序之間相互獨立,但是如果訪問過大會導致伺服器資
源耗盡而無法提供請求。

3.1.2.多執行緒方式:

與多程序方式類似,但是每收到一個客戶端請求會有服務程序派生出一

個執行緒來個客戶方進行互動,一個執行緒的開銷遠遠小於一個程序,因此多執行緒方式在很大程度減輕了web伺服器對
系統資源的要求,但是多執行緒也有自己的缺點,即當多個執行緒位於同一個程序內工作的時候,可以相互訪問同樣的
記憶體地址空間,所以他們相互影響,另外一旦主程序掛掉則所有子執行緒都不能工作了,IIS伺服器使用了多執行緒的方
式,需要間隔一段時間就重啟一次才能穩定。

4.組織模型

Nginx是多程序組織模型,而且是一個由Master主程序和Worker工作程序組成。

4.1.主程序(master process)的功能:

讀取Nginx 配置檔案並驗證其有效性和正確性
建立、繫結和關閉socket連線
按照配置生成、管理和結束工作程序
接受外界指令,比如重啟、升級及退出伺服器等指令
不中斷服務,實現平滑升級,重啟服務並應用新的配置
開啟日誌檔案,獲取檔案描述符
不中斷服務,實現平滑升級,升級失敗進行回滾處理
編譯和處理perl指令碼

4.2.工作程序(woker process)的功能:

接受處理客戶的請求
將請求以此送入各個功能模組進行處理
IO呼叫,獲取響應資料
與後端伺服器通訊,接收後端伺服器的處理結果
快取資料,訪問快取索引,查詢和呼叫快取資料
傳送請求結果,響應客戶的請求
接收主程式指令,比如重啟、升級和退出等

4.3.程序間通訊

工作程序是由主程序生成的,主程序使用fork()函式,在Nginx伺服器啟動過程中主程序根據配置檔案決定啟動工作
程序的數量,然後建立一張全域性的工作表用於存放當前未退出的所有的工作程序,主程序生成工作程序後會將新生
成的工作程序加入到工作程序表中,並建立一個單向的管道並將其傳遞給工作程序,該管道與普通的管道不同,它
是由主程序指向工作程序的單項通道,包含了主程序向工作程序發出的指令、工作程序ID、工作程序在工作程序表
中的索引和必要的檔案描述符等資訊。

主程序與外界通過訊號機制進行通訊,當接收到需要處理的訊號時,它通
過管道向相關的工作程序傳送正確的指令,每個工作程序都有能力捕獲管道中的可讀事件,當管道中有可讀事件的
時候,工作程序就會從管道中讀取並解析指令,然後採取相應的執行動作,這樣就完成了主程序與工作程序的交
互。

工作程序之間的通訊原理基本上和主程序與工作程序之間的通訊是一樣的,只要工作程序之間能夠取得彼此的信
息,建立管道即可通訊,但是由於工作程序之間是完全隔離的,因此一個程序想要直到另外一個程序的狀態資訊就只能
通過主程序來設定了。

為了實現工作程序之間的互動,主程序在生成工作程序只之後,在工作程序表中進行遍歷,將該新程序的ID以及針
對該程序建立的管道控制代碼傳遞給工作程序中的其他程序,為工作程序之間的通訊做準備,當工作程序1向工作程序2傳送
指令的時候,首先在主程序給它的其他工作程序工作資訊中找到2的程序ID,然後將正確的指令寫入指向程序2的管道,
工作程序2捕獲到管道中的事件後,解析指令並進行相關操作,這樣就完成了工作程序之間的通訊。

5.Nginx模組介紹

核心模組:是 Nginx 伺服器正常執行 必不可少 的模組,提供 錯誤日誌記錄 、 配置檔案解析 、 事件驅動機制 、
程序管理 等核心功能 標準HTTP模組:提供 HTTP 協議解析相關的功能,比如: 埠配置 、 網頁編碼設定 、
HTTP響應頭設定 等等 可選HTTP模組:主要用於擴充套件標準的 HTTP 功能,讓 Nginx 能處理一些特殊的服務,比
如: Flash 多媒體傳輸 、解析 GeoIP 請求、 網路傳輸壓縮 、 安全協議 SSL 支援等 郵件服務模組:主要用於支援
Nginx 的 郵件服務 ,包括對 POP3 協議、 IMAP 協議和 SMTP協議的支援 第三方模組:是為了擴充套件 Nginx 伺服器
應用,完成開發者自定義功能,比如: Json 支援、 Lua 支援等

nginx高度模組化,但其模組早期不支援DSO機制;1.9.11版本支援動態裝載和解除安裝 模組分類:

核心模組:core module
標準模組:
HTTP 模組: ngx_http_*
HTTP Core modules 預設功能
HTTP Optional modules 需編譯時指定
Mail 模組 ngx_mail_*
Stream 模組 ngx_stream_*
第三方模組

6.Nginx安裝

Nginx的安裝版本分為Mainline version(主要開發版本,其實就是還處於開發版)、Stable version(當前最新穩定版)
和Legacy versions(舊的穩定版), Nginx安裝可以使用yum或原始碼安裝,但是推薦使用原始碼,一是yum的版本比較
舊,二是編譯安裝可以更方便自定義相關路徑,三是使用原始碼編譯可以自定義相關功能,更方便業務的上的使用,
原始碼安裝需要提前準備標準的編譯器,GCC的全稱是(GNU Compiler collection),其有GNU開發,並以GPL即
LGPL許可,是自由的類UNIX即蘋果電腦Mac OS X作業系統的標準編譯器,因為GCC原本只能處理C語言,所以原
名為GNU C語言編譯器,後來得到快速發展,可以處理C++,Fortran,pascal,objective-C,java以及Ada等其他
語言,此外還需要Automake工具,以完成自動建立Makefile的工作,Nginx的一些模組需要依賴第三方庫,比如
pcre(支援rewrite),zlib(支援gzip模組)和openssl(支援ssl模組)等。

6.1.Nginx 編譯安裝

[root@s2 ~]# yum install -y vim lrzsz tree screen psmisc lsof tcpdump wget ntpdate
gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel net-
tools iotop bc zip unzip zlib-devel bash-completion nfs-utils automake libxml2
libxml2-devel libxslt libxslt-devel perl perl-ExtUtils-Embed

[root@s2 ~]# cd /usr/local/src/
[root@s2 src]# wget https://nginx.org/download/nginx-1.16.1.tar.gz
[root@s2 src]# tar xf nginx-1.16.1.tar.gz
[root@s2 src]# cd nginx-1.16.1/

編譯是為了檢查系統環境是否符合編譯安裝的要求,比如是否有gcc編譯工具,是否支援編譯引數當中的模組,並根據
開啟的引數等生成Makefile檔案為下一步做準備:
[root@s2 nginx-1.16.1]#./configure --prefix=/apps/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module

[root@s2 nginx-1.16.1]# make #編譯步驟,根據Makefile檔案生成相應的模組
[root@s2 nginx-1.16.1]# make install #建立目錄,並將生成的模組和檔案複製到相應的目錄:
[root@s2 nginx-1.16.1]# useradd nginx -s /sbin/nologin -u 2000 #以普通使用者啟動nginx
[root@s2 nginx-1.16.1]# chown nginx.nginx -R /apps/nginx/

備註:nginx完成安裝以後,有四個主要的目錄:

conf:該目錄中儲存了nginx所有的配置檔案,其中nginx.conf是nginx伺服器的最核心最主要的配置檔案,其他
的.conf則是用來配置nginx相關的功能的,例如fastcgi功能使用的是fastcgi.conf和fastcgi_params兩個文
件,配置檔案一般都有個樣板配置檔案,是檔名.default結尾,使用的使用將其複製為並將default去掉即可。

html:該目錄中儲存了nginx伺服器的web檔案,但是可以更改為其他目錄儲存web檔案,另外還有一個50x的web檔案是
預設的錯誤頁面提示頁面。

logs:該目錄用來儲存nginx伺服器的訪問日誌錯誤日誌等日誌,logs目錄可以放在其他路徑,比
如/var/logs/nginx裡面。

sbin:該目錄用來儲存nginx二進位制啟動指令碼,可以接受不同的引數以實現不同的功能。

6.2.驗證版本及編譯引數

[root@s2 nginx-1.16.1]# /apps/nginx/sbin/nginx -V
nginx version: nginx/1.16.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module

6.3.建立Nginx自啟動指令碼

[root@s1 ~]# cat /usr/lib/systemd/system/nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service] Type
=forking PIDFile=/run/nginx.pid # Nginx will fail to start if /run/nginx.pid already exists but has the wrong # SELinux context. This might happen when running `nginx -t` from the cmdline. # https://bugzilla.redhat.com/show_bug.cgi?id=1268621 ExecStartPre=/usr/bin/rm -f /run/nginx.pid ExecStartPre=/apps/nginx/sbin/nginx -t ExecStart=/apps/nginx/sbin/nginx ExecReload=/bin/kill -s HUP $MAINPID KillSignal=SIGQUIT TimeoutStopSec=5 KillMode=process PrivateTmp=true
[Install] WantedBy=multi-user.target