1.7-1.9 Nginx架構分析html
Nginx涉及到的模塊分爲核心模塊、標準HTTP模塊、可選HTTP模塊、郵件服務模塊以及第三方模塊等五大類。linux
核心模塊是指Nginx服務器正常運行時必不可少的模塊,它們提供了Nginx最基本最核心的服務,如進程管理、權限控制、錯誤日誌記錄等。nginx
主要包含對兩類功能的支持,一類是主體功能,包括進程管理、權限控制、錯誤日誌記錄、配置解析等,git
另外一類是用於響應請求事件必需的功能,包括事件驅動機制、正則表達式解析等。web
ngx_core_module ngx_errlog_module ngx_conf_module ngx_regex_module ngx_events_module ngx_event_core_module ngx_epoll_module
標準HTTP模塊正則表達式
標準HTTP模塊是編譯Nginx後包含的模塊,其支持Nginx服務器的標準HTTP功能。shell
模塊 | 功能 |
---|---|
ngx_http_core | 配置端口,URI分析,服務器響應錯誤處理,別名控制以及其餘HTTP核心事務 |
ngx_http_access_module | 基於IP地址的訪問控制(容許/拒絕) |
ngx_http_auth_basic_module | 基於HTTP的身份認證 |
ngx_http_autoindex_module | 處理以「/」結尾的請求並自動生成目錄列表 |
ngx_http_browser_module | 解析HTTP請求頭中的「User-Agent」域的值 |
ngx_http_charset_module | 指定網頁編碼 |
ngx_http_empty_gif_module | 從內存建立一個1 x 1的透明gif圖片,能夠快速調用 |
ngx_http_fastcgi_module | 對FastCGI的支持 |
ngx_http_geo_module | 將客戶端的IP轉化爲鍵值對變量,該模塊主要用來針對客戶的的IP來定義變量 |
ngx_http_gzip_module | 壓縮請求響應,能夠減小數據傳輸 |
ngx_http_headers_filter_module | 設置HTTP響應頭 |
ngx_http_index_module | 處理以「/」結尾的請求,若是沒有找到該目錄下的index頁,就將請求轉給ngx_http_autoindex_module模塊處理 |
ngx_http_limit_req_module | 限制來自客戶端的請求的響應和處理速率 |
ngx_http_limit_conn_module | 限制來自客戶端的鏈接的響應和處理速率 |
ngx_http_log_module | 自定義access日誌 |
ngx_http_map_module | 建立任意鍵值對變量 |
ngx_http_memcached_module | 對Memcached的支持 |
ngx_http_proxy_module | 支持代理事務 |
ngx_http_referer_module | 對HTTP頭中的」referer」進行過濾處理,好比,實現防盜鏈功能 |
ngx_http_rewrite_module | 實現nginx的rewrite功能 |
ngx_http_scgi_module | 對SCGI的支持 |
ngx_http_upstream_module | 定義一組服務器,能夠接收來自代理、Fastcgi、Memcached的中重定向,主要用於負載均衡 |
可選HTTP模塊主要用於擴展標準的HTTP功能,使其可以處理一些特殊的HTTP請求。在編譯Nginx時,若是不指定這些模塊,默認是不會安裝的。數據庫
模塊 | 功能 |
---|---|
ngx_http_addition_module | 在響應請求的頁面開始或者結尾添加文本信息 |
ngx_http_degradation_module | 在低內存的情形下容許Nginx服務器返回444錯誤或204錯誤 |
ngx_http_perl_module | 在Nginx的配置文件中可使用Perl腳本 |
ngx_http_flv_module | 支持將Flash多媒體信息按照流文件傳輸,能夠根據客戶端指定的開始位置返回Flash |
ngx_http_geoip_module | 支持解析基於GeoIP數據庫的客戶端請求 |
ngx_google_perflools_module | 支持Google Performance Tools的一套用於C++Profile的工具集 |
ngx_http_image_filter_module | 支持將H.264/AAC編碼的多媒體信息(後綴名一般爲mp四、m4v或m4a)按照流文件傳輸,常與ngx_http_flv_module模塊一塊兒使用 |
ngx_http_random_index_module | Nginx接收到以「/」結尾的請求時,在對應的目錄下隨機選擇一個文件做爲index文件 |
ngx_http_secure_link_module | 支持對請求連接的有效性檢查 |
ngx_http_ssl_module | 對HTTPS/SSL支持 |
ngx_http_stub_status_module | 支持返回Nginx服務器的統計信息,通常包括處理鏈接的數量、鏈接成功的數量、處理的請求數、讀取和返回的Header信息數等信息 |
ngx_http_sub_module | 使用指定的字符串替換響應信息中的信息 |
ngx_http_dav_module | 支持HTTP協議和WebDAV協議中PUT、DELETE、MKCOL、COPY和MOVE方法 |
ngx_http_xslt_module | 將XML響應信息使用XSLT(拓展樣式錶轉換語言)進行轉換 |
主要用於支持Ningx的郵件服務。
並不是有Nginx官方提供,而是由第三方機構或者我的開發的模塊,用於實現某種特殊功能。vim
echo-nginx-module 支持在Nginx配置文件中使用echo、sleep、time以及exec等類shell命令後端
lua-nginx-module 使Nginx支持lua腳本語言
Nginx的web請求機制
並行處理:多進程、多線程、異步
支持高併發方案:
開多個進程,每一個進程處理相應的信息
開多個線程,線程是進程的一個子單元,線程比進程能節省更多的資源。
https://coding.net/u/aminglinux/p/nginx/git/blob/master/4z/IO.md
同步機制
同步、異步發生在當客戶端發起請求後,服務端處理客戶端的請求時。
同步機制,是指客戶端發送請求後,須要等待服務端(內核)返回信息後,再繼續發送下一個請求。
在同步機制中,全部的請求在服務器端獲得同步,即發送方和接收方對請求的處理步調是一致的。
異步機制
異步機制,是指客戶端發出一個請求後,不等待服務端(內核)返回信息,就繼續發送下一個請求。
在異步機制中,全部來自發送方的請求造成一個隊列,接收方處理完後再通知發送方。
舉例:一家酒店前臺,在旺季的高峯時間段會接不少預約酒席的電話。
若是是同步機制狀況下,前臺每接一個電話後先不掛掉電話,而是去查詢有無剩餘酒席,查到結果後,告訴客戶。
若是是異步機制狀況下,前臺每接一個預約電話直接回復客戶,一會回覆,此時前臺把查詢這件事情交給了另外的同事,
該前臺掛掉電話後,繼續處理其餘客戶的事情,當另外的同事查詢到結果後再通知給前臺,前臺再通知客戶。
阻塞
阻塞與非阻塞發生在IO調度中,好比內核到磁盤IO。
阻塞方式下,進程/線程在獲取最終結果以前,被系統掛起了,也就是所謂的阻塞了,在阻塞過程當中該進程什麼都幹不了,
直到最終結果反饋給它時,它才恢復運行狀態。
非阻塞
非阻塞方式和阻塞相反,進程/線程在獲取最終結果以前,並無進入被掛起的狀態,而是該進程能夠繼續執行新的任務。
當有最終結果反饋給該進程時,它再把結果交給客戶端。
舉例:依然是酒店前臺接待預約酒席電話的案例。
此時角色再也不是前臺,而是她的查詢有無剩餘酒席的同事。若是是阻塞方式,該同事在查詢有無剩餘酒席的過程當中,須要傻傻地
等待酒店管理系統給他返回結果,在此期間不能作其餘事情。
若是是非阻塞,該同事在等待酒店管理系統給他返回結果這段時間,能夠作其餘事情,好比能夠通知前臺剩餘酒席的狀況。
1.8 Nginx架構分析2
事件驅動模型是實現異步非阻塞的一個手段。事件驅動模型中,一個進程(線程)就能夠了。 對於web服務器來講,客戶端A的請求鏈接到服務端時,服務端的某個進程(Nginx worker process)會處理該請求, 此進程在沒有返回給客戶端A結果時,它又去處理了客戶端B的請求。 服務端把客戶端A以及客戶端B發來的請求做爲事件交給了「事件收集器」, 而「事件收集器」再把收集到的事件交由「事件發送器」發送給「事件處理器」進行處理。 最後「事件處理器」處理完該事件後,通知服務端進程,服務端進程再把結果返回給客戶端A、客戶端B。 在這個過程當中,服務端進程作的事情屬於用戶級別的,而事件處理這部分工做屬於內核級別的。 也就是說這個事件驅動模型是須要操做系統內核來做爲支撐的。
Nginx的事件驅動模型,支持select、poll、epoll、rtsig、kqueue、/dev/poll、eventport等。 最經常使用的是前三種,其中kqueue模型用於支持BSD系列平臺的事件驅動模型。kqueue是poll模型的一個變種,本質上和epoll同樣。 /dev/poll是Unix平臺的事件驅動模型,其主要在Solaris7及以上版本、HP/UX11.22及以上版本、IRIX6.5.15及以上版本、 Tru64 Unix 5.1A及以上版本的平臺使用。 eventport是用於支持Solaris10及以上版本的事件驅動模型。
Linux和Windows都支持,使用select模型的步驟是:1. 建立所關注事件的描述符集合,對於一個描述符,能夠關注其上面的讀(Read)事件、寫(Write)事件以及異常發生(Exception)事件。 在select模型中,要建立這3類事件描述符集合。2. 調用底層提供的select()函數,等待事件發生。3. 輪詢全部事件描述符集合中的每個事件描述符,檢查是否有相應的事件發生,若是有就進行處理。
poll模型是Linux平臺上的事件驅動模型,在Linux2.1.23中引入的,Windows平臺不支持該模型。 poll模型和select模型工做方式基本相同,區別在於,select模型建立了3個描述符集合,而poll模型只建立一個描述符集合。
epoll模型屬於poll模型的變種,在Linux2.5.44中引入。epoll比poll更加高效,緣由在於它不須要輪詢整個描述符集合, 而是Linux內核會關注事件集合,當有變更時,內核會發來通知。
1.9 Nginx架構分析3
Nginx服務器使用 master/worker 多進程模式。 主進程(Master process)啓動後,會接收和處理外部信號; 主進程啓動後經過fork() 函數產生一個或多個子進程(work process),每一個子進程會進行進程初始化、 模塊調用以及對事件的接收和處理等工做。
主要功能是和外界通訊和對內部其餘進程進行管理,具體來講有如下幾點:* 讀取Nginx配置文件並驗證其有效性和正確性* 創建、綁定和關閉socket* 按照配置生成、管理工做進程* 接收外界指令,好比重啓、關閉、重載服務等指令* 日誌文件管理
是由主進程生成,生成數量能夠在配置文件中定義。該進程主要工做有:* 接收客戶端請求* 將請求依次送入各個功能模塊進行過濾處理* IO調用,獲取響應數據* 與後端服務器通訊,接收後端服務器處理結果* 數據緩存,訪問緩存索引,查詢和調用緩存數據* 發送請求結果,響應客戶端請求* 接收主進程指令,如重啓、重載、退出等
1.10-1.11 Nginx虛擬主機配置
一臺機器上跑多個站點,即多個域名
Nginx默認虛擬主機
無論什麼域名解析到該服務器,首先都會訪問到默認虛擬主機
nginx.conf中第一個server { } 或 listen 80 default_server; 泛解析 *.aming.com 格式: server { listen 80; server_name www.1.com; root /data/wwwroot/www.1.com; }
解釋:
server { #每個server表示一個虛擬主機{開始,}結束。default_server;表示默認虛擬主機,不加此選項會以第一個爲默認虛擬主機。 listen 80; #監聽端口 server_name www.1.com; #虛擬主機域名 index index.html 1.html; #索引頁 root /data/wwwroot/www.1.com; #虛擬主機站點路徑 }
操做介紹:
檢查語法 /usr/local/nginx/sbin/nginx -t
從新加載 /usr/local/nginx/sbin/nginx -s reload
訪問測試:
格式:curl -xip:port 域名/webpage
例如:curl -x127.0.0.1:80 www.1.com/index.html
泛解析 *.aming.com案例:
server{ listen 80; server_name *.aminglinux.com; root /data/wwwroot/aminglinux.com; index index.html; } curl -x127.0.0.1:80 *.aminglinux.com/index.html //*.表示泛解釋,不管*是什麼內容 也會解釋到aminglinux.com的站點目錄 curl -x127.0.0.1:80 www.aminglinux.com/index.html curl -x127.0.0.1:80 ???.aminglinux.com/index.html
總結:
1 手動定義默認虛擬主機,須要在listen段添加default_server;參數
2 沒定義default_server會以第一個server設爲默認虛擬主機。
Nginx虛擬主機配置規範
http加入include參數能夠自動匹配.conf的虛擬主機配置文件,命令是:
include vhost/*.conf;
主配置文件include虛擬主機配置文件
在conf目錄下建立vhost目錄,在vhosts目錄下面定義虛擬主機配置
Nginx基於端口的虛擬主機
listen端口不一樣,server_name能夠相同
案例:
場景:同一個server_name,不一樣端口(80與81)
效果需求:以1.com爲案例,訪問80的時候,顯示80,訪問81的時候,屏幕顯示81
操做:
80的操做:
vim /usr/local/nginx/conf/vhost/1.com_80.conf server{ listen 80; server_name 1.com; index index.html 80.html; root /data/t-nginx/1.com; } mkdir -p /data/t-nginx/1.com echo "80" > /data/t-nginx/1.com/80.html curl -x127.0.0.1:80 1.com 80
81端口的操做:
vim /usr/local/nginx/conf/vhost/1.com_81.conf server{ listen 81; server_name 1.com; index index.html 81.html; root /data/t-nginx/1.com; } echo "81" > /data/t-nginx/1.com/81.html curl -x127.0.0.1:81 1.com 81