1. 程式人生 > >nginx 個人詳解,基礎知識,要點總結

nginx 個人詳解,基礎知識,要點總結

觸發 進行 ssi lnmp read ane 運行 核心 libev

nginx

nginx(web server , web reverse proxy):

http協議:80/tcp, HyperText Iransfer Procotol

html:HypreText Mark Language(超文本標記語言)


文本:HTTP/1.0 MIME


MIME:Multipurpose Internet Mail Extension

major/minor

text/plain

image/jpeg

URL:scheme://server[:port]/path/to/source


http事務:request <--> response

request

<method><URL><version>

<HEADERS>


<body>


response

<version><status><reason phrase>

<HEADERS>


<body>


協議格式:文本、二進制


method

GET、HEAD、POST、PUT、DELETE、TRACE、OPTIONS


status

1xx:信息類

2xx:成功類

3xx:重定向類

4xx:客戶端錯誤類

5xx:服務器端錯誤


HEADER

通用首部

請求首部

響應首部

實體首部

擴展首部

web頁面:多個資源

入口:資源引用:


認證:

基於IP認證:

基於用戶訪問:

basic

digest


資源映射:

Alias

DocumentRoot


httpd:MPM(多路處理模塊)

prefork ,worker ,event(第一種是進程模型,後兩種是線程模型)

prefork:主進程,生成多個子進程,每個子進程處理一個進程

worker:主進程,生成多個子進程,每個子進程生成多個線程,每個線程響應一個請求

event:主進程,生成多個子進程,每個子進程響應多個請求


I/O類型

同步和異步:

關註的是消息通知機制


同步:調用發出之後不會立即返回,但一返回,則返回的即是最終結果

異步:調用發出之後,被調用方立即返回消息,但返回的並非最終結果:被調用者通過狀態,通知機制等來通知調用者,或通過回調函數來處理結果:


阻塞和非阻塞

關註的是調用者等待被調用者返回調用結果時的狀態


阻塞:調用結果返回之前,調用者會被掛起,調用者只有在得到返回結果之後才能繼續


非阻塞:調用者在結果返回之前,不會被掛起,即調用不會阻塞調用者


I/O模型:

blocking IO 阻塞式IO

nonblocking IO 非阻塞式IO

IO multiplexing 復用性IO

select():最多不能超1024個並發,poll():profork、worker

singnal driven IO 事件驅動型IO:event

增加了通知機制

水平觸發:多次通知

邊緣通知:只通知一次

asynchronous IO: 異步型IO

eopll


例如:一次read操作

(1)等待數據準備好,從磁盤到內核內存

(2)從內核內存復制到進程內存




nginx

Nginx:engine X

Tngine

Registry


libevent:高性能的網絡庫

epoll()


Nginx特性

模塊化設計,較好的擴展性

高可靠

master --> worker

低內存消耗

10000個keep-alive模式下的connection,僅需要2.5MB內存

支持熱部署

不停機而更新配置文件,日誌文件滾動,升級程序版本


支持事件驅動、AIO、mmap


基本功能

靜態資源的web服務器,能緩存打開的文件描述符

http、smtp、pop3 協議的反向代理服務器

支持緩存加速,負載均衡機制

支持FastCGI(fpm,LNMP),uWSGI(python)等

模塊化(非DSO機制)、過濾器zip,SSI及圖像的大小調整

支持SSL


擴展功能

基於名稱和IP的虛擬主機

支持keeplive

支持平滑升級

定制訪問日誌,支持使用日誌緩沖區提供日誌存儲性能

支持url rewrite

支持路徑別名

支持基於IP和用戶的訪問控制

支持速率限制,支持並發數限制


Nginx的基本架構

一個master進程,生成一個或多個worker進程

事件驅動,epoll(邊緣觸發),kqueue:BSD系統,/dev/poll

復用器:select,poll,rt signal

支持sendfile,sendfile64

支持AIO

支持mmap


nginx的工作模式:非阻塞,時間驅動,有一個master進程生成多個worker線程,每個worker響應N個請求

worker * n


模塊類型

核心模塊

Standard HTTP modules

Optional HTTP modules

Mail modules

3rd party modules


安裝方法:

源碼:編譯安裝


編譯安裝: ./configure --help(查看幫助)


配置文件:

main配置段:全局配置段

event:定義event模型工作特性

http{}:定義http協議的相關配置


配置指令:要以分號結尾,語法格式:

directive value1[value2 ...]


支持使用變量

內置變量

模塊會提供幾建變量定義

自定義變量

set var_name value


主配置段指令

用於調試、定位問題

正常運行必備的配置

優化性能的配置

事件相關的配置


nginx:非阻塞、事件驅動、異步



主配置段的指令

正常運行的必備配置


1、user USERNAME[GROUPNAME]

指定運行worker進程的用戶和組

2、pid /path/to/pid_file

指定nginx守護進程的pid文件

3、worker_rlimit_nofile # ;

指定所有worker進程所能夠打開的最大文件句柄數


性能優化的相關配置

1、worker_processes #

所能打開的worker進程的個數:通常應該略少於cpu物理核心數

2、worker_cpu_affinity cpumask...


優點:提升緩存的命中率


context switch (進程切換):會產生cpu的不必要的消耗


cpumask:

0000 0000

0000 0001

0000 0010

0000 0100

0000 1000


worker_cpu_affinity 00000001 00000010 00000100 (綁定前三顆cpu)

3、time_resolution

計時器解析度:降低此值,可減少gettimeofday()系統調用的次數


4、work_priority number;

指明worker進程的nice值,nice值越小,優先值越高

-20 19

100 139


事件相關的配置

1、accept_mutex {off|on};

master調度用戶請求至各worker進程時使用的負載均衡鎖:on表示能讓多個worker輪流的,序列化的去響應新請求;


2、lock_file file:

accept_mutex用到的鎖文件路徑


3、use [epoll|rtsig|select|poll]

指明使用的事件模型:建議讓nginx自行選擇


4、worker_connection #;

設定單個worker進程所能夠處理的最大並發連接數


worker_connection (51200)* worker_processes



用於調試,定位問題,(解碼時,要加上這個包 --with-debug)

1、daemon {on|off}

是否已守護進程方式,來運行nginx:調試時應設置為off

2、master_process {on|off}

是否以master/worker模型來運行nginx;調試時可以調試為off

3、error_log 位置 級別;

若要使用debug級別,需要在編譯nginx時使用了 --with-debug選項


nginx作為web服務器時使用的配置:

http{}:由ngx_http_core_module模塊所引入:


配置框架:

http{

upstream{

..

}

server{

location URL{

...

}#類似於httpd中的<location>,用於定義URL與本地文件系統的映射關系:

location URL {

if...{


}

}

...

}#每個server類似於httpd中的一個<VirtualHost>

}



註意:與http相關的指令僅能夠放置於http、server、location、upstream、if上下文,但有些指令僅用於這五種上下文中的某些中:


配置指令;

1、server{}

定義一個虛擬主機的


2、listen

指定監聽的端口和地址

3、server_name NAME [...]

後可跟多個主機;名稱還可以使用正則表達式(~)或通配符;

(1)先做精確匹配檢查;

(2)左側通配符匹配檢查

(3)右側通配符匹配檢查

(4)正則表達式匹配檢查

(5)default_server

4、root path:

設置資源路徑映射;用於指明請求的URL所對應的資源所在的文件系統上的起始路徑

5、location

功能:允許根據請求的URL來匹配定義的各location。匹配到時,此請求將被相應的location配置塊中的配置所處理,例如做訪問控制等功能


= :精確匹配檢查

~:正則表達式模式匹配檢查,區分字符大小寫

~*:正則表達式模塊匹配檢查,不區分字符大小寫

^~: URL的前半部分匹配,不支持正則表達式


匹配優先級:= > ^~ > ~ > ~* > 不帶任何符號的


6、alias path;

用於location配置段,定義路徑別名


註意:root表示指明路徑為對應的location"/"URL; alias 表示路徑映射,即location指令後定義的URL是相對於alias所知名的路徑而言


7、 index file;

默認主頁面:

index index.php index.html;


8、error_page code [...] [=code] URL | @name

根據http響應狀態碼來指明待用的錯誤頁面:


error_page 404 [= 200]/404_customed.html


[=code]: 以指定的響應碼進行響應,而不是默認的原來的響應碼:默認表示以新資源的響應碼為其響應碼:


9、基於IP的訪問控制機制

allow IP/network

deny IP/network


10、基於用戶的訪問控制

basic,digest


auth_basic "" ;

auth_basic_user_file "/PATH/TO/PASSWORD_FILE

賬號密碼文件建議使用htpasswd來創建

11、https服務


生成私鑰,生成證書簽署請求,並獲得證書


server {

listen 443 ssl;

server_name www.baidu.com


ssl_certificate /etc/nginx/ssl/nginx.crt

ssl_cretificate_key /etc/nginx/ssl/nginx.crt


ssl_session_cache shsred:SSL:1m;

ssl_session_timeout 5m;


ssl_ciphers HIGH:!aNULL:!MDS

ssl_prefer_server_ciphers on;


location / {

root /data/web

index index.html index.htm

}

}


12、stub_ststus {on|off}

僅能用於location上下文

location /ststus {

stub_status on;

}


13、rewrite regex replacement flag;

例如:

rewrite ^/images/(.*\.jpg)$ /imgs/$ break;


flag:

last:一旦此rewrite規則重寫完成後,就不再被後面其他的rewrite規則進行處理,而是由User Agent重新對重寫後的URL再一次發起請求,並從頭開始執行類似的過程

break;一旦此rewrite規則重寫完成後,由User Agent對新的URL重寫發起請求,且不再會被當前location內的任何rewrite規則所檢查

redirect:以302響應碼(臨時重定向)返回新的URL

permanent:以301響應碼(永久重定向)返回新的URL


14、if

語法:if(condition){...}

應用語法: server , location


condtion:

(1)變量名:

變量值為空串,或者以“0”開始,則為false,其他均為true

(2)以變量為操作數構成的比較表達式

可使用=,!= 類似的比較操作符進行測試

(3)正則表達式的模式匹配操作

~:區分大小寫

~*:不區分大小寫

!~和!~*:對上面兩種測試取反

(4)測試文件存在性:-f,!-f

(5)測試指定路徑為目錄的可能性:-d ,!-d

(6)測試文件存在性:-e,!-e

(7)檢查文件是否有執行權限:-x,!-x

15、防盜鏈

location ~*\.(jpg|gif|jpeg|png)$ {

valid_referer none blocked www.baidu.com;

if ($invialid_referer) {

rewrite ^/ http://www.baidu.com/403.html

}

}


16、定制訪問日誌格式

log_format


網絡連接相關的配置

1、keeplive_timeout #

長連接的超時時長,默認75秒

2、keeplive_requests #

在一個長連接上所能夠允許請求的最大資源數

3、keeplive_disable [msie6|safari|none]

為指定類型的User Agent禁用長連接

4、tcp_nodelay on|off

是否對長連接使用TCP_NODELAY選項;(如想提升用戶體驗,使用on)

5、client_header_timeout #;

讀取http請求報文首部的超時時長

6、client_body_timeout #;

讀取http請求報文body部分的超時時長

7、send_timeout #;

發送響應報文的超時時長


fastcgi的相關配置

lnmp:php要啟用fpm模型




nginx 個人詳解,基礎知識,要點總結