nginx

Nginx:

engine X

c10k


主要功能:

1.web服務器:http/https協議的應用;

2.反向代理服務器:

http reverse server

smtp/pop3/imap4 reverse server

3.負載均衡集羣


nginx -- apache -- php -- MariaDB


MIME:

major/minor:

text/html, p_w_picpath/jpeg ,..., application/apx


http事務:request <--> response


web resources

一個html文檔

一個圖片

一個MP3片段

一個視頻片段

一個樣式表

一個js腳本

一個動態資源

...


URI: 

URL:

scheme://host[:port]/path/to/resource


Method:

GET,HEAD

POST

PUT,DELETE(WebDAV)

OPTIONS

TRACE


resource cache


cookie, cookie2, session


request packet:

<method> <request-url> <http-version>

<HEADERS>


<body>


response packet:

<http-version> <status-code> <reason-phrase>

<HEADERS>


<body>


status code:

1xx

2xx:成功類響應狀態碼,200,OK

3xx:重定向類響應狀態碼,301,302,304

4xx:客戶端錯誤類響應狀態碼,403,404

5xx:服務器端錯誤類響應狀態碼,502,500


basic,digest認證


MPM:

prefork

worker

event


I/O模型:

阻塞/非阻塞:

關注資源調用者在等待結果返回之前所處的狀態;


阻塞:Blocking,調用結果返回之前,調用者會被掛起;閒等待;

非阻塞:Nonblocking,調用結果返回之前,調用者不會被掛起,可以繼續調用其他資源;忙等待;


同步/異步:

關注資源返回之後的消息通知的機制;


同步:synchronize,調用者一直等待調用結果;

異步:asynchronize,被調用者通過狀態描述,通知或回調等方式通知調用者此次調用結果;


I/O模型:阻塞型,非阻塞型,複用型,信號驅動型,異步;


一次IO請求,通常會分成兩個階段:

第一階段:數據從磁盤被加載到內核空間;

第二階段:數據從內核空間被複制到應用程序所在的用戶空間;


基於事件(信號)回調機制:

SELECT():1024;

POLL():


事件驅動模型的實現:

Linux:epoll,libevent程序包;

FreeBSD:kqueue

Solaris:/dev/poll


Nginx

http://nginx.org


基於nginx的二次開發:tengine,openresty


nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server, originally written by Igor Sysoev. For a long time, it has been running on many heavily loaded Russian sites including Yandex, Mail.Ru, VK, and Rambler. According to Netcraft, nginx served or proxied 29.38% busiest sites in September 2017. Here are some of the success stories: Dropbox, Netflix, Wordpress.com, FastMail.FM. 


基本http服務特性:

1.支持基於緩存的反向代理;負載均衡和故障倒換;

2.基於FastCGI, uwsgi, SCGI反代,可以將緩存存放於memcached servers;支持負載均衡和故障倒換;

3.模塊化結構和強大的過濾器機制;

4.SSL和TLS

5.http/2.0


其他的http服務特性:

1.支持虛擬主機(名稱,端口,IP地址(無實際作用));

2.支持長連接;

3.支持URL重寫;

4.支持流媒體

5.對客戶端響應限速;


詳情請見:http://nginx.org/en/


回顧:

IO模型:

阻塞型,非阻塞型,IO複用型,信號驅動型,異步型;


nginx特性:


Nginx(2)

Nginx的程序結構:

master/worker

一個master進程:負責加載配置文件,管理worker進程;

配置的平滑升級

一個或多個worker進程:

處理並響應客戶端請求;

cache:

cache loader

cache manager


nginx的功能:

1.靜態的web資源服務器;

2.結合FastCGI,uwsgi,SCGI等協議反代動態資源請求;(lnmp, lamt)

3.http/https協議的反向代理;

4.smtp/pop3/imap4協議的反向代理;

5.通用的tcp/udp反向代理;


注意:nginx所有的功能的實現都必須通過模塊進行;而nginx可以根據指令或這相關功能,自動加載模塊;


nginx的模塊類型:

核心模塊:core module

標準功能模塊:

Standard HTTP modiles

Optional HTTP modules

Mail modules

Stream mudules


third party modules


nginx的安裝和配置:

安裝:

rpm包:

官方的預製安裝包:http://nginx.org/packages/centos/

EPEL源的安裝包;


編譯:

1.注意需要安裝好編譯環境;

2.openssl-devel,pcre-devel,libenvent-devel,...

3.~]# ./configure --prefix=/usr/local/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/lock/subsys/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_dav_module --with-threads --with-file-aio --with-http_stub_status_module

4.make -j 4 && make install


注意:啓動服務需要事先創建nginx用戶和nginx組;


配置:

配置的組成部分:

主配置文件:/etc/nginx/nginx.conf

片段配置文件:/etc/nginx/conf/*.conf(編譯安裝的默認沒有,可以在主配置文件中指定)


模塊配置文件:

與fcgi,uwsgi,SCGI相關的配置文件


mime.types:所有的nginx支持的mime類型;


主配置文件的配置指令:

context:上下文,指令的容器或者是指令的生效範圍;

derective:指令,能夠發揮nginx功能或特性的配置信息;


注意:

1.所有的指令都必須以";"結尾;

2.所有的上下文都必須使用"{}"括選起來,而且不需要使用";"結尾;

3.在設置指令時可以使用配置變量;

由模塊包含並引入:內置變量

由用戶引入:自定義變量

定義變量:

set var_name value;

引用變量:

$var_name


獲得幫助,參考http://nginx.org/en/docs


主配置文件的結構:

全局配置段,主配置段:

main block


http相關配置

http{

context{ ... }

directive value;

...

}


mail相關配置

mail{

...

}


全局配置段的常用指令和上下文:

user  nginx;

worker_processes 3;

pid /var/run/nginx.pid;

events {

worker_connections 1024;

}


http相關配置的常用指令和上下文:

include /etc/nginx/conf/*.conf;

sendfile on;

keepalive_timeout  65;

keepalive_request 100;

server {

listen 80;

server_name www.qhdlink.com;

include /etc/nginx/conf/*.conf;

root /myweb/vhost1

location {

root html; //相對路徑是相對於nginx的安裝目錄而言的;

alias /bbs/ /forum/

}

}


server {

listen 8080:

server_name web.qhdlink.com;

root /myweb/vhost2;

}


全局配置段常用指令的詳解:

正常服務運行必備的配置指令;

1.user user [group];

Context: main


功能:用於指定運行worker子進程的用戶和組;


2.pid file;

Context: main


功能:用於指定存放nginx的master進程編號的文件的路徑;


3.worker_rlimit_nofile number;

Context:  main


功能:每個worker進程所能打開的文件數量的最大值;

也可以通過修改/etc/security/limits.conf完成此設置;


優化性能相關的配置指令;

4.worker_processes number | auto;

Context: main


功能:worker進程的啓動數量;通常不要設置的比cpu核心數多;


5.worker_cpu_affinity cpumask ...;

worker_cpu_affinity auto [cpumask];

Context:  main


功能:設置每個CPU核心和worker進程的親緣性;


cpumask:0001 0010 0100 1000;


6.worker_priority number;

Context: main


number:[-20,19]


功能:設置每個worker進程啓動時候的nice值;


用於調試和定位問題相關的配置指令;

7.daemon on | off;

Context:  main


是否以獨立守護進程的方式啓動nginx;通常是在開發時選擇使用;


8.master_process on | off;

Context:  main


是否以master/worker模型啓動nginx進程;


9.error_log file [level];

Context: main, http, mail, stream, server, location


功能:定義錯誤日誌文件的位置和記錄日誌的日誌級別;


10.thread_pool name threads=number [max_queue=number];

Context: main


功能:定義線程池的名稱,線程的數量以及每個線程的後援隊列長度;

默認有32個線程,隊列長度爲65536;


回顧:

IO模型:阻塞式,非阻塞式,IO複用,信號驅動式的IO,異步(AIO)


nginx:

master/worker

cache loader/cache manager


模塊化架構:

核心模塊

標準功能模塊

第三方模塊


配置文件:

主配置文件:/etc/nginx/nginx.conf

片段配置文件:include file;


主配置文件的結構:

全局配置段,主配置段(main)

events { 

... 

}


Context: main


在events上下文中可以使用的指令:

11.worker_connections number;


功能:每個worker進程所能夠打開的併發連接的最大連接數;默認是512;


當前系統中所能夠響應的最大併發連接數:

worker_connections * worker_processes


12.use method;

指明併發連接請求處理時使用的方法;epoll


use epoll;


注意:此指令不需要明確指定,因爲nginx會選擇最有效的方法;


13.accept_mutex on | off;

當此功能啓用時,表示可以讓多個worker進程依次輪流響應新請求,


http相關配置

http {

...

}


在http上下文中可以用到的指令:

1.定義虛擬主機及套接字相關功能指令:

server {

...

}


server上下文中專用的指令:

1) server_name name ...;


指定虛擬主機名稱;後面可以使用空白字符分隔多個主機名;

主機名可以支持使用"*"匹配任意長度的任意字符;

主機名還可以支持使用~起始的正則表達式模式字符串;


2) listen address[:port] [default_server] [ssl] [http2 | spdy]  [backlog=number] [rcvbuf=size] [sndbuf=size]

listen port [default_server] [ssl] [http2 | spdy]

listen unix:path [default_server] [ssl] [http2 | spdy]


default_server:默認虛擬主機的設定;

ssl:支持https;

http2:支持http/2.0;

spdy:支持Google的spdy功能;

backlog=number:設定後援隊列的長度;

rcvbuf=size:接收緩衝大小;

sndbuf=size:發送緩衝大小;


示例:

listen 127.0.0.1:8000;

listen 127.0.0.1;

listen 8000;

listen *:8000;

listen localhost:8000;


3) root path;

Context: http, server, location, if in location


功能:設置web資源的路徑映射;用於指定用戶請求的URL所對應的本地文件系統中的資源所在的目錄的路徑;


path:可以是絕對路徑;也可以是相對路徑;

相對路徑是相對nginx的安裝目錄而言的;


4) location [ = | ~ | ~* | ^~ ] uri { ... }

location @name { ... }

Context: server, location


功能:根據用戶請求的URI來匹配此處定義的location;當匹配到時,此請求將被響應的location上下文中的指令處理;


=:表示用戶請求的URI與此處location定義的URI必須精確匹配;

~:表示用戶請求的URI與此處location定義的URI通過指定的正則表達式進行匹配,字母大小寫敏感;

~*:表示用戶請求的URI與此處location定義的URI通過指定的正則表達式進行匹配,字母大小寫不敏感;

^~:對用戶請求的URI的左半部分做匹配檢查,字母大小寫不敏感;


URI:URL中除去主機名的部分:

URL:http://www.qhdlink.com/index.html

URI:/index.html


匹配優先級:= , ^~ , ~/~* , 不帶符號;


5) alias path;

Context:  location


功能:定義路徑映射的別名,文檔資源映射的機制;


root和alias的區別:

用戶請求的URL:http://172.16.72.2/p_w_picpaths/1.jpg


location /p_w_picpaths {

root /myweb;

}


被請求資源的服務器文件系統中的存放路徑:/myweb/p_w_picpaths/1.jpg;


location /p_w_picpaths {

alias /myweb;

}


被請求資源的服務器文件系統中的存放路徑:/myweb/1.jpg;


總結:

root指令:將用戶請求的URI追加至root指令所指定的路徑之後,作爲此次請求的資源所在的文件系統路徑;

alias指令:將用戶請求的URI用root指令所指定的路徑替換,作爲此次請求的資源所在的文件系統路徑;


注意:在nginx/1.12.1中,URI和root的參數都不能在最後加"/";


6) index file ...;

Context: http, server, location


功能:定義默認主頁的文件名;


file:是一個文件名或者由空白字符隔開的多個文件名;


2.error_page code ... [=[response]] uri;

Context: http, server, location, if in location


功能:根據用戶請求的資源的http協議的響應狀態碼實現錯誤頁面的重定向;


示例:

error_page 404 =200 /404.html;

        location = /404.html {

            root  /myweb/error-page;

        }


        3.與長連接相關的指令:

        keepalive_disable none | browser ...;

        Context: http, server, location


        功能:對於某些瀏覽器禁用長連接功能;


        keepalive_requests number;

        Context: http, server, location


        功能:通過設置最大請求數量的方式管理長連接;即,只要在長連接上接收到的用戶請求達到最大限制值,則關閉此長連接;


        keepalive_timeout timeout [header_timeout];

        Context: http, server, location


        功能:通過設置最大空閒時間的方式管理長連接;即,只要該長連接在指定時間內沒有收到任何請求,則關閉此長連接;


        4.send_timeout time;

        Context: http, server, location


        功能:向客戶端發送響應報文的超時時長;通常指兩次成功的寫操作之間的間隔時長;如果在此時間內,客戶端沒有收到響應報文,則關閉連接;


        5.client_body_buffer_size size;

        Context: http, server, location


        功能:用於設置客戶端請求報文中的body部分的緩衝區的大小;默認爲16K,如果要緩存的body超過了此限制,則會將其臨時保存於磁盤的文件中;


        client_body_temp_path path [level1 [level2 [level3]]];

        Context: http, server, location


        功能:用於設定存儲客戶端請求報文中的body部分的臨時存儲路徑,以及此臨時目錄中子目錄的結構;


        示例:client_body_temp_path /var/tmp/client_body 2 1 2

        按照示例的設置,可以在/var/tmp/client_body目錄創建以2位16進制數字命名的256個一級子目錄;在所有的256個一級子目錄中,還可以隨機創建出以一個十六進制數字命名的二級子目錄;在所有的二級子目錄中,還以隨機創建出以2位16進制數字命名的三級子目錄;每一個三級子目錄中都會存放一個用戶請求的body的內容;


        6.limit_rate rate;

        Context: http, server, location, if in location


        功能:限制響應給客戶端的傳輸速率,單位是Bytes/second,0表示無限制;


        location /download {

            root /;

            limit_rate 20480;

        }


        7.limit_except method ... { ... }

        Context: location


        功能:設置可以使用指定的請求方法之外的其他方法的客戶端;


        在此上下文中,需要使用allow及deny指令;


        8.allow address | CIDR | unix: | all;

        deny address | CIDR | unix: | all;

        Context: http, server, location, limit_except


        功能:對指定的客戶端進行訪問控制;


        注意:

        1) 只有放置與limit_except上下文中,才表示是否允許指定客戶端使用什麼樣的HTTP方法;

        2) 如果放置於其他的上下文中,則表示對該上下文所包含的web資源的訪問控制;

        3) 規則的匹配順序:按照書寫順序依次檢查,直到第一個匹配項;


        192.168.0.0/16

        172.16.0.0/12

        CIDR: Classless Inter-Domain Routing, 無類域間路由;超網


        9.AIO和DirectIO

        aio on | off | threads[=pool];

        Context: http, server, location


        功能:是否啓用aio功能;


        directio size | off;

        Context: http, server, location


        功能:是否啓用directio,如果啓用,使用多大的空間來定義directio;


        10.文件描述符緩存:

        open_file_cache off;

open_file_cache max=N [inactive=time];


在系統中打開的文件較多的時候,nginx可以緩存以下三種信息來提升系統的性能:

1) 文件描述符、文件大小和最近一次修改的時間;

2) 打開的目錄的結構;

3) 沒有找到的或者沒有權限訪問的文件相關信息;


max=N:可緩存的緩存項的數量的上限;當緩存的數量達到上限之後,通常會使用LRU(Least Recently Used)算法實現緩存清理;

inactive=time:緩存項的超時時長,在此處指定的時長內沒有被再次使用(命中)的緩存元素,即爲非活動項;


open_file_cache_errors on | off;


功能:在查找資源時出錯,此類錯誤信息是否緩存;


open_file_cache_min_uses number;


功能:在open_file_cache指令中的inactive參數所指定的時間範圍內,緩存的元素至少要被再次使用(命中)的次數;


open_file_cache_valid time;


功能:緩存有效性檢查的頻率;默認值是60s;


11.stub_status;

Context: server, location


功能:用於輸出nginx的基本狀態信息;


location /ngx-status {

            stub_status;

        }


        通過瀏覽器瀏覽http://host/ngx-status


        Active connections: 1 

server accepts handled requests

5191 5191 5045 

Reading: 0 Writing: 1 Waiting: 0 


Active connections: 處於活動狀態的客戶端連接數量,包括waiting狀態的連接;

accepts:當前服務器已經接受的客戶端請求的總量;

handled:當前服務器已經處理完成的客戶端請求的總量;

requests:客戶端發送到當前服務器的請求的總量;包括被服務期重定向的

Reading:處於正在被讀取報文首部的客戶端請求的總量;

Writing:處於正在向客戶端發送響應報文過程的連接的總量;

Waiting:處於等待客戶端發送請求的空閒連接數;


12.valid_referers none | blocked | server_names | string ...;

Context: server, location


功能:定義合法的Referer數據;


none:在請求報文的首部中沒有Referer字段;

blocked:在請求報文的首部中有Referer字段,但沒有值;

server_name:在請求報文的首部中的Referer字段的值是主機名;

arbitrary string:任意字符串(直接字符串),其中可以使用"*"做通配符;

regular expression:被指定的正則表達式模式匹配到的字符串,一般要是有"~"起始;


示例:

location / {

valid_referers none blocked server_name *.qhdlink.com ~\.qhlink\.


if ($invalid_referer) {

return 403;

}

}











Nginx(4)

13.ngx_http_ssl_module

1) ssl on | off;

Context: http, server


功能:是否啓用給定虛擬主機的https協議;

相當於:listen 443 ssl;


2) ssl_certificate file;

Context: http, server


功能:當前虛擬主機使用的PEM格式的證書文件的路徑;


3) ssl_certificate_key file;

Context: http, server


功能:當前虛擬主機上與其證書匹配的私鑰文件的路徑;


4) ssl_session_cache off | none | [builtin[:size]] [shared:name:size];

Context: http, server


功能:是否開啓ssl的會話緩存,如果開啓,選擇哪種類型及使用多少存儲空間;

爲了避免內存碎片,建議使用shared類型;


5) ssl_session_timeout time;

Context: http, server


功能:客戶端連接可以複用ssl會話緩存中緩存的ssl參數的有效時長;默認5分鐘;


6) ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2] [TLSv1.3];

Context: http, server


功能:nginx服務器能夠兼容的協議的版本;默認是[TLSv1] [TLSv1.1] [TLSv1.2];


14.ngx_http_log_module

The ngx_http_log_module module writes request logs in the specified format. 


1) access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];

  access_log off;

  Context: http, server, location, if in location, limit_except


  功能:是否記錄訪問日誌;如果記錄,以何種格式記錄;緩衝區大小的設定,是否壓縮存儲並指明壓縮等級;刷新日誌文件的時間;


2) log_format name [escape=default|json] string ...;

Context: http


功能:定義存儲訪問日誌的格式;


combined格式示例:

log_format combined '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"';


3) open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];

open_log_file_cache off;

Context: http, server, location


功能:是否啓用訪問日誌文件的文件描述符緩存機制;


max=N:緩存中緩存的文件描述符的最大數量;

inactive:非活動時長;默認10秒;

min_uses:在inactive的時間內,緩存中的緩存條目最少被命中的次數;默認值1;

valid:驗證緩存中的緩存條目是否有效的時間週期;默認60秒;


15.ngx_http_rewrite_module

The ngx_http_rewrite_module module is used to change request URI using PCRE regular expressions, return redirects, and conditionally select configurations. 


URL重新就是指:根據PCRE的正則表達式來修改請求的URI,返回重定向信息,並且根據指定的條件選擇配置內容;


www.qhdlink.com  -->  www.ql.com


1) rewrite regex replacement [flag];

Context: server, location, if


功能:將用戶請求的URI基於regex所描述的模式進行匹配檢測,匹配到時將其替換爲replacement指定的URI;


注意:

1.在同一上下文中存在多個rewrite規則時,會自上而下逐個檢測並匹配;對於客戶端發送的每個請求,都要做檢查匹配,其中隱藏了一個循環機制;可以利用flag來控制循環的方式;

2.如果replacement是以http://或者https://開頭的,替換的結果會直接以重定向的方式返回給客戶端;狀態碼爲301;否則,狀態碼爲302;


例子:

http://www.qdhlink.com --> http://www.ql.com


3xx:重定向類的狀態碼

301:永久重定向

302:臨時重定向


[flag]:

last:重寫完成後停止對當前的URI在當前的location中後續的其他重寫操作後啓動新一輪的匹配檢查;重啓循環;

break:重寫完成後,立刻停止對當前location中的rewrite規則的匹配檢查,轉而執行後續的其他配置;結束循環;

redirect:臨時重定向,重寫完成後以臨時重定向方式向客戶端返回重寫後的URI,由客戶端重新請求;不以http://或https:開頭的URI的重寫;

permanent:永久重定向,重寫完成後以永久重定向方式向客戶端返回重寫後的URI,由客戶端重新請求;以http://或https:開頭的URI的重寫;


示例:

location / {

          root   html;

          index  index.html index.htm;

          rewrite ^/epel http://172.16.72.101;

          rewrite ^/(.*\.(jpg|jpeg|gif|png))$ http://172.16.72.1/p_w_picpaths/$1;

          rewrite ^/(.*)\.htm$ /$1.html;

        }


        2) return code [text];

return code URL;

return URL;

Context: server, location, if


功能:停止處理所有的後續的請求,直接給客戶端返回一個指定的狀態碼或URL;


3) if (condition) { ... }

Context: server, location


功能:引入一個新的上下文並且在其中完成條件判斷;如果條件滿足,執行if上下文中的配置指令;


condition:

比較操作符:

==

!=

~:模式匹配,區分字符大小寫;

~*:模式匹配,不區分字符大小寫;

!~:

!~*


文件及目錄的存在性判斷:

-e, !-e:存在與否

-f, !-f:存在且是普通文件與否;

-d, !-d:

...

-x, !-x:



16.ngx_http_fastcgi_module


1) fastcgi_pass address;

nginx通過反代機制,將php請求反代至address標明的服務器上;


2) fastcgi_index name;

fastcgi默認反代的主頁資源;


3) fastcgi_param parameter value [if_not_empty];

向後端php服務器傳遞參數;


fastcgi的緩存相關內容:

1) fastcgi_cache_path path [levels=levels] keys_zone=name:size [inactive=time] [max_size=size]

Context:  http


level:緩存的目錄結構及文件數量,最多3級,每級最對2個16進制數字,用":"分隔

1:2:2

keys_zone:內存中緩存空間的名稱及大小;

max_size:磁盤上用於緩存數據的緩存空間大小;

inactive:緩存的最大時長;


2) fastcgi_cache zone | off;

調用指定的緩存空間緩存數據;


3) fastcgi_cache_key string;

定義用戶緩存項的key的字符串;


4) fastcgi_cache_min_uses number;

用戶請求的內容被請求多少次纔會加入緩存;


5) fastcgi_cache_valid [code ...] time;

對於不同的響應碼的響應數據設置緩存時間;


注意:

設置緩存的時候使用fastcgi_cache_path指令;

調用緩存時,至少應該使用下列幾個指令:

fastcgi_cache

fastcgi_cache_key

fastcgi_cache_valid

 

示例:

http上下文的配置:

fastcgi_cache_path /var/cache/nginx/fastcgi_cache levels=1:2:1 keys_zone=fcgicache:10m max_size=1g;


location上下文的配置:

       location ~ \.php$ {

           root           html;

           fastcgi_pass   127.0.0.1:9000;

           fastcgi_index  index.php;

           fastcgi_param  SCRIPT_FILENAME  /usr/local/nginx/html/$fastcgi_script_name;

           include        fastcgi_params;

           fastcgi_cache fcgicache;

           fastcgi_cache_key $request_uri;

           fastcgi_cache_valid 200 5m;

           fastcgi_cache_valid 301 302 1m;

           fastcgi_cache_valid 403 404 1m;

       }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章