nginx的主要功能
http服務(wù)器
http服務(wù)器的反向代理
imap/pop3郵件服務(wù)器
tcp/udp協(xié)議的偽四層負(fù)載均衡調(diào)度(stream),但是受到系統(tǒng)套接字?jǐn)?shù)量的限制慰于。
nginx的安裝配置:
官方的預(yù)制包:http://nginx.org/packages/centos/7/x86_64/RPMS/
使用EPEL源安裝下面的epel源白翻,點擊進(jìn)去后選擇適合的版本。
Fedora-EPEL
阿里云的epel源
編譯安裝:
yum groupinstall "Development Tools" "Server Platform Development"
yum install pcre-devel openssl-devel zlib-devel
useradd -r nginx
./configure --prefix=/usr/local/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/run/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_dav_module --with-http_stub_status_module --with-threads --with-file-aio
make && make install
Nginx的程序架構(gòu):
master/worker
一個master進(jìn)程:
負(fù)載加載和分析配置文件巧娱、管理worker進(jìn)程拒课、平滑升級
一個或多個worker進(jìn)程
處理并響應(yīng)用戶請求
緩存相關(guān)的進(jìn)程:
cache loader:載入緩存對象
cache manager:管理緩存對象
特性:異步I/O、事件驅(qū)動和非阻塞I/O
并發(fā)請求處理:通過epoll/select
文件IO:高級IO sendfile足删,異步寿谴,mmap
介紹一下I/O模型
分為同步I/O和異步I/O
同步I/O:阻塞性I/O锁右、非阻塞性I/O失受、復(fù)用性I/O、事件驅(qū)動性I/O
異步I/O:AIO(Linux)咏瑟、LOCP(Windows)
一般有兩種類型:網(wǎng)絡(luò)I/O和磁盤I/O
I/O系統(tǒng)調(diào)用過程
第一步拂到,用戶空間的進(jìn)程向內(nèi)核發(fā)起調(diào)用,內(nèi)核向磁盤調(diào)用資源到內(nèi)核內(nèi)存
第二步码泞,進(jìn)程把調(diào)用的資源從內(nèi)核內(nèi)存拷貝到用戶空間的內(nèi)存
類型
阻塞性(掛起進(jìn)程)兄旬,一直等待直到請求被處理,返回結(jié)果
非阻塞性(不掛起進(jìn)程)余寥,進(jìn)程不用一直等待數(shù)據(jù)處理結(jié)果领铐,但會反復(fù)查看數(shù)據(jù)處理情況,直到數(shù)據(jù)處理完成宋舷。性能和阻塞性I/O差不多绪撵。
多路復(fù)用性I/O,I/O多路復(fù)用的函數(shù)也是阻塞的祝蝠,但是其與以上兩種還是有不同的音诈,I/O多路復(fù)用是阻塞在select,poll這樣的系統(tǒng)調(diào)用之上绎狭,而沒有阻塞在真正的I/O系統(tǒng)調(diào)用如recvfrom之上细溅。這個進(jìn)程持續(xù)發(fā)起多個調(diào)用,但是也阻塞在多個調(diào)用上儡嘶。一個進(jìn)程會監(jiān)控發(fā)起的多個系統(tǒng)調(diào)用喇聊。
函數(shù)
select()最多監(jiān)控1024個請求
poll()
事件驅(qū)動性I/O:進(jìn)程發(fā)起系統(tǒng)調(diào)用,發(fā)起調(diào)用之后進(jìn)程可以去處理其他請求蹦狂,等到數(shù)據(jù)包準(zhǔn)備好后誓篱,系統(tǒng)通過進(jìn)程留下的信息回調(diào)進(jìn)程通知數(shù)據(jù)包準(zhǔn)備完成邻耕。進(jìn)程再去把數(shù)據(jù)復(fù)制到應(yīng)用空間,但是這個復(fù)制過程還是阻塞的燕鸽。使用epool函數(shù)
系統(tǒng)調(diào)用函數(shù)
epoll()epool使用句柄創(chuàng)建3個函數(shù)兄世,沒有連接最大限制
異步I/O,AIO:這類函數(shù)的工作機(jī)制是告知內(nèi)核啟動某個操作啊研,并讓內(nèi)核在整個操作(包括將數(shù)據(jù)從內(nèi)核拷貝到用戶空間)完成后通知我們御滩。
nginx模塊:高度模塊化,但其模塊早期不支持DSO機(jī)制党远;近期版本支持動態(tài)裝載和卸載削解;
模塊分類:
核心模塊:core module
標(biāo)準(zhǔn)模塊:
HTTP modules:
Standard HTTP modules
Optional HTTP modules
Mail modules
Stream modules:傳輸層代理模塊
3rd party modules:支持第三方模塊
配置文件的組成部分:
主配置文件:nginx.conf
fastcgi, uwsgi沟娱,scgi等協(xié)議相關(guān)的配置文件
mime.types:支持的mime類型
主程序文件:/usr/sbin/nginx
啟動腳本:nginx.service
變量
內(nèi)建變量:由Nginx模塊引入氛驮,可直接引用;
自定義變量:由用戶使用set命令定義济似;
set variable_name value;
引用變量:$variable_name
nginx的內(nèi)置變量
$args 此變量與請求行中的參數(shù)相等 注意我請求中的 referer 此變量表示我請求的所有參數(shù)
$args 這個變量等于GET請求中的參數(shù)矫废。例如,foo=123&bar=blahblah;這個變量只可以被修改
$binary_remote_addr 二進(jìn)制碼形式的客戶端地址砰蠢。
$body_bytes_sent 傳送頁面的字節(jié)數(shù)
$content_length 請求頭中的Content-length字段蓖扑。
$content_type 請求頭中的Content-Type字段。
$cookie_COOKIE cookie COOKIE的值台舱。
$document_root 當(dāng)前請求在root指令中指定的值律杠。
$document_uri
$host 請求中的主機(jī)頭(Host)字段,如果請求中的主機(jī)頭不可用或者空竞惋,則為處理請求的server名稱(處理請求的server的server_name指令的值)柜去。值為小寫,不包含端口拆宛。
$hostname 機(jī)器名使用 gethostname系統(tǒng)調(diào)用的值
$http_HEADER HTTP請求頭中的內(nèi)容嗓奢,HEADER為HTTP請求中的內(nèi)容轉(zhuǎn)為小寫,-變?yōu)開(破折號變?yōu)橄聞澗€)胰挑,例如:$http_user_agent(Uaer-Agent的值), $http_referer...;
$sent_http_HEADER HTTP響應(yīng)頭中的內(nèi)容蔓罚,HEADER為HTTP響應(yīng)中的內(nèi)容轉(zhuǎn)為小寫,-變?yōu)開(破折號變?yōu)橄聞澗€)瞻颂,例如: $sent_http_cache_control,$sent_http_content_type...;
$is_args 如果$args設(shè)置豺谈,值為"?",否則為""贡这。
$limit_rate 這個變量可以限制連接速率茬末。
$nginx_version 當(dāng)前運行的nginx版本號。
$query_string 與$args相同。
$remote_addr 客戶端的IP地址丽惭。
$remote_port 客戶端的端口击奶。
$remote_user 已經(jīng)經(jīng)過Auth Basic Module驗證的用戶名。
$request_filename 當(dāng)前連接請求的文件路徑责掏,由root或alias指令與URI請求生成柜砾。
$request_body 這個變量(0.7.58+)包含請求的主要信息。在使用proxy_pass或fastcgi_pass指令的location中比較有意義换衬。
$request_body_file 客戶端請求主體信息的臨時文件名痰驱。
$request_completion 如果請求成功,設(shè)為"OK"瞳浦;如果請求未完成或者不是一系列請求中最后一部分則設(shè)為空担映。
$request_method 這個變量是客戶端請求的動作,通常為GET或POST叫潦。包括0.8.20及之前的版本中饰剥,這個變量總為main request中的動作水援,如果當(dāng)前請求是一個子請求趴生,并不使用這個當(dāng)前請求的動作杠河。
$request_uri 這個變量等于包含一些客戶端請求參數(shù)的原始URI,它無法修改拔妥,請查看$uri更改或重寫URI忿危。含有參數(shù)的完整的初始URI 如上例子就是
$scheme 所用的協(xié)議,比如http或者是https没龙,比如rewrite ^(.+)$ $scheme://example.com$1 redirect;
$server_addr 服務(wù)器地址,在完成一次系統(tǒng)調(diào)用后可以確定這個值缎玫,如果要繞開系統(tǒng)調(diào)用硬纤,則必須在listen中指定地址并且使用bind參數(shù)。
$server_name 服務(wù)器名稱赃磨。
$server_port 請求到達(dá)服務(wù)器的端口號筝家。
$server_protocol 請求使用的協(xié)議,通常是HTTP/1.0或HTTP/1.1邻辉。
$uri 請求中的當(dāng)前URI(不帶請求參數(shù)溪王,參數(shù)位于$args),不同于瀏覽器傳遞的$request_uri的值值骇,它可以通過內(nèi)部重定向莹菱,或者使用index指令進(jìn)行修改。不包括協(xié)議和主機(jī)名吱瘩,例如/foo/bar.html
$proxy_add_x_forwarded_for 變量包含客戶端請求頭中的"X-Forwarded-For"道伟,與$remote_addr用逗號分開,如果沒有"X-Forwarded-For" 請求頭,則$proxy_add_x_forwarded_for等于$remote_addr蜜徽。$remote_addr變量的值是客戶端的IP祝懂。
nginx管理工具的命令
-?,-h : 打開幫助信息
-v : 顯示版本信息并退出
-V : 顯示版本和配置選項信息,然后退出
-t : 檢測配置文件是否有語法錯誤拘鞋,然后退出
-T :檢查配置文件并顯示配置文件內(nèi)容
-q : 在檢測配置文件期間屏蔽非錯誤信息
-s signal : 給一個nginx主進(jìn)程發(fā)送信號:stop(停止), quit(退出), reopen(重啟), reload(重新加載配置文件)
-p prefix : 設(shè)置前綴路徑(默認(rèn)是:/usr/local/Cellar/nginx/1.2.6/)
-c filename : 設(shè)置配置文件(默認(rèn)是:/usr/local/etc/nginx/nginx.conf)
-g directives : 設(shè)置配置文件外的全局參數(shù)
主配置文件結(jié)構(gòu):
main block:主配置段砚蓬,也即全局配置段;
event { #事件驅(qū)動相關(guān)的配置盆色;
...
}
http { #http/https 協(xié)議相關(guān)的配置段怜械;
...
}
mail { #mail服務(wù)相關(guān)的配置段;
...
}
stream { #四層代理配置段傅事;
...
}
配置指令:
main全局配置段常見的配置指令:
分類:
正常運行必備的配置
優(yōu)化性能相關(guān)的配置
用于調(diào)試及定位問題相關(guān)的配置
事件驅(qū)動相關(guān)的配置
注意:
(1) 指令必須以分號結(jié)尾缕允;
(2) 支持使用配置變量;
正常運行必備的配置:
1蹭越、user
Syntax: user user [group];
Default: user nobody nobody;
Context: main
#定義工作進(jìn)程使用的用戶和組憑據(jù)障本。 如果省略group,則使用其名稱等于user的組响鹃。
2驾霜、pid /PATH/TO/PID_FILE;
指定存儲nginx主進(jìn)程進(jìn)程號的文件路徑;
3买置、include file | mask;
指明包含進(jìn)來的其它配置文件片斷粪糙;
4、load_module file; 新版本才支持
性能優(yōu)化相關(guān)的配置:
1忿项、worker_processes number | auto;
worker進(jìn)程的數(shù)量蓉冈;通常應(yīng)該等于小于當(dāng)前主機(jī)的cpu的物理核心數(shù);
auto:當(dāng)前主機(jī)物理CPU核心數(shù)轩触;
2寞酿、worker_cpu_affinity cpumask ...; #綁定worker進(jìn)程到一個cpu核心上,默認(rèn)不綁定脱柱。
worker_cpu_affinity auto [cpumask];
nginx進(jìn)程的CPU親緣性伐弹;
CPU MASK:
0000 0001:0號CPU
0000 0010:1號CPU
0000 0100:2號CPU
#如果只有四核只用四個數(shù)值就行了,每次增加四個數(shù)值榨为,手動綁定直接在選項后面寫CPU編號惨好,0000 0011:表示0和1號CPU;
3随闺、worker_priority number;
指定worker進(jìn)程的nice值日川,設(shè)定worker進(jìn)程優(yōu)先級;[-20,20]數(shù)值越小優(yōu)先級越高板壮。
4逗鸣、worker_rlimit_nofile number;,進(jìn)程每接收到一個請求,就要打開一個文件撒璧。
worker進(jìn)程所能夠打開的文件數(shù)量上限透葛;
調(diào)試、定位問題:
1卿樱、daemon on|off; 在CentOS 6中是on僚害,CentOS 7是off。 #是否以守護(hù)進(jìn)程方式運行Nignx繁调;
2萨蚕、master_process on|off; #是否以master/worker模型運行nginx;默認(rèn)為on蹄胰;off為單進(jìn)程
3岳遥、error_log file [level]; #日志文件存放位子和事件等級
事件驅(qū)動相關(guān)的配置:
events {
...
}
1、worker_connections number; #每個worker進(jìn)程所能夠打開的最大并發(fā)連接數(shù)數(shù)量裕寨;
#服務(wù)器最大并發(fā)數(shù)= worker_processes * worker_connections
2浩蓉、use method; #指明并發(fā)連接請求的處理方法;可選項:select宾袜、poll捻艳、epoll,默認(rèn)epoll
use epoll;
3庆猫、accept_mutex on | off; #處理新的連接請求的方法认轨;on意味著由各worker輪流處理新請求,Off意味著每個新請求的到達(dá)都會通知所有的worker進(jìn)程月培,worker去搶這個請求嘁字;
http協(xié)議的相關(guān)配置:下面的一些可以定義在HTTP中也可以定義在server中
http {
...
...:各server的公共配置
server {
...
}:每個server用于定義一個虛擬主機(jī);
server {
listen
server_name
root
alias
location [OPERATOR] URL {
...
if CONDITION {
...
}
}
}
}
配置虛擬主機(jī)
每個nginx主機(jī)都是虛擬主機(jī)节视。
server { #配置一個虛擬主機(jī)拳锚;
listen address[:PORT]|PORT;
server_name SERVER_NAME;
root /PATH/TO/DOCUMENT_ROOT;
}
listen address[:port] [default_server] [ssl] [http2 | spdy] [backlog=number] [rcvbuf=size] [sndbuf=size]
#指定監(jiān)聽端口
default_server :設(shè)定為默認(rèn)虛擬主機(jī);
ssl :限制僅能夠通過ssl連接提供服務(wù)寻行;
backlog=number :后援隊列長度;
rcvbuf=size :接收緩沖區(qū)大胸揖!拌蜘;
sndbuf=size :發(fā)送緩沖區(qū)大小牙丽;
http2 :使用http2協(xié)議
server_name name ...; #指明虛擬主機(jī)的主機(jī)名稱简卧;后可跟多個由空白字符分隔的字符串;
#支持*通配任意長度的任意字符烤芦;server_name *.magedu.com www.magedu.*
#支持~起始的字符做正則表達(dá)式模式匹配举娩;server_name ~^www\d+\.magedu\.com$
匹配機(jī)制:
(1) 首先是字符串精確匹配;
(2) 左側(cè)*通配符;
(3) 右側(cè)*通配符;
(4) 正則表達(dá)式铜涉;
tcp_nodelay on | off; #在keepalived模式下的連接是否啟用TCP_NODELAY選項智玻;
tcp_nopush on|off; #在sendfile模式下,是否啟用TCP_CORK選項芙代;
sendfile on | off; #是否啟用sendfile功能吊奢;文件高效傳輸功能。
#定義路徑相關(guān)的配置:
root path; #設(shè)置web資源路徑映射纹烹;用于指明用戶請求的url所對應(yīng)的本地文件系統(tǒng)上的文檔所在目錄路徑页滚;可以放在這些字段中:http, server, location, if in location;
location [ = | ~ | ~* | ^~ ] uri { ... } Sets configuration depending on a request URI.
location /bbs {
root "/app/bbs";
} 這個字段表示url根下的web它的路徑是放在/app/web下的bbs
#在一個server中l(wèi)ocation配置段可存在多個铺呵,用于實現(xiàn)從uri到文件系統(tǒng)的路徑映射裹驰;ngnix會根據(jù)用戶請求的URI來檢查定義的所有l(wèi)ocation,并找出一個最佳匹配片挂,而后應(yīng)用其配置幻林;
=:對URI做精確匹配;例如, http://www.magedu.com/宴卖,http://www.magedu.con/index.html.只能匹配第一個滋将,因為第二個多了一個index.html,多一個字符就無法匹配症昏。
~ :對URI做正則表達(dá)式模式匹配随闽,區(qū)分字符大小寫;
~*:對URI做正則表達(dá)式模式匹配肝谭,不區(qū)分字符大小寫掘宪;
^~:對URI的左半部分做匹配檢查,不區(qū)分字符大小寫攘烛;
不帶符號:以URI為前綴的所有uri魏滚;
#匹配優(yōu)先級:=, ^~, ~/~*,不帶符號坟漱;
alias path; #定義路徑別名鼠次,文檔映射的另一種機(jī)制;僅能用于location上下文芋齿;
#注意:location中使用root指令和alias指令的意義不同腥寇;
(a) root,給定的路徑對應(yīng)于location中的/uri/左側(cè)的/觅捆;
(b) alias赦役,給定的路徑對應(yīng)于location中的/uri/右側(cè)的/;
index file ...;
error_page code ... [=[response]] uri; #定義針對指定的錯誤信息顯示的指定的錯誤頁栅炒。
error_page 404 /404.html; #這個還可把一個響應(yīng)嗎修改為其他的響應(yīng)碼掂摔。
location = /404.html {
root "/www/error_pages";
}
error_page 404 =200 /404.html 這個客戶端觸發(fā)404錯誤出但是服務(wù)器端反饋的是200的響應(yīng)碼
try_files file ... uri;
定義客戶端請求的相關(guān)配置
keepalive_timeout timeout [header_timeout]; #設(shè)定保持連接的超時時長术羔,0表示禁止長連接;默認(rèn)為75s乙漓;
keepalive_requests number; #在一次長連接上所允許請求的資源的最大數(shù)量,默認(rèn)為100;
keepalive_disable none | browser ...; #對哪種瀏覽器禁用長連接鱼喉;
send_timeout time; #向客戶端發(fā)送響應(yīng)報文的超時時長趋观,此處扛禽,是指兩次寫操作之間的間隔時長;
client_body_buffer_size size; #用于接收客戶端請求報文的body部分的緩沖區(qū)大斜嗦剩辟;默認(rèn)為16k掐场;超出此大小時,其將被暫存到磁盤上的由client_body_temp_path指令所定義的位置熊户;
client_body_temp_path path [level1 [level2 [level3]]]; #設(shè)定用于存儲客戶端請求報文的body部分的臨時存儲路徑及子目錄結(jié)構(gòu)和數(shù)量嚷堡;按照16進(jìn)制的數(shù)字艇棕;
client_body_temp_path /var/tmp/client_body 1 2 2
1:表示用一位16進(jìn)制數(shù)字表示一級子目錄沼琉;0-f
2:表示用2位16進(jìn)程數(shù)字表示二級子目錄:00-ff
2:表示用2位16進(jìn)程數(shù)字表示三級子目錄:00-ff
對客戶端進(jìn)行限制的相關(guān)配置:
limit_rate rate; #限制響應(yīng)給客戶端的傳輸速率打瘪,單位是bytes/秒,0表示無限制桃移;
limit_except method ... { ... } #限制對指定的請求方法之外的其它方法的使用客戶端;
limit_except GET {
allow 192.168.1.0/24;
deny all;
} #表示除了GET之外的方法进泼,只允許1.0網(wǎng)段使用乳绕。
文件操作優(yōu)化的配置
aio on | off | threads[=pool]; #是否啟用aio功能绞惦;異步I/O,建議開啟济蝉;
directio size | off; #在Linux主機(jī)啟用O_DIRECT標(biāo)記菠发,此處意味文件大于等于給定的大小時不在內(nèi)核中不緩存滓鸠,使用直接I/O例如directio 4m;
open_file_cache on|off; #是否開啟緩存
open_file_cache max=N [inactive=time];
nginx可以緩存以下三種信息:
(1) 文件的描述符糜俗、文件大小和最近一次的修改時間悠抹;
(2) 打開的目錄結(jié)構(gòu)楔敌;
(3) 沒有找到的或者沒有權(quán)限訪問的文件的相關(guān)信息梁丘;
max=N:可緩存的緩存項上限氛谜;達(dá)到上限后會使用LRU(最少最近)算法實現(xiàn)緩存管理;
inactive=time:緩存項的非活動時長澳腹,在此處指定的時長內(nèi)未被命中的或命中的次數(shù)少于open_file_cache_min_uses指令所指定的次數(shù)的緩存項即為非活動項酱塔;
open_file_cache_valid time; #緩存項有效性的檢查頻率羊娃;默認(rèn)為60s;
open_file_cache_min_uses number; #在open_file_cache指令的inactive參數(shù)指定的時長內(nèi)蕊玷,至少應(yīng)該被命中多少次方可被歸類為活動項垃帅;
open_file_cache_errors on | off; #是否緩存查找時發(fā)生錯誤的文件一類的信息贸诚;
常用模塊的配置
ngx_http_access_module模塊:實現(xiàn)基于ip的訪問控制功能
allow address | CIDR | unix: | all;
deny address | CIDR | unix: | all; #設(shè)置訪問控制要在后面定義一個默認(rèn)策略酱固。
可以放在:http媒怯、server扇苞、location、limit_except 字段中脖苏。
ngx_http_auth_basic_module模塊棍潘,實現(xiàn)基于用戶的訪問控制亦歉,使用basic機(jī)制進(jìn)行用戶認(rèn)證肴楷;
auth_basic string | off; #提示信息
auth_basic_user_file file; #用戶文件路徑
location /admin/ {
alias /webapps/app1/data/;
auth_basic "Admin Area";
auth_basic_user_file /etc/nginx/.ngxpasswd;
}
注意:使用htpasswd創(chuàng)建授權(quán)用戶文件赛蔫,這個命令由httpd-tools所提供呵恢;
ngx_http_stub_status_module模塊渗钉,用于輸出nginx的基本狀態(tài)信息晌姚;
stub_status;
配置示例:
location /basic_status {
stub_status;
}
查看到的信息
Active connections: 291
server accepts handled requests
16630948 16630948 31070465
Reading: 6 Writing: 179 Waiting: 106
Active connections :活動狀態(tài)的連接數(shù);
accepts :已經(jīng)接受的客戶端請求的總數(shù);
handled :已經(jīng)處理完成的客戶端請求的總數(shù)宝磨;
requests :客戶端發(fā)來的總的請求數(shù)盅安;
Reading :處于讀取客戶端請求報文首部的連接的連接數(shù)别瞭;
Writing :處于向客戶端發(fā)送響應(yīng)報文過程中的連接數(shù)蝙寨;
Waiting :處于等待客戶端發(fā)出請求的空閑連接數(shù)墙歪;
ngx_http_log_module模塊 定義http的訪問格式
log_format name string ...;
string可以使用nginx核心模塊及其它模塊內(nèi)嵌的變量虹菲;
"$http_x_forwarded_for 這個模塊是用于后端服務(wù)器通過數(shù)據(jù)包的首部信息獲取真正客戶端的地址
access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
訪問日志文件路徑毕源,格式及相關(guān)的緩沖的配置霎褐;
buffer=size
flush=time
access_log /app/test.log mian瘩欺;
open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off;
緩存各日志文件相關(guān)的元數(shù)據(jù)信息俱饿;
max:緩存的最大文件描述符數(shù)量拍埠;
min_uses:在inactive指定的時長內(nèi)訪問大于等于此值方可被當(dāng)作活動項枣购;
inactive:非活動時長;
valid:驗正緩存中各緩存項是否為活動項的時間間隔眷蜓;
ngx_http_gzip_module:壓縮模塊
gzip on | off; 是否啟用壓縮
gzip_comp_level level; #壓縮等級吁系,可選等級1-9默認(rèn)是1汽纤。
gzip_disable regex ...; #不壓縮的正則表達(dá)式匹配到的瀏覽器
gzip_min_length length; #啟用壓縮功能的響應(yīng)報文大小閾值蕴坪;
gzip_buffers number size; #支持實現(xiàn)壓縮功能時為其配置的緩沖區(qū)數(shù)量及每個緩存區(qū)的大斜炒续室;默認(rèn)值為:gzip_buffers 32 4K或16 8K
gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;nginx
#作為代理服務(wù)器接收到從被代理服務(wù)器發(fā)送的響應(yīng)報文后挺狰,在何種條件下啟用壓縮功能的off:對代理的請求不啟用丰泊,
默認(rèn)值設(shè)置no-cache, no-store瞳购,private:表示從被代理服務(wù)器收到的響應(yīng)報文首部的Cache-Control的值為此三者中任何
一個学赛,則啟用壓縮功能盏浇;
gzip_types mime-type ... ; #壓縮過濾器绢掰,僅對此處設(shè)定的MIME類型的內(nèi)容啟用壓縮功能滴劲,默認(rèn)為text/html
示例:
gzip on;
gzip_comp_level 6;
gzip_min_length 64;
gzip_proxied any;
gzip_types text/xml text/css application/javascript;
ngx_http_ssl_module模塊:
ssl on | off; #是否啟用ssl功能
ssl_certificate file; #當(dāng)前虛擬主機(jī)使用PEM格式的證書文件班挖;
ssl_certificate_key file; #當(dāng)前虛擬主機(jī)上與其證書匹配的私鑰文件聪姿;
ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2]; #支持ssl協(xié)議版本末购,默認(rèn)為后三個盟榴;
ssl_session_cache off | none | [builtin[:size]] [shared:name:size]; # off關(guān)閉擎场、none不啟用
builtin[:size]:使用OpenSSL內(nèi)建的緩存迅办,此緩存為每worker進(jìn)程私有站欺;
[shared:name:size]:在各worker之間使用一個共享的緩存矾策;
ssl_session_timeout time; #客戶端一側(cè)的連接可以復(fù)用ssl session ca che中緩存的ssl參數(shù)的有效時長贾虽;
配置示例:
server {
listen 443 ssl;
server_name www.magedu.com;
root /vhosts/ssl/htdocs;
ssl on;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
ssl_session_cache shared:sslcache:20m;
}
ngx_http_rewrite_module模塊:將用戶請求的URI基于regex所描述的模式進(jìn)行檢查,而后完成替換地粪;
rewrite regex replacement [flag] #將用戶請求的URI基于regex所描述的模式進(jìn)行檢查驶忌,匹配到時將其替換為replacement指定的新的URI付魔;
#注意:如果在同一級配置塊中存在多個rewrite規(guī)則几苍,那么會自下而下逐個檢查妻坝;被某條件規(guī)則替換完成后刽宪,會重新一輪的替換檢查圣拄,
因此庇谆,隱含有循環(huán)機(jī)制饭耳;[flag]所表示的標(biāo)志位用于控制此循環(huán)機(jī)制寞肖;
#如果replacement是以http://或https://開頭逝淹,則替換結(jié)果會直接以重向返回給客戶端栅葡;
[flag]:
last:重寫完成后停止對當(dāng)前URI在當(dāng)前l(fā)ocation中后續(xù)的其它重寫操作欣簇,而后對新的URI啟動新一輪重寫檢查熊咽;提前重啟新一輪循環(huán)被因;
break:重寫完成后停止對當(dāng)前URI在當(dāng)前l(fā)ocation中后續(xù)的其它重寫操作梨与,而后直接跳轉(zhuǎn)至重寫規(guī)則配置塊之后的其它配置粥鞋;結(jié)束循環(huán)呻粹;
redirect:重寫完成后以臨時重定向方式直接返回重寫后生成的新URI給客戶端等浊,由客戶端重新發(fā)起請求筹燕;不能以http://或https://開頭庄萎;
permanent:重寫完成后以永久重定向方式直接返回重寫后生成的新URI給客戶端糠涛,由客戶端重新發(fā)起請求;
return 提前返回
return code [text];
return code URL;
return URL;
Stops processing and returns the specified code to a client.
rewrite_log on | off; #是否開啟重寫日志砸脊;
if (condition) { ... } #引入一個新的配置上下文 凌埂;條件滿足時瞳抓,執(zhí)行配置塊中的配置指令孩哑;可以放在,server, location丛晌;
condition:
比較操作符:
==
!=
~:模式匹配茵乱,區(qū)分字符大小寫瓶竭;
~*:模式匹配斤贰,不區(qū)分字符大小寫瓷叫;
!~:模式不匹配摹菠,區(qū)分字符大小寫次氨;
!~*:模式不匹配煮寡,不區(qū)分字符大小寫幸撕;
文件及目錄存在性判斷:
-e, !-e
-f, !-f
-d, !-d
-x, !-x
ngx_http_referer_module模塊:限制引用鏈接。
valid_referers none | block | server_names | string ...;
定義referer首部的合法可用值挑童;
referer首部顯示用戶從哪個頁面跳轉(zhuǎn)到這個頁面的站叼。
none:請求報文首部沒有referer首部尽楔;
block:請求報文的referer首部沒有值玛荞;
server_names:參數(shù)勋眯,其可以有值作為主機(jī)名或主機(jī)名模式客蹋;
arbitrary_string:直接字符串,但可使用*作通配符辆琅;
regular expression:被指定的正則表達(dá)式模式匹配到的字符串;要使用~打頭这刷,例如 ~.*\.magedu\.com婉烟;
referer_hash_bucker_szie szie ; 保存的定義模式的hash值空間的初始大小
referer_hash_max_size szie ;保存hash值最大內(nèi)存空間暇屋。
配置示例:
valid_referers none block server_names *.magedu.com *.mageedu.com magedu.* mageedu.* ~\.magedu\.;
if($invalid_referer) {
return http://www.magedu.com/invalid.jpg;
}
注:如果定義了合法引用隅很,那么未定義的全為非法引用。
ngx_http_proxy_module模塊:http代理模塊率碾。
proxy_pass URL; #后端服務(wù)器的地址
#注意:proxy_pass后面的路徑不帶uri時屋彪,其會將location的uri傳遞給后端主機(jī)所宰;
server {
...
server_name HOSTNAME;
location /uri/ {
proxy http://hos[:port];
}
...
}
http://HOSTNAME/uri --> http://host/uri
#proxy_pass后面的路徑是一個uri時,其會將location的uri替換為proxy_pass的uri畜挥;location和proxy_pass是映射關(guān)系仔粥,
如果location定義了/bbs,proxy_pass只寫了http://192.168.166.1蟹但,沒有寫/bbs或根躯泰,那訪問代理服務(wù)器的/bbs就會被代理到后端
的服務(wù)器的/bbs,也就是說訪問代理服務(wù)器的路徑就代理到后端服務(wù)器的同樣的路徑华糖。
server {
...
server_name HOSTNAME;
location /uri/ {
proxy http://host/new_uri/;
}
...
}
http://HOSTNAME/uri/ --> http://host/new_uri/
#注:如果location定義uri時使用了正則表達(dá)式的模式麦向,或在if語句或limt_execept中使用proxy_pass指令,則proxy_pass之后
必須不能使用uri; 用戶請求時傳遞的uri將直接附加代理到的服務(wù)的之后客叉;
server {
...
server_name HOSTNAME;
location ~|~* /uri/ {
proxy http://host;
}
...
}
http://HOSTNAME/uri/ --> http://host/uri/诵竭;
proxy_set_header field value; #設(shè)定發(fā)往后端主機(jī)的請求報文的請求首部的值话告;Context:http、server卵慰、location
proxy_set_header X-Real-IP $remote_addr; #定義一個請求首部沙郭,值為客戶機(jī)的IP地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#$proxy_add_x_forwarded_for變量包含客戶端請求頭中的"X-Forwarded-For",與$remote_addr用逗號分開裳朋,如果沒有"X-Fo
rwarded-For" 請求頭病线,則$proxy_add_x_forwarded_for等于$remote_addr。$remote_addr變量的值是客戶端的IP鲤嫡。當(dāng)Nginx設(shè)置
X-Forwarded-For于$proxy_add_x_forwarded_for后會有兩種情況發(fā)生:
1送挑、如果從CDN過來的請求沒有設(shè)置X-Forwarded-For頭(通常這種事情不會發(fā)生),而到了我們這里Nginx設(shè)置將其設(shè)置為$proxy_
add_x_forwarded_for的話泛范,X-Forwarded-For的信息應(yīng)該為CDN的IP让虐,因為相對于Nginx負(fù)載均衡來說客戶端即為CDN,這樣的話罢荡,后端的
web程序時死活也獲得不了真實用戶的IP的赡突。
2、CDN設(shè)置了X-Forwarded-For区赵,我們這里又設(shè)置了一次惭缰,且值為$proxy_add_x_forwarded_for的話,那么X-Forwarded-For的
內(nèi)容變成 ”客戶端IP,Nginx負(fù)載均衡服務(wù)器IP“如果是這種情況的話笼才,那后端的程序通過X-Forwarded-For獲得客戶端IP漱受,則取逗號分隔的
第一項即可。
如上兩點所說骡送,如果我們知道了CDN設(shè)置了X-Forwarded-For信息昂羡,且只有客戶端真實的IP的話,那么我們的Nginx負(fù)載均衡服務(wù)器可以不必理會該頭摔踱,讓它默認(rèn)即可虐先。
proxy_cache_path #定義可用于proxy功能的緩存;Context:http
proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time][max_size=size][manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time]
[loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
格式:proxy_cache_path /app/cache keys_zone=aa:10m levels=1:2 max_size=2g;
keys_zone=aa:10m #定義一個緩存派敷,名字為aa蛹批,大小為10m
levels=1:2 #定義緩存目錄結(jié)構(gòu),1:2表示一級子目錄是1個16進(jìn)制數(shù)篮愉,二級子目錄2個16進(jìn)制數(shù)腐芍。
max_size=2g #緩存空間的最大空間
proxy_cache zone | off; #指明要調(diào)用的緩存,或關(guān)閉緩存機(jī)制试躏;Context:http猪勇、server、location
proxy_cache_key string; #緩存中用于“鍵”的內(nèi)容颠蕴;可以是url埠对,也可以是url后面的內(nèi)容络断。
默認(rèn)值:proxy_cache_key $scheme$proxy_host$request_uri;協(xié)議、主機(jī)项玛、url
proxy_cache_valid [code ...] time; #定義對特定響應(yīng)碼的響應(yīng)內(nèi)容的緩存時長貌笨;
proxy_cache_valid 200 302 6m;
定義在http{...}中;
proxy_cache_path /var/cache/nginx/proxy_cache levels=1:1:1 keys_zone=pxycache:20m max_size=1g;
定義在需要調(diào)用緩存功能的配置段襟沮,例如server锥惋、location{...};
proxy_cache pxycache;
proxy_cache_key $request_uri;
proxy_cache_valid 200 302 301 1h;
proxy_cache_valid any 1m;
proxy_cache_use_stale #后端主機(jī)無法訪問時开伏,是否可以使用緩存響應(yīng)客戶端請求膀跌。error
proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...;
error #后端服務(wù)器發(fā)送了錯誤
timeout #后端服務(wù)器超時
invalid_header #后端服務(wù)器有一個非法的首部
updating #后端服務(wù)器正在更新
http_500 #后端服務(wù)器響應(yīng)了502
http_50 ...
off 關(guān)閉
proxy_cache_methods GET | HEAD | POST ...; #允許哪些操作可以緩存。默認(rèn)值為get固灵、head
proxy_hide_header field; #隱藏緩存數(shù)據(jù)中響應(yīng)給客戶端的首部捅伤。默認(rèn):Date、Server巫玻、X-Pad丛忆、and X-Accel-By defult。
X-Powerer-by 隱藏php版本信息
proxy_connect_timeout time; #定義創(chuàng)建代理服務(wù)和后端服務(wù)器連接的超時時長仍秤。默認(rèn)為60s熄诡;最長為75s;下面的默認(rèn)值一樣
proxy_read_timeout time; #后端服務(wù)器發(fā)給代理服務(wù)器響應(yīng)報文的超時時長
proxy_send_timeout time; #發(fā)送給后端服務(wù)器請求報文的超時時長
ngx_http_headers_module模塊,向由代理服務(wù)器響應(yīng)給客戶端的響應(yīng)報文添加自定義首部诗力,或修改指定首部的值凰浮;
add_header name value [always]; #添加自定義首部;
示例:
add_header X-Via $server_addr; #在發(fā)送給客戶端的響應(yīng)報文中添加代理服務(wù)器的IP
add_header X-Accel $server_name; #在發(fā)給客戶端的響應(yīng)報文中添加代理服務(wù)器的主機(jī)名
expires [modified] time;
expires epoch | max | off; #用于定義Expire或Cache-Control首部的值苇本;
ngx_http_fastcgi_module模塊:代理支持fastcgi服務(wù)袜茧,如PHP。
fastcgi_pass address; #定義后端動態(tài)頁面服務(wù)器的地址
address為fastcgi server的地址瓣窄; location, if in location惫周;
http://www.ilinux.io/admin/index.php --> /admin/index.php (uri)/data/application/admin/index.php
fastcgi_index name; #fastcgi默認(rèn)的主頁資源;
fastcgi_param parameter value [if_not_empty]; #向后端的php服務(wù)器傳遞參數(shù)。比如請求資源的路徑康栈、這里用于向后端php服務(wù)器的資源路徑
參數(shù):要傳遞的參數(shù)列表在/etc/nginx/fastcgi_params文件中。
配置示例1:
前提:配置好fpm server和mariadb-server服務(wù)喷橙;
location ~* \.php$ { #這里匹配到的資源名成被定義成變量$fastcgi_script_name;傳遞給后端服務(wù)需要填寫
root /usr/share/nginx/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name;
include fastcgi_params; #定義這個配置包含要傳遞的參數(shù)定義文件
}
SCRIPT_FILENAME 表示傳遞給后端服務(wù)器的資源名和路徑
配置示例2:通過/pm_status和/ping來獲取fpm server狀態(tài)信息啥么;
location ~* ^/(pm_status|ping)$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
}
#注:訪問代理服務(wù)器的pm_status路徑時》∮猓可以看到php-fpm的連接池的狀態(tài)悬荣。輸入pm_status?full可以看到全部的狀態(tài)
fastcgi_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time]
[max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number]
[loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time]
[purger_threshold=time];
#定義fastcgi的緩存;緩存位置為磁盤上的文件系統(tǒng)疙剑,由path所指定路徑來定義氯迂;不帶中括號的為必選践叠。
levels=levels: #緩存目錄的層級數(shù)量,以及每一級的目錄數(shù)量嚼蚀;levels=ONE:TWO:THREE
leves=1:2:2
keys_zone=name:size #k/v映射的內(nèi)存空間的名稱及大小
inactive=time #非活動時長
max_size=size #磁盤上用于緩存數(shù)據(jù)的緩存空間上限
fastcgi_cache zone | off; #調(diào)用指定的緩存空間來緩存數(shù)據(jù)禁灼;http, server, location
fastcgi_cache_key string; #定義用作緩存項的key的字符串;
fastcgi_cache_methods GET | HEAD | POST ...; #為哪些請求方法使用緩存轿曙;
fastcgi_cache_min_uses number; #緩存空間中的緩存項在inactive定義的非活動時間內(nèi)至少要被訪問到此處所指定的次數(shù)方可被認(rèn)作活動項弄捕;
fastcgi_cache_valid [code ...] time; #不同的響應(yīng)碼各自的緩存時長;
示例:
http {
...
fastcgi_cache_path /var/cache/nginx/fastcgi_cache levels=1:2:1 keys_zone=fcgi:20m inactive=120s;
...
server {
...
location ~* \.php$ {
...
fastcgi_cache fcgi;
fastcgi_cache_key $request_uri;
fastcgi_cache_valid 200 302 10m;
fastcgi_cache_valid 301 1h;
fastcgi_cache_valid any 1m;
...
}
...
}
...
}
fastcgi_keep_conn on | off; #默認(rèn)情況下导帝,fastcgi會關(guān)閉連接守谓,但是我們可以設(shè)置長連接。這個選項提示是否開啟長連接您单,on啟動斋荞、off關(guān)閉
ngx_http_upstream_module :七層調(diào)度
upstream name { ... } #定義后端服務(wù)器組;引入一個新的上下文虐秦;只能用于http{}上下文中平酿;
#注: 默認(rèn)的調(diào)度方法是wrr;權(quán)重的調(diào)度方法是真實服務(wù)器的權(quán)重是幾那就認(rèn)為它有幾虛擬服務(wù)器羡疗,然后按照虛擬服務(wù)器的總數(shù)進(jìn)行輪詢調(diào)度染服。 如果不設(shè)置默認(rèn)每個服務(wù)器的權(quán)重都是1,等同與rr(輪詢)叨恨。
server address [parameters] #定義服務(wù)器地址和相關(guān)的參數(shù)柳刮;
地址格式:
IP[:PORT]
HOSTNAME[:PORT]
unix:/PATH/TO/SOME_SOCK_FILE
參數(shù):
weight=number# #權(quán)重,默認(rèn)為1痒钝;
max_fails=number #探測服務(wù)器失敗嘗試的最大次數(shù)秉颗;
max_conns=number #最大連接數(shù),新版本只有企業(yè)版支持
fail_timeout=time #設(shè)置服務(wù)器為不可用狀態(tài)的超時時長送矩;默認(rèn)為10s蚕甥,和max_fails對應(yīng)
backup #把服務(wù)器標(biāo)記為“備用”狀態(tài);
down #手動標(biāo)記其為不可用栋荸;
算法
least_conn; #最少連接調(diào)度算法菇怀;當(dāng)服務(wù)器的權(quán)重相同時為lc最小連接調(diào)度。當(dāng)server擁有不同的權(quán)重時為wlc晌块;當(dāng)所有后端主機(jī)的連接數(shù)相同時爱沟,則使用wrr進(jìn)行調(diào)度;
ip_hash; #源地址hash算法匆背;能夠?qū)碜酝粋€源IP地址的請求始終發(fā)往同一個upstream server呼伸;
hash key [consistent]; #基于指定的key的hash表實現(xiàn)請求調(diào)度,此處的key可以文本钝尸、變量或二者的組合括享;
#注:consistent:參數(shù)搂根,指定使用一致性hash算法;建議添加铃辖,不添加對應(yīng)下面的第一個算法剩愧,添加對應(yīng)第二個。
使客戶端盡量調(diào)用到一臺后端服務(wù)器的澳叉,而調(diào)度器又不需要記錄對應(yīng)表的算法有兩種
- 余數(shù)hash:每一臺服務(wù)器對應(yīng)一個編號隙咸,客戶端進(jìn)行hash運算,運算出的值和編號總數(shù)進(jìn)行取模運算成洗,得出一臺后端服務(wù)器五督,每次客戶端訪問時都會的到同一個結(jié)果。但是這個算法有些缺陷瓶殃,當(dāng)后端服務(wù)器的數(shù)量發(fā)生變化時會導(dǎo)致前面的取模結(jié)果失效充包。
2.一致性hash:先構(gòu)造一個長度為232的整數(shù)環(huán),根據(jù)節(jié)點名稱的Hash值(其分布為0至232-1)將緩存服務(wù)器節(jié)點放置在這個Hash環(huán)上遥椿,然后根據(jù)需要緩存的數(shù)據(jù)的Key值計算得到其Hash值(其分布也為0至232-1)基矮,然后在Hash環(huán)上順時針查找距離這個Key值的Hash值最近的服務(wù)器節(jié)點,完成Key到服務(wù)器的映射查找冠场。缺點家浇,hash環(huán)上的緩存服務(wù)器可能會出現(xiàn)偏斜,導(dǎo)致緩存服務(wù)器分布在非常臨近的節(jié)點上碴裙。解決辦法:調(diào)高緩存服務(wù)器的權(quán)重钢悲,從而可以生成較多的虛擬服務(wù)器,來分布在hash環(huán)上舔株。
示例:
hash $request_uri consistent 莺琳。 #uri最為key可以提高緩存的命中率
hash $remote_addr
hash $cookie_name
keepalive connections; #可使用長連接的連接數(shù)量;每worker與后端服務(wù)保持的最大空閑長連接數(shù)量载慈;
```
###### ngx_stream_core_module:偽四層調(diào)度核心模塊
```
listen address:port [ssl] [udp] [backlog=number] [bind] [ipv6only=on|off] [reuseport]
[so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
監(jiān)聽的端口惭等;
默認(rèn)為tcp協(xié)議;
udp: 監(jiān)聽udp協(xié)議的端口办铡;
```
###### ngx_stream_proxy_module:偽四層調(diào)度
```
proxy_pass address; #后端服務(wù)器地址
proxy_timeout timeout; #設(shè)置兩次讀寫操作之間的間隔辞做,就是一次讀寫不成功的再次重試時間拷肌。默認(rèn)為10m;
proxy_connect_timeout time; #設(shè)置nginx與被代理的服務(wù)器嘗試建立連接的超時時長古胆;默認(rèn)為60s界斜;
proxy_next_upstream on|off 默認(rèn)on #給客戶端調(diào)度了一臺服務(wù)器溉贿,如果這臺服務(wù)器無法訪問時是否允許由調(diào)度器自動幫客戶端調(diào)度到另一臺服務(wù)器。
proxy_next_upstream_timeout time #重新給客戶端調(diào)度的后端服務(wù)器的訪問超時時間获询。
proxy_next_upstream_tries number #超時次數(shù)。超過此設(shè)置的次數(shù)為超時聂抢,默認(rèn)為0拯钻,無限制帖努。
示例:
stream {
upstream s shsrvs {
server 192.168.10.130:22;
server 192.168.10.131:22;
hash $remote_addr consistent;
}
server {
listen 172.16.100.6:22202;
proxy_pass sshsrvs;
proxy_timeout 60s;
proxy_connect_timeout 10s;
}
}
```
###### ngx_stream_log_module 代理日志功能,默認(rèn)關(guān)閉,1.11.4支持
```
access_log path format [buffer=size] [gzip[=level]][flush=time][if=condition] off
示例:
stream {
log_format basic '$remote_addr [$time_local]'
'$protocol $status $bytes_sent $bytes_received'
'$session_time';
access_log /var/log/nginx/access.log basic;
}
```
###### ngx_stream_access_module 四層代理的訪問控制
```
allow address cidr|unix|all
server {
deny 1.1.1.1粪般;
allow 2.2.2.0/16拼余;
deny all;
}
```