Nginx的介紹

Nginx的介紹

製做人:全心全意javascript

I/O模型介紹

Select:Linux實現對應,I/O複用模型,BSD4.2最先實現css

Poll:Linux實現,對應I/O複用模型,System V unix最先實現html

Epoll:Linux實現,對應I/O複用模型,具備信號驅動I/O模型的某些特性java

實現機制

  select poll epoll
操做方式 遍歷 遍歷 回調
底層實現 數組 鏈表 哈希表
IO效率 每次調用進行線性遍歷,時間複雜度O(n) 每次調用進行線性遍歷,時間複雜度O(n) 事件通知方式,每當fd就緒,系統註冊的回調函數就會被調用,時間複雜度O(1)
最大鏈接數 1024(x86)或2048(x64) 無上限 無上限
fd拷貝 每次調用select,都須要將fd集合從用戶態拷貝到內核 每次調用poll,都須要將fd集合從用戶態拷貝到內核 調用時拷貝進內核並保存,以後每次epoll_wait不拷貝

 

epoll的介紹

說明:node

在Linux2.6內核中提出的select和poll的加強版本nginx

支持水平觸發LT和邊緣觸發ET,最大的特色在於邊緣觸發,它只告訴進程哪些fd剛剛變爲就緒態,而且只會通知一次web

使用」事件「的就緒通知方式,經過epoll_ctl註冊fd,一旦該fd就緒,內核就會採用相似callback的回調機制來激活該fd,epoll_wait即可以收到通知正則表達式

優勢:算法

沒有最大併發鏈接的限制:能打開的FD的上限遠大於1024(1G的內存能監聽約10萬個端口)後端

效率提高:非輪詢方式,不會隨着FD數目的增長而效率下降;只有活躍可用的FD纔會調用callback函數,即epoll最大的優勢就在於它只管理」活躍「的鏈接,而跟鏈接總數無關

內存拷貝:利用mmap加速與內核空間的消息傳遞;即epoll使用mmap減小複製開銷

 

nginx的程序架構

master/worker結構

一個master進程:負責加載和分析配置文件、管理worker進程、平滑升級

一個或多個worker進程:處理並響應用戶請求

緩存相關的進程:

  cache loader:裝載緩存對象

  cache manager:管理緩存對象

 

nginx模塊

nginx高度模塊化,但其模塊早期不支持DSO機制;1.9.11版本支持動態裝載和卸載

模塊的分類:

  核心模塊:core module

  標準模塊:

    HTTP模塊:ngx_http_*

      HTTP Core modules 默認功能

      HTTP Optional modules 需編譯時指定

    Mail模塊:ngx_mail_*

    Stream模塊:ngx_stream_*

  第三方模塊

 

nginx命令選項

命令語法:
	nginx [-?hqTtVv] [-c file] [-g directives] [-p prefix] [-s signal]

選項:
	-?,-h				查看幫助
	-c file				指定配置文件(默認:/etc/nginx/nginx.conf)
	-v					顯示版本和編譯語法並退出
	-t					檢查配置文件語法
	-T					檢查配置文件語法並輸出配置文件
	-q					在檢查配置文件時,不顯示非錯誤信息
	-s signal			發送信號(stop中止、quit退出、reopen重啓、reload加載配置文件)
	-p prefix			指定工做目錄路徑(默認:/usr/share/nginx)
	-g directives		指定全局參數和附加配置文件

  

nginx配置文件介紹

主配置文件結構

main block:主配置段,即全局配置段,對http,mail都生效
	event{
		...
	}	事件驅動相關配置
http {
	...
}	http/https協議相關配置段
mail {
	...
}	mail協議相關配置段
stream {
	...
}	stream服務器相關配置段

http協議相關的配置結構

http {
	...
	各server的公共配置
	...
	server {  每一個server用於定義一個虛擬主機
		...
	}
	server {
		...
		server_name 虛擬主機名
		root 主目錄
		alias 路徑別名
		location [OPENATOR] URL {	指定URL的特性
			...
			if CONDITION {
			
			}
		}
	}
}

 

  • 主配置段

user:指定nginx(worker進程)的運行用戶,只能放在主配置段

pid:pid文件位置

include:指定包含進來的其餘配置文件路徑

load_module:加載模塊

性能相關

worker_processes:worker進程的數量;一般爲當前主機CPU的物理核心數,也可設置爲auto

worker_cpu_affinity:綁定一個worker進程一直在某一個cpu上運行(cpumask:0000000一、000000十、00000100,分別表明第零、1、二號CPU)

worker_priority:指定worker進程優先級,範圍是[-20,20],默認爲0

worker_rlimit_nofile:指定worker進程所可以打開的文件數量上限,如65535

調試和定位

daemon:是否以守護進程方式運行Nginx,默認是守護進程方式(後臺)on|off

master_process:是否以master/worker模型運行nginx;默認爲on,off將不啓動worker

error_log:指定錯誤日誌輸出位置

 

  • 事件驅動

worker_connections:每一個worker進程支持多少個併發鏈接

use:指定併發鏈接請求的處理方法,默認自動選擇最優方法(epoll)

accept_mutex:處理新的鏈接請求的方法,on表示由各個worker輪流處理新請求,off表示每一個新請求的到達都會通知全部的worker進程,但只有一個進程能夠得到鏈接,形成「驚羣」,影響性能,默認爲off。

 

  • http協議的相關配置

 

server(虛擬主機)中的配置

listen:指定監聽端口,可同時指定監聽主機名(IP/域名)

  default_server:設定爲默認虛擬主機

  ssl:限制僅可以經過ssl鏈接提供服務(https)

  backlog=number:設置超過併發鏈接後,新請求隊列的長度

  rcvbuf=size:設置接收緩衝區的大小

  sndbuf=size:設置發送緩衝區的大小

server_name:指定網站名稱(網站域名)

  支持通配字符*(如*.xinyi.com、www.xinyi.*)

  支持正則表達式

root:指定網站家目錄

tcp_nodelay:在keepalived模式下的鏈接是否啓動RCP_NODELAY選項(on:不延遲發送,收到一個請求當即迴應一個請求,默認選項。off:延遲發送,合併多個請求後發送)

sendfile:默認爲off。爲on時,從磁盤中將數據拷貝到內核中封裝報文直接發送,不需在從內存中轉

server_tokens:是否在響應報文的Server頭部顯示nginx版本,可在http和server中設置(on|off)商業版可支持字符串

 

location

在一個server中location配置段可存在多個,用於實現從uri到文件系統的路徑映射;nginx會根據用戶請求的URI來檢查定義的全部location,並找出一個最佳匹配,然後應用其配置。該段可放在server中,也可嵌套在location中。

  =:精確匹配

  ^~:對URI的最左邊部分作匹配檢查,不區分字符大小寫

  ~:對URI作正則表達式模式匹配,區分字符大小寫

  ~*:對URI作正則表達式模式匹配,不區分字符大小寫

  不帶符號:匹配起始於此uri的全部uri

  匹配優先級從高到低:=,^~,~/~*,不帶符號

server {
    root ...
    location ... {
        root ...
    }
}

  

alias:路徑別名,文檔映射的另外一種機制;僅能用於location上下文。(與root的不一樣,例「/web」中路徑「/www/html」,訪問/web,使用root匹配html/web下的文件,而alias訪問的是html下的文件)

index:指定默認網頁文件。

error_page:定義響應狀態碼所對應的響應錯誤頁(例:error_page 404 /404.html),還能夠設置以200狀態碼響應錯誤頁面,防止被瀏覽器劫持錯誤頁面(例:error_page 404  =200 /404.html)

try_files:按順序檢查文件是否存在,返回按順序找到的第一個文件或文件夾,若是全部的文件或文件夾都找不到,會進行一個內部重定向到最後一個參數,只有最後一個參數能夠引發一個內部重定向,以前的參數只設置內部URI的指向。最後一個參數是回退URI且必須存在,不然會出現內部500錯誤。

location /images/ {
    try_files $uri /images/defautl.gif;
}
location / {
    try_files $uri $uri/index.html $uri.html =404;
}

 

定義客戶端請求的相關配置

keepalive_timeout timeout [header_timeout]:設定保持鏈接超時時長,0表示禁止長鏈接,默認爲75S

keepalive_requests number:在一次長鏈接上容許請求資源的最大數量,默認爲100。

keepalive_disable none|browser...:對那種瀏覽器禁用長鏈接。

send_timeout time:向客戶端發送響應報文的超時時長,此外是指兩次寫操做之間的間隔時長,而非整個響應過程的傳輸時長。

 

client_body_buffer_size size:用於接收每一個客戶端請求報文的body部分的緩衝區大小,默認爲16k;超出此大小時,將其暫存到磁盤上,由client_body_temp_path指令所暫存的位置

client_body_temp_path path [level1 [level2 [level3]]]:設定存儲客戶端請求報文的body部分的臨時存儲路徑及子目錄結構和數量,目錄名爲16進制的數字。

client_body_temp_path /var/tmp/client_body 1 2 2
1   1級目錄佔1位16進制,即2^4=16個目錄0-f
2   2級目錄佔2位16進制,即2^8=256個目錄00-ff
2   3級目錄佔2位16進制,即2^8=256個目錄00-ff

 

對客戶端進行限制的相關配置

 limit_rate rate:限制響應給客戶端的傳輸速率,單位是bytes/second,默認值爲0,表示無限制。(1000000 = 1M)

limit_except method ... {...}:僅用於location,限制客戶端使用除了指定的請求方法以外的其它方法(GET、HEAD、POST、PUT、DELETE、MKCOL、COPY、MOVE、OPTIONS、PROPFIND、PROPPATCH、LOCK、UNLOCK、PATCH)

limit_except GET {
    allow 192.168.1.0/24;
    deny all;
}
#除了GET和HEAD以外其它方法僅容許192.168.1.0/24網段主機使用

 

文件操做的優化配置

aio on|off|threads[=pool]:是否啓動aio功能

directio size|off:當文件大於給定大小時,例如directio 4m,同步(直接)寫磁盤,而非寫緩存

open_file_cache:緩存的設置

open_file_cache off
#
open_file_cache max=N [inactive=time]
nginx能夠緩存如下三種信息:
    文件元數據(文件的描述符,大小和最近一次修改的時間)
    目錄結構
    沒有找到的或者沒有權限訪問的文件的相關信息
    max=N:可緩存的緩存項上線,達到上限後會使用LRU算法(最近,最少使用算法)實現管理
    inative=time:緩存項的非活動時長,在此處指定的時長內未被命中的或命中次數少於open_file_cache_min_uses指令所指定的次數的緩存項即爲非活動項,將被刪除

open_file_cache_errors on|off:是否緩存查找時發生的錯誤的文件的一類的信息,默認值爲off

open_file_cache_min_uses number:在open_file_cache指令的inactive參數指定的時長內,至少被命中此處指定的次數,方可被歸類爲活動項。

open_file_cache_valid time:緩存項有效性的檢查頻率,默認值爲60S

 

實現基於ip的訪問控制功能

location / {
    deny 192.168.1.1;
    allow 172.16.1.0/24;
    allow 2001:0db8::/32 #ipv6地址
    deny all;
}

自上而下檢查,一旦匹配,當即生效。

 

實現基於用戶的訪問控制,使用basic機制進行用戶認證

auth_basic string|off

auth_basic_user_file file

location /admin/ {
    auth_basic "Admin Area";
    auth_basic_user_file /etc/nginx/ngxpasswd;
}

用戶口令文件格式:

明文文本:name:password:comment

加密文本:由htpasswd命令實現,httpd-tools所提供

 

輸出nginx的基本狀態信息

ngx_http_stub_status_module模塊

輸出信息示例:

Active connections:291
server accepts handled requests
    123 123 123
Reading:6 Writing:179 Waiting:106

  三個數字分別對應accepts,handled,requests三個值

Active connections: 當前狀態 ,活動狀態的鏈接數
accepts :統計總值 ,已經接受的客戶端請求的總數
handled :統計總值 ,已經處理完成的客戶端請求的總數
requests :統計總值 ,客戶端發來的總的請求數
Reading :當前狀態 ,正在讀取客戶端請求報文茵部的鏈接的鏈接數
Writing :當前狀態 ,正在向客戶端發送響應報文過程當中的鏈接數
Waiting :當前狀態 ,正在等待客戶端發出請求的空閒鏈接數

 

 示例:

location /status {
    stub_status;
    allow 172.16.1.0/24;
    deny all;
}

  

用gzip方法壓縮響應數據,節約寬帶

gzip on|off:啓用或禁用gzip壓縮

gzip_comp_level level:壓縮比由低到高1-9,默認爲1

gzip_min_length length:啓動壓縮功能的響應報文大小閾值,達到指定大小的進行壓縮。

gzip_http:version 1.0|1.1:設定壓縮協議,默認1.1

gzip_types:指明僅對哪些類型的資源執行壓縮操做,默認包含有「text/html」,不用指定,不然報錯。

gzip_vary on|off:若是啓用壓縮,是否在響應報文頭部插入「Vary:Accept-Encoding」

gzip_proxied:nginx爲代理服務器時,對於後端服務器的響應報文,在何種條件下啓用壓縮功能

示例:

gzip on;
gzip_comp_level 6;
gzip_min_length 64;
gzip_proxied any;
gzip_types text/xml text/css application/javascript;
相關文章
相關標籤/搜索