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
<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:主進程,生成多個子進程,每個子進程生成多個線程,每個線程響應一個請求
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 個人詳解,基礎知識,要點總結