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;
}