一.I/O介紹
httpdMPM
perfork:一個(gè)master進(jìn)程開(kāi)啟多個(gè)子進(jìn)程,master只負(fù)責(zé)讀取配置文件和生成子進(jìn)程萧恕,子進(jìn)程只負(fù)責(zé)處理每一個(gè)進(jìn)程
worker:一個(gè)master進(jìn)程開(kāi)啟多個(gè)子進(jìn)程矿卑,每一個(gè)子進(jìn)程復(fù)制開(kāi)啟多個(gè)線程夷陋,每一個(gè)線程負(fù)責(zé)相應(yīng)一個(gè)請(qǐng)求
event:事件驅(qū)動(dòng)竞慢,一個(gè)進(jìn)程可以處理多個(gè)請(qǐng)求
??網(wǎng)絡(luò)IO:本質(zhì)是socket讀取,數(shù)據(jù)收到請(qǐng)求织狐,進(jìn)入網(wǎng)卡暂幼,應(yīng)用程序就要讀取數(shù)據(jù)就是I,用戶準(zhǔn)備好數(shù)據(jù)移迫,相應(yīng)數(shù)據(jù)就是O旺嬉,都是從socket中IO
??硬盤(pán)IO:用戶空間給內(nèi)核發(fā)送指令,讓內(nèi)核從磁盤(pán)讀取數(shù)據(jù)起意,內(nèi)核將數(shù)據(jù)存入內(nèi)核空間鹰服,然后賦值給用戶空間病瞳,這個(gè)過(guò)程就發(fā)生了一次硬盤(pán)IO
同步和異步:關(guān)心的是消息的通訊機(jī)制
同步:調(diào)用者自動(dòng)等待被調(diào)用返回消息揽咕,才能繼續(xù)執(zhí)行悲酷。
異步:被調(diào)用者通過(guò)狀態(tài),通知回調(diào)機(jī)制亲善,回調(diào)機(jī)制主動(dòng)通知調(diào)用者被調(diào)用者的狀態(tài)设易。
阻塞和非阻塞:關(guān)心的是用戶是否等待
阻塞:指IO操作需要徹底完成才返回到用戶空間,調(diào)用結(jié)果返回前蛹头,調(diào)用者被掛起
非阻塞:指IO操作需要徹底完成后才返回到用戶空間顿肺,調(diào)用結(jié)果返回前,調(diào)用者不會(huì)被掛起
同步阻塞IO模型:
??用戶發(fā)送請(qǐng)求訪問(wèn)頁(yè)面渣蜗,內(nèi)核解開(kāi)封裝屠尊,然后內(nèi)核將數(shù)據(jù)包發(fā)送給Nginx進(jìn)程,Nginx查看MIME類型耕拷,然后發(fā)送指令讓內(nèi)核訪問(wèn)硬盤(pán)讀取數(shù)據(jù)讼昆,然后內(nèi)核將數(shù)據(jù)放在緩沖區(qū),將數(shù)據(jù)復(fù)制給進(jìn)程空間骚烧,Ninx在將數(shù)據(jù)發(fā)送給用戶浸赫。缺點(diǎn):CPU利用不高
PIO:CPU全程參與
DMA:只是發(fā)送指令,不直接參與
同步非阻塞IO模型
??進(jìn)程發(fā)送請(qǐng)求赃绊,請(qǐng)求發(fā)送給內(nèi)核既峡,內(nèi)核去磁盤(pán)中訪問(wèn)數(shù)據(jù),將數(shù)據(jù)存放在緩沖區(qū)碧查,然后在復(fù)制到進(jìn)程的內(nèi)存空間运敢,在這個(gè)過(guò)程中,進(jìn)程不會(huì)等待么夫,但是需要一次 一次來(lái)詢問(wèn)者冤,從另外一個(gè)角度看,進(jìn)程來(lái)詢問(wèn)請(qǐng)求是否完成也是一個(gè)CPU資源的浪費(fèi)
IO多路復(fù)用模型
??在接受請(qǐng)求之前增加了一個(gè)系統(tǒng)條用(select只是其中一個(gè))档痪,有系統(tǒng)調(diào)用來(lái)幫進(jìn)程處理后面的事涉枫,系統(tǒng)調(diào)用程序可以同時(shí)接受多個(gè)進(jìn)程訪問(wèn),但是該模型也是會(huì)阻塞腐螟,子select開(kāi)始時(shí)會(huì)阻塞
應(yīng)用場(chǎng)景:
當(dāng)客戶端處理多個(gè)描述符時(shí)愿汰,一般是交互式輸入和網(wǎng)絡(luò)套接字
一個(gè)客戶端同時(shí)處理多個(gè)套接字
當(dāng)一個(gè)TCP服務(wù)器既要處理監(jiān)聽(tīng)套接字,又要處理已經(jīng)連接的套接字
當(dāng)一個(gè)服務(wù)器既要處理TCP乐纸,又要處理UDP
-
當(dāng)一個(gè)服務(wù)器要處理多個(gè)服務(wù)或多個(gè)協(xié)議
image.png
信號(hào)驅(qū)動(dòng)IO模型:
??阻塞在內(nèi)核到進(jìn)程空間拷貝數(shù)據(jù)階段衬廷,前面的階段可以繼續(xù)執(zhí)行其他操作,用戶進(jìn)程通過(guò)sigaction系統(tǒng)注冊(cè)一個(gè)信號(hào)處理程序
異步IO模型:
??整個(gè)過(guò)程都不會(huì)阻塞汽绢,但是該模型內(nèi)核比較繁忙吗跋,進(jìn)程比較輕松,但是進(jìn)程可以處理更多的用戶請(qǐng)求,所以每一個(gè)進(jìn)程可以支持更多的并發(fā)鏈接
主要使用IO復(fù)用和信號(hào)驅(qū)動(dòng)IO模型
主要實(shí)現(xiàn):
select:Linux實(shí)現(xiàn)跌宛,IO復(fù)用模型酗宋,支持各種操作系統(tǒng),Apache使用疆拘。
poll:Linux實(shí)現(xiàn)蜕猫,IO復(fù)用模型,system V哎迄。
epoll:Linux實(shí)現(xiàn)回右,IO復(fù)用模型,具有信號(hào)驅(qū)動(dòng)IO模型的某些特性漱挚,Nginx能夠?qū)崿F(xiàn)高并發(fā)就是因?yàn)槭褂胑poll翔烁。
水平觸發(fā):如果報(bào)告進(jìn)程后沒(méi)有被處理,那么下次poll還會(huì)再次報(bào)告旨涝。
邊緣觸發(fā):只通知一次租漂,epoll支持。
epoll:支持水平觸發(fā)和邊緣觸發(fā)颊糜,只會(huì)告訴一次哩治,沒(méi)有并發(fā)連接限制,能打開(kāi)1024(1G的內(nèi)存能監(jiān)聽(tīng)10萬(wàn)個(gè)端口)
不會(huì)隨著fd數(shù)目的增加而效率下降衬鱼。
mmap():直接內(nèi)存讀取业筏,文件映射,就是將磁盤(pán)的文件直接映射到內(nèi)存中來(lái)提高訪問(wèn)速度鸟赫。
二蒜胖、Nginx基礎(chǔ)
Nginx主要功能:
- WEB服務(wù)器
- 反向代理
- 郵件服務(wù)器反向代理
- 基于TCP協(xié)議代理,偽4層調(diào)度器
反向代理作用:
- 負(fù)載均衡抛蚤,Nginx可以通過(guò)upstream模塊實(shí)現(xiàn)負(fù)載均衡台谢。
- 安全性,真正的服務(wù)器不會(huì)暴露在外網(wǎng)岁经,客戶端不會(huì)直接接觸WEB服務(wù)器朋沮。
- 動(dòng)靜分離,將文件直接分開(kāi)調(diào)度到不同的服務(wù)器缀壤,也可以通過(guò)客戶端調(diào)度到不同的服務(wù)器樊拓。
- 檢查后端服務(wù)器的健康狀態(tài)。
- 可以在反向代理服務(wù)器上增加緩存塘慕。
- 支持模塊化筋夏。
- 支持fastCGI和uWCGI。
sedfile:直接在內(nèi)核空間相應(yīng)用戶图呢,加快訪問(wèn)速度条篷。
Nginx框架
- 虛擬機(jī)
- 支持長(zhǎng)連接和管道連接
- 支持日志
- URL rewirte:地址重寫(xiě)
- 路徑別名
- 基于IP及用戶的訪問(wèn)
- 平滑升級(jí)骗随,可以不斷業(yè)務(wù)的升級(jí),舊的子進(jìn)程還會(huì)繼續(xù)訪問(wèn)正在連接的用戶請(qǐng)求赴叹,等待完成后才會(huì)將舊進(jìn)程停止
- 支持速率及并發(fā)數(shù)限制
- 支持Memcached的GET接口
image.png
Nginx服務(wù)的主要功能:
1.WEB服務(wù)器
2.反向代理服務(wù)器
3.負(fù)載均衡
4.fastCGI
5.動(dòng)靜分離蚊锹,根據(jù)需求調(diào)度服務(wù)器
6.安全,外網(wǎng)不會(huì)直接接觸
7.支持緩存稚瘾,可以加速訪問(wèn)
Nginx程序結(jié)構(gòu)
master/worker結(jié)構(gòu),一個(gè)master進(jìn)程至負(fù)責(zé)加載和分析配置文件姚炕,管理worker進(jìn)程摊欠,平滑升級(jí),一個(gè)或多個(gè)worker進(jìn)程處理相應(yīng)用戶請(qǐng)求
核心模塊:
http模塊柱宦、mail模塊些椒、TCP的stream模塊
第三方模塊
Nginx軟件包文件說(shuō)明
軟件包:Nginx,需要epel源
配置文件
/etc/nginx/nginx.conf:主配置文件
/etc/nginx/nginx.conf.default:默認(rèn)配置文件
/usr/sbin/nginx:主程序
/var/log/nginx:日志文件
/usr/lib64/nginx/modules:模塊目錄
/etc/nginx/conf.d/*.conf:擴(kuò)展配置文件
相關(guān)命令:
nginx:?jiǎn)?dòng)服務(wù)掸刊,測(cè)試使用
nginx -s reload或stop:用來(lái)重讀配置文件或停止服務(wù)
-T:測(cè)試并且打印到屏幕
-h:命令幫助
-c:用來(lái)檢測(cè)指定配置文件
三免糕、常用配置參數(shù)
配置文件格式
main
envents {
}
http {
server {
listen 80;
root 主目錄;
index 主頁(yè);
alias
location / {
rewrite
}
}
include ;
server{
listen 443;
}
}
mail {
mail協(xié)議相關(guān)配置段;
}
stream {
stream,tcp調(diào)度服務(wù)器相關(guān)配置段;
}
main常見(jiàn)配置
1.user:指定提供服務(wù)的用戶忧侧,默認(rèn)指定哪個(gè)用戶石窑,就用同用戶名的組
user nginx;
2.pid /PATH:定義pid文件路徑及文件名
pid /run/nginx.pid;
3.include:定義其他的擴(kuò)展配置
include /usr/share/nginx/modules/*.conf;
4.load_module file:調(diào)用模塊路徑
include /usr/share/nginx/modules/*.conf; #定義模塊路徑
性能相關(guān)配置
1.worker_processes:定義worker進(jìn)程打開(kāi)數(shù)量,通常應(yīng)該為主機(jī)CPU的物理核心數(shù)
worker_processes auto;
2.worker_cpu_affinity:將每個(gè)CPU綁定到某個(gè)CPU蚓炬,提高緩存命中率松逊,默認(rèn)不存在,CPU核心數(shù)使用二進(jìn)制使用
worker_cpu_affinity 0001 0010 0100 1000;
3.worker_priority:指定worker進(jìn)程的nice值肯夏,優(yōu)先級(jí)-20~19经宏,默認(rèn)不存在
worker_priority 0:默認(rèn)為0
ps axo pid,cmd驯击,psr烁兰,ni |grep nginx #查看進(jìn)程工作在那個(gè)cpu上
4.worker_rlimit_nofile:worker進(jìn)程所能夠打開(kāi)的文件數(shù)量上限,默認(rèn)不存在
worker_rlimit_nofiler nuber
事件驅(qū)動(dòng)相關(guān)的配置
events {
worker_connetions 1024;
}
1.worker_connetions:每個(gè)worker進(jìn)程所能打開(kāi)的最大并發(fā)連接數(shù)徊都,總的最大并發(fā)數(shù)=worker_processes*worker_connetions
worker_connetions 1024;
2.use:指明并發(fā)連接請(qǐng)求的處理方法沪斟,默認(rèn)自動(dòng)選擇最優(yōu)方法epoll,無(wú)需修改
use epoll;
3.accept_mutex:互斥暇矫,處理新的連接請(qǐng)求的方法币喧,on指由各個(gè)worker輪流處理請(qǐng)求,off指每個(gè)新請(qǐng)求到達(dá)時(shí)袱耽,都會(huì)通知所有的worker進(jìn)程杀餐,只有一個(gè)進(jìn)程可獲得連接,造成驚群朱巨,影響性能史翘,默認(rèn)on;
accept_mutex on|off;
調(diào)試和定位
1.daemon:是否以守護(hù)進(jìn)程方式運(yùn)行nginx,默認(rèn)為守護(hù)進(jìn)程的方式琼讽,若關(guān)閉則表示占用終端的方式運(yùn)行服務(wù)
daemon on|off
2.master_process:是否以master/worker模型運(yùn)行nginx必峰,默認(rèn)為on,off則不會(huì)在開(kāi)啟worker進(jìn)程钻蹬,若關(guān)閉吼蚁,則master直接提供服務(wù)
master_process on|off
3.error_log file或error_log level:定義錯(cuò)誤日志路徑,或定義日志的級(jí)別
level:debug|info|notice|warn|error|crit|alter|emerg
error_log /var/log/nginx/error.log;
server配置段
ngx_http_core_module:模塊名
1.server {}:虛擬主機(jī)
server{
listen 80问欠;
root /path;
index index.html;
......
}
2.listen:指定監(jiān)聽(tīng)端口或IP地址
listen 80肝匆;
listen IP地址:port;
listen hostname;
3.server_name:虛擬主機(jī)的名稱,表示只要可以解析顺献,那么就是在網(wǎng)頁(yè)中輸入的RUL
匹配優(yōu)先級(jí)機(jī)制從高到低:
- 字符精確匹配
- 左側(cè)*通配符
- 右側(cè)*通配符
- 正則表達(dá)式
- default_server
server_name www.lin.com web.lin.com;
server_name *.lin.com
server_name www.lin.com
server_name ~^.*\.lin\.$
4.tcp_nodelay:在長(zhǎng)連接狀態(tài)下旗国,是否啟用tcp_nodelay選項(xiàng),當(dāng)為off時(shí)注整,將延遲發(fā)送能曾,將不夠一個(gè)數(shù)據(jù)包的數(shù)據(jù)等待后面的數(shù)據(jù)一塊發(fā)送,會(huì)影響速度肿轨,默認(rèn)為ON寿冕,不延遲發(fā)送
tcp_nodelay on|off
5.sendfile:是否開(kāi)啟在內(nèi)核中封裝報(bào)文直接發(fā)送,默認(rèn)off
sendfile on|off
6.server_tokens:是否在相應(yīng)文本server首部顯示nginx的版本椒袍,商業(yè)版或自己編譯源碼可以定制顯示版本
server_tokens on|off|build|string
7.root:指定訪問(wèn)網(wǎng)站的路徑
root /var/www/html;
8.location:在server配置段為特定的路徑進(jìn)行其他的配置
在location中可以對(duì)URI進(jìn)行精確匹配或模糊匹配
=:對(duì)URI做精確匹配
^~:對(duì)URI最左側(cè)部分做匹配檢查蚂斤,不區(qū)分字符大小寫(xiě)
~:對(duì)URI做正則表達(dá)式模式匹配,區(qū)分大小寫(xiě)
~:對(duì)URI做正則表達(dá)式模式匹配槐沼,不區(qū)分字符大小寫(xiě)
不帶符號(hào):匹配起始于URL的所有的URI
匹配優(yōu)先級(jí)從高到低:
=,^~ /,不帶符號(hào)
server{
root /path;
location / {
root /path/path;
}
}
location ~ / {
alias /web/webser1; #在訪問(wèn)網(wǎng)站的根時(shí)曙蒸,相當(dāng)于訪問(wèn)/web/webser1目錄下的網(wǎng)站
}
9.alias:路徑別名,文檔映射的另一種機(jī)制岗钩,僅能夠使用在location上下文
location中的alias和root的指令意義不同
root:給定的路徑對(duì)應(yīng)于location中的uri左側(cè)的/
alias:給定的路徑對(duì)應(yīng)于location中的url右側(cè)的/
location / {
alias /web; #在訪問(wèn)網(wǎng)站的/目錄時(shí)纽窟,實(shí)際上就是訪問(wèn)/web目錄下的資源
}
10.index:定義網(wǎng)站的主頁(yè),可以定義多個(gè),若定義多個(gè)主頁(yè)格式兼吓,則誰(shuí)在前誰(shuí)優(yōu)先
index index.html index.php;
11.error_page:錯(cuò)誤頁(yè)面臂港,若輸入的頁(yè)面不存在,則可以指定錯(cuò)誤頁(yè)面
error_page 404 /錯(cuò)誤頁(yè)面;
error_page 404 =200 /錯(cuò)誤頁(yè)面; #有些瀏覽器看到錯(cuò)誤頁(yè)面會(huì)顯示瀏覽器自定義錯(cuò)誤頁(yè)面视搏,可以顯示正確代碼來(lái)確定顯示自己指定的錯(cuò)誤頁(yè)面
12.try_files:按順序檢查文件是否存在审孽,最后一個(gè)頁(yè)面必須存在,否則返回網(wǎng)頁(yè)錯(cuò)誤代碼
try_files $uri /app/$uri uri =錯(cuò)誤代碼;
server{
listen 80;
server_name www.lin.com;
root /app/web/webser1/;
index index.html;
location / {
try_files $uri /test/$uri =404; #該參數(shù)在后面指定文件不存在浑娜,則尋找后面的目錄中是否有該文件佑力,一直找到最后,若都沒(méi)有則顯示后面指定的錯(cuò)誤代碼筋遭,若沒(méi)有指定打颤,則顯示500服務(wù)器錯(cuò)誤代碼
}
}
定義客戶端請(qǐng)求相關(guān)配置
13.keepalive_timeout:設(shè)定保持連接超時(shí)時(shí)長(zhǎng)暴拄,0表示禁止長(zhǎng)連接,默認(rèn)為75s
keepalive_timeout 0;
14.keepalive_requests:設(shè)置一次長(zhǎng)連接上所允許請(qǐng)求資源的最大數(shù)量
keepalive_requests 100;
15.keepalive_diable:對(duì)那種瀏覽器禁用長(zhǎng)連接
keepalive_disble none|browser;
16.send_timeout time:兩次寫(xiě)操作之間的間隔時(shí)長(zhǎng)编饺,不是整個(gè)相應(yīng)過(guò)程的輸出時(shí)長(zhǎng)
send_timeout 10;
17.client_bady_buffer_size:用于接受每個(gè)客戶端請(qǐng)求報(bào)文的body部分緩沖區(qū)的大小乖篷,默認(rèn)16k,超出的部分將被暫存到磁盤(pán)上有client_body_temp_path參數(shù)來(lái)控制
client_bady_buffer_size 16k;
18.client_body_temp_path: 指定超過(guò)緩存區(qū)大小的部分存放位置透且,并且根據(jù)hash值32中取幾位創(chuàng)建目錄來(lái)加速訪問(wèn)撕蔼,根據(jù)16進(jìn)制數(shù)來(lái)創(chuàng)建,其中數(shù)字代表去16進(jìn)制的幾位
client_bady_temp_path path 1 2; #表示第一級(jí)目錄取1位16進(jìn)制數(shù)秽誊,第二級(jí)目錄取2位 0-f
19.limit_rate:限制相應(yīng)給客戶端的傳輸速率鲸沮,0表示不限速
limit_rate 0;
20.limit_except method {}:僅用于location,限制除了指定請(qǐng)求方法之外的其他方法
GET, HEAD, POST, PUT, DELETE养距,MKCOL, COPY, MOVE, OPTIONS, PROPFIND,PROPPATCH, LOCK, UNLOCK, PATCH
limit_except GET{ #除了GET之外的其他方法允許還有拒絕
allow 192.168.1.0/24;
deny all;
}
文件操作優(yōu)化的配置
21.aio:是否開(kāi)啟aio功能
22.directio:是否同步寫(xiě)磁盤(pán)
aio on;
directio size|off;
23.open_file_cache:是否允許緩存數(shù)據(jù)的元數(shù)據(jù)日熬,若超過(guò)則按照LRU算法管理棍厌,將最久的刪除
open_file_cache off;
open_file_cache max=N [inactive=time];
nginx可以緩存以下三種數(shù)據(jù)
1.文件元數(shù)據(jù):文件的描述符,文件大小和最近一次的修改時(shí)間
2.打開(kāi)的目錄結(jié)構(gòu)
3.沒(méi)有找到的或沒(méi)有訪問(wèn)的文件相關(guān)信息
max=N:可緩存的上限竖席,達(dá)到上限后會(huì)使用LRU算法實(shí)現(xiàn)管理
inactive=time:緩存項(xiàng)的非活動(dòng)時(shí)長(zhǎng)耘纱,在此處指定的時(shí)長(zhǎng)內(nèi)未被命中的或命中次數(shù)少于open_file_cache_min_uses指令所指定的次數(shù)的緩存項(xiàng)及非活動(dòng)項(xiàng),將被刪除
24.open_file_cache_errors:是否緩存查找時(shí)發(fā)生的文件一類的信息默認(rèn)值為off
open_file_cache_errors on|off;
25.open_file_cache_min_uses:open_file_cache指令的inactive參數(shù)指定的時(shí)長(zhǎng)內(nèi)毕荐,至少命中此處指定的次數(shù)才能被歸類為活動(dòng)項(xiàng)束析,默認(rèn)1
open_file_cache_min_uses 1;
26.open_file_cache_vaid:緩存項(xiàng)有效性的檢查頻率,默認(rèn)60
open_file_cache_valid 60;
基于IP地址的訪問(wèn)控制
ngx_http_access_module模塊
1.allow:允許訪問(wèn)
allow all|IP地址|網(wǎng)段;
2.deny:拒絕訪問(wèn)
deny all|IP地址|網(wǎng)段;
例如
location /admin { #僅允許一個(gè)IP地址進(jìn)入該目錄下憎亚,其他用戶不允許進(jìn)入
allow 192.168.1.1;
deny all;
}
基于用戶的訪問(wèn)控制员寇,使用basic機(jī)制進(jìn)行用戶認(rèn)證
ngx_http_auth_basic_module模塊
1.auth_basic定義顯示字符串
auth_basic string|off;
2.auth_basic_user_file:指定用戶認(rèn)證文件,nginx沒(méi)有專門(mén)生成賬戶密碼的命令需要使用htpasswd來(lái)實(shí)現(xiàn)
location /admin/ {
auth_basic "admin page";
auth_basic_user_file /etc/nginx/.ngxpasswd;
}
nginx基本狀態(tài)信息網(wǎng)頁(yè)
ngx_http_stub_status_module模塊
location /status {
stub_status; #必須添加第美,若需要訪問(wèn)控制蝶锋,可以根據(jù)allow和deny來(lái)控制,也可以根據(jù)用戶來(lái)控制
allow 172.16.0.1;
deny all;
}
日志格式記錄請(qǐng)求
ngx_http_log_module模塊
1.log_format:定義日志格式什往,該命令需要在http代碼段中指定扳缕,不可以在server中指定
log_format compression '$remote_addr-$remote_user [$time_local] '
'"$request" $status $bytes_sent'
'"$http_referer" "$http_user_agent" "$gzip_ratio"';
2.access_log:指定日志路徑 緩存大小 緩存時(shí)間 壓縮比
access_log /var/log/nginx/www.lin.com.access_log buffer=32k gzip=6;
3.open_log_file_cache:緩存各日志文件相關(guān)的元數(shù)據(jù)信息
用gzip方法壓縮相應(yīng)數(shù)據(jù),節(jié)約帶寬
1.gzip:關(guān)閉或關(guān)閉gzip壓縮
gzip on|off;
2.gzip_comp_level:定義壓縮級(jí)別1-9
gzip_comp_level 9;
3.gzip_disable:匹配到的客戶端瀏覽器不執(zhí)行壓縮
gzip_disable regex;#匹配條件可以使用正則表達(dá)式
4.gzip_min_length:?jiǎn)⒂脡嚎s功能的相應(yīng)報(bào)文大小閾值
gzip_min_length 100K;
5.gzip_http_version:設(shè)置啟用壓縮功能别威,協(xié)議最小版本躯舔,默認(rèn)為1.1
gzip_http_version 1.1;
6.gzip_buffers:指定支持實(shí)現(xiàn)壓縮功能緩沖區(qū)數(shù)量及每個(gè)緩沖區(qū)大小
gzip_buffers 32 4k;指定幾個(gè)搂橙,指定大小
7.gzip_types :指定僅對(duì)那些類型的資源執(zhí)行壓縮髓迎,默認(rèn)包含有text/html,不用顯示指定叛买,否則就會(huì)出錯(cuò)豺妓,可以根據(jù) /etc/mime.types或者根據(jù)nginx軟件包自帶的類型/etc/nginx/mime.types
gzip_types mime-type飒赃; #設(shè)置類型利花,不用添加text/html類型
8.gzip_vary:如果啟用壓縮,是否在相應(yīng)報(bào)文首部插入"vary:Accept-Encoding"
gzip_vary on|off;
9.gzip_proxied:nginx對(duì)于代理服務(wù)器請(qǐng)求的相應(yīng)報(bào)文载佳,在任何條件下啟用壓縮功能
gzip_proxixd off|expired|no-cache|no-store|prvate|no_last_modified|no_etag|auth|any;
off:對(duì)代理的請(qǐng)求不啟用壓縮
expired,no-cache,no-store,private:對(duì)代理服務(wù)器請(qǐng)求的相應(yīng)報(bào)文首部cache-control值任何一個(gè)炒事,啟用壓縮功能
例如
server{
listen 80;
server_name www.lin.com;
root /app/web/webser1/;
gzip on;
gzip_comp_level 9;
gzip_min_length 100k;
gzip_buffers 32 4k;
gzip_types text/plain;
}
ssl加密
ngx_http_ssl_module模塊
1.ssl:是否開(kāi)啟https功能
ssl on|off;
2.ssl_certificate:指定當(dāng)前虛擬主機(jī)使用的公鑰文件
ssl_certificate /path; #公鑰文件
3.ssl_certificate_key:指定當(dāng)前虛擬主機(jī)使用的私鑰文件
ssl_certificate_key /path; #私鑰文件
4.ssl_protocols:定義支持協(xié)議版本
ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2]; #定義支持協(xié)議版本,默認(rèn)支持后三個(gè)版本
5.ssl_session_cache:定義worker進(jìn)程是否有緩存蔫慧,緩存時(shí)每一個(gè)worker都有單獨(dú)的緩存空間挠乳,也可以多個(gè)worker公用一個(gè)共享空間
off:關(guān)閉
none:實(shí)際沒(méi)有緩存,但是會(huì)告訴客戶端可以緩存
builtin:為每個(gè)worker進(jìn)程創(chuàng)建緩存空間
shared:在各個(gè)worker之間使用一個(gè)共享的緩存
ssl_session_cache off|none|builtin:size|shared:name:size;
6.ssl_session_timeout:客戶端連接可以復(fù)用ssl_session_cache中緩存的sll參數(shù)的有效時(shí)長(zhǎng)姑躲,默認(rèn)5m
ssl_session_timeout 5m;
例如
1.生成公鑰和私鑰文件睡扬,這里使用的時(shí)自簽名證書(shū)文件
[root@vs webser1]# cd /etc/pki/tls/certs/
[root@vs certs]# make nginx.key #這里需要輸入私鑰密碼
[root@vs certs]# openssl rsa -in nginx.key -out nginx.key #解開(kāi)私鑰密碼,不然在每此啟動(dòng)服務(wù)都需要輸入密碼
[root@vs certs]# make nginx.crt #生成自簽名證書(shū)文件
[root@vs certs]# cp nginx.* /etc/nginx/conf.d/ #將證書(shū)文件復(fù)制到指定目錄下
[root@vs conf.d]# vim test.conf
server{
listen 443 ssl;
server_name www.lin.com;
root /app/web/webser1/;
index index.html;
ssl_certificate /etc/nginx/conf.d/nginx.crt;
ssl_certificate_key /etc/nginx/conf.d/nginx.key;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_session_timeout 5m;
}
rewrite:將用戶請(qǐng)求的URI基于條件匹配所描述的模式進(jìn)行檢查黍析,而后完成重定向替換
ngx_http_rewrite_module:模塊
1.rewrite:將一個(gè)URI路徑轉(zhuǎn)換成另外一個(gè)路徑
rewrite 匹配路徑 改變路徑 last|break|redirect|permanent卖怜;
last:重寫(xiě)完成后停止對(duì)當(dāng)前URI在當(dāng)前l(fā)ocation中后續(xù)的其他重寫(xiě)操作,而后對(duì)新的URI啟動(dòng)新一輪重寫(xiě)檢查阐枣,提前重啟新一輪循環(huán)
break:重寫(xiě)完成后停止對(duì)當(dāng)前URI在當(dāng)前l(fā)ocation中后續(xù)的其他重寫(xiě)操作马靠,而后直接跳轉(zhuǎn)至重寫(xiě)規(guī)則匹配塊之后的其他配置,結(jié)束循環(huán)蔼两,建議在location中使用
redirect:臨時(shí)重定向甩鳄,重寫(xiě)完成后以臨時(shí)重定向方式直接返回重寫(xiě)后新生成的新URI給客戶端,由客戶端重新發(fā)起請(qǐng)求额划,不能以http://或https://開(kāi)頭妙啃,使用相對(duì)路徑,狀態(tài)碼302
permanent:重寫(xiě)完成后以永久重定向直接返回重寫(xiě)生成的新URI給客戶端俊戳,由客戶端重新發(fā)起請(qǐng)求揖赴,狀態(tài)碼301
例如,該參數(shù)不可以重新定義root目錄
server{
listen 80;
server_name www.lin.com;
root /app/web/;
index index.html;
location /webser1 {
rewrite ^/webser1/(.*)$ /webser2/$1 break;
}
}
2.return:停止處理抑胎,并返回給客戶端指定的響應(yīng)嗎
return 500储笑;
return URL;
return 301|302 URL; #不可以寫(xiě)錯(cuò)誤代碼,錯(cuò)誤代碼則顯示后面RUL地址圆恤,不會(huì)跳轉(zhuǎn)
3.rewrite_log:是否開(kāi)啟重寫(xiě)日志突倍,發(fā)送至err_log
rewrite_log on|off;
4.set $variable value:
5.if (條件) {}: 引入新的上下文,條件滿足時(shí)盆昙,執(zhí)行配置塊中的配置指令羽历,server,location淡喜,conditi on
比較操作符
==:相等
!=:不同
~:模式匹配秕磷,區(qū)分字符大小寫(xiě)
~:模式匹配,不區(qū)分字符大小寫(xiě)
!~:模式不匹配炼团,區(qū)分大小寫(xiě)
!~:模式不匹配澎嚣,不區(qū)分字符大小寫(xiě)
文件及目錄存在性判斷:
-e疏尿,!-e:存在,包括文件易桃,目錄褥琐,軟連接
-f,!-f:文件
-d晤郑,!-d:目錄
-x敌呈,!-x:執(zhí)行
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}
if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
set $id $1;
}
if ($request_method = POST) {
return 405;
}
if ($slow) {
limit_rate 10k;
}
if ($invalid_referer) {
return 403;
}
防盜鏈技術(shù)
1.valid_referers:定義referer首部的合法可用值,不能匹配的將時(shí)非法值
none:請(qǐng)求報(bào)文沒(méi)有referer首部
blocked:請(qǐng)求報(bào)文有referer首部造寝,但無(wú)有效值
server_names:參數(shù)磕洪,其可以有值作為主機(jī)名或主機(jī)模式
arbitrary_string:任意字符串,但可使用作通配符
regular:被指定的正則表達(dá)式模式匹配到的字符串诫龙,要使用開(kāi)頭析显,例如:.magedu.com
valid_referers none block server_names *.magedu.com *.mageedu.com magedu.* mageedu.* ~\.magedu\.; #定義不被拒絕的referers首部合法
if ($invalid_referer) { #表示只要不包括上面指定的,全部都拒絕
return 403;
}
ngx_http_proxy_module代理模塊:
1.proxy_pass:匹配指定的路徑签赃,若匹配則重新定義到某個(gè)服務(wù)器谷异,可以放到location,if中
server {
...
server_name HOSTNAME;
location ~|~* /uri/ {
proxy_pass http://host; #不能加/,加上/則表示置換姊舵,相當(dāng)于alias
}
...
}
2.proxy_set_header:詳情求報(bào)文中增加內(nèi)容晰绎,因?yàn)樘砑哟碇笤⒙洌诤蠖朔?wù)器上顯示訪問(wèn)網(wǎng)站的來(lái)源全部都是代理服務(wù)器括丁,所以需要增加該內(nèi)容
1.在代理服務(wù)配置文件中設(shè)置
proxy_set_header 字段名 $remote_addr(表示客戶端地址)
2.在真是服務(wù)器上將日志格式修改
在日志格式出增增加
%{字段名}i #在日志logformat定義格式中增加即可,若需要重新定義伶选,則需要重新引用
$remote_addr #當(dāng)前面只有一個(gè)代理時(shí)
$X-Forwarded-For #當(dāng)前面不止一個(gè)代理服務(wù)器時(shí)史飞,使用該服務(wù)器
3.proxy_cache_path:定義緩存路徑,將特定數(shù)據(jù)分成兩部分仰税,數(shù)據(jù)本身放到磁盤(pán)上构资,數(shù)據(jù)名字做hash做運(yùn)算,放入內(nèi)存的表中陨簇,將hash值分成若干個(gè)段吐绵,然后根據(jù)hash的位數(shù)來(lái)分層創(chuàng)建目錄
該命令是定義,只能存放到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];
path :路徑
levels:級(jí)別
use_temp_path=on|off:是否開(kāi)啟臨時(shí)目錄
keys:指定誰(shuí)做hash值河绽,起個(gè)名稱
調(diào)用定義好的緩存
4.proxy_cache:指明調(diào)用的緩存己单,或關(guān)閉緩存功能
proxy_cache keys_zone指定的name |off
5.proxy_cache_key $request_uri :緩存中用于的鍵的內(nèi)容 ```bash
proxy_cache_key $request_uri;
6.proxy_cache_valid:定義對(duì)特定響應(yīng)碼的響應(yīng)內(nèi)容的緩存時(shí)長(zhǎng)
```bash
proxy_cache_valid 200 302 301 1h;
proxy_cache_valid any 1m;
7.proxy_cache_use_stale:在被代理的后端服務(wù)器出現(xiàn)那種情況下,可以直接使用過(guò)期相應(yīng)客戶端
proxy_cache_use_stale error|timeout|invalid_header|updating|http_500|http_502|http_503|http_504|http_403|http_404|off;
8.proxy_cache_methods:定義那些HEAD方法可以緩存默認(rèn)之后GET耙饰,HEAD
proxy_cache_methods GET HEAD;
9.proxy_hide_header:隱藏后端的一些信息纹笼,默認(rèn)隱藏
proxy_hide_header Server; #定義隱藏后端服務(wù)器特定的相應(yīng)首部
10.prixy_connect_timeout time:定義后端服務(wù)器建立連接的時(shí)長(zhǎng),不要設(shè)置太長(zhǎng)苟跪,默認(rèn)60廷痘,一般不建議超過(guò)75s
prixy_connect_timeout 60; #默認(rèn)定義與后端服務(wù)器建立連接的時(shí)長(zhǎng)蔓涧,默認(rèn)60s
11:proxy_send_timeout:把請(qǐng)求發(fā)送給后端服務(wù)器對(duì)的超時(shí)時(shí)間,默認(rèn)60s
proxy_send_timeout 60笋额;
12:proxy_read_timeout:等待后端服務(wù)器發(fā)送相應(yīng)報(bào)文的超時(shí)時(shí)長(zhǎng)元暴,默認(rèn)60s
proxy_read_timeout 60;
實(shí)例
1.定義配置文件中的緩存定義
http代碼段
proxy_cache_path /app/cache levels=1:2:2 keys_zone=cache:20m inactive=120s max_size=1g;
2.擴(kuò)展配置文件鳞陨,可以在server也可以在location昨寞,if中定義
server{
listen 80;
server_name www.lin.com;
root /app/web/webser1/;
index index.html;
location / {
proxy_pass http://192.168.1.142;
proxy_cache cache;
proxy_cache_key $request_uri;
proxy_cache_valid 200 301 302 1h;
proxy_cache_valid any 1m;
}
}
修改數(shù)據(jù)包的首部信息和尾部信息
ngx_http_headers_module模塊
1.add_header name value:首部信息
add_header server test;
2.add_trailer name value:尾部信息
add_header server test;
fastcgi模塊
Nginx默認(rèn)不支持php請(qǐng)求,需要fastcgi來(lái)發(fā)送到能處理到服務(wù)器上
代理功能可以是同構(gòu)協(xié)議厦滤,也可以是異構(gòu)協(xié)議
ngx_http_fastcgi_module模塊援岩,不支持php模塊模式的fpm,只能是單獨(dú)的php-fpm
1.fastcgi_pass address:后端fastcgi server的地址掏导,放到location if中
2.fastcgi_index name :指定默認(rèn)主頁(yè)資源
3.fastcgi_param:文件路徑
1.在后端安裝單獨(dú)的php-fpm軟件享怀,來(lái)處理php類型的網(wǎng)頁(yè)
[root@cip ~]# yum install -y php-fpm.x86_64
vim /etc/php-fpm.d/www.conf #至少修改兩處,
listen = 9000
listen.allowed_clients = 127.0.0.1,192.168.1.137
2.設(shè)置代理服務(wù)器
server{
listen 80 default_server;
server_name www.lin.com;
root /app/web/webser1/;
index index.html;
location ~ \.php {
fastcgi_pass 192.168.1.142:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /app/php$fastcgi_script_name;
include fastcgi_params;
}
}
1.在后端安裝單獨(dú)的php-fpm軟件趟咆,來(lái)處理php類型的網(wǎng)頁(yè)
[root@cip ~]# yum install -y php-fpm.x86_64
vim /etc/php-fpm.d/www.conf #至少修改兩處添瓷,
listen = 9000
listen.allowed_clients = 127.0.0.1,192.168.1.137
pm.status_path = /status
ping.path = /ping
2.設(shè)置代理服務(wù)器
server{
listen 80 default_server;
server_name www.lin.com;
root /app/web/webser1/;
index index.php index.html;
location ~ / {
fastcgi_pass 192.168.1.142:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /app/php$fastcgi_script_name;
include fastcgi_params;
}
location ~ ^/(status|ping)$ {
fastcgi_pass 192.168.1.142:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /app/php$fastcgi_script_name;
include fastcgi_params;
}
}
4.fastcgi_cache_path:定義緩存,需要在http代碼代碼段中定義
fastcgi_cache_pathpath [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];
path:緩存位置為磁盤(pán)上的文件系統(tǒng)
max_size:磁盤(pán)path路徑中用于緩存數(shù)據(jù)的緩存空間上限
levels=leves:緩存目錄的層級(jí)數(shù)量值纱,以及每一集的目錄數(shù)量
keys_zone=name:size:定義映射在內(nèi)存中的名稱以及大小
inactive=time:非活動(dòng)時(shí)長(zhǎng)
5.fastcgi_cache:調(diào)用緩存空間來(lái)緩存數(shù)據(jù)
fastcgi_cache zone|off;
6.fastcgi_cache_key:定義用作緩存項(xiàng)的key的字符串
fastcgi_cache_key $requost_uri;
7.fastcgi_cache_methods:那些請(qǐng)求方法使用緩存
fastcgi_cache_methods GET|HEAD|POST;
8.fastcgi_cache_min_uses:緩存空間的緩存項(xiàng)存在inactive定義的非活動(dòng)時(shí)間內(nèi)至少要訪問(wèn)到此處指定的次數(shù)方可被認(rèn)作活動(dòng)項(xiàng)
fastcgi_cache_min_uses number;
9.fastcgi_keep_conn:收到后端服務(wù)器相應(yīng)后鳞贷,fastcgi服務(wù)器是否關(guān)閉連接,建議啟用長(zhǎng)連接
fastcgi_keep_conn on|off;
10.fastcgi_cache_valid:不同響應(yīng)碼各自的緩存時(shí)長(zhǎng)
fastcgi_cache_valid time;
實(shí)驗(yàn):利用上面已經(jīng)搭建好的環(huán)境虐唠,來(lái)添加加速
1.在http代碼段定義fastcgi
fastcgi_cache_path /app/fastcgi levels=1:2:2 keys_zone=fastcgi:20m inactive=120s max_size=1g;
2.在server中調(diào)用定義好的fastcgi
server{
listen 80 default_server;
server_name www.lin.com;
root /app/web/webser1/;
index index.php index.html;
location ~ / {
fastcgi_pass 192.168.1.142:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /app/php$fastcgi_script_name;
include fastcgi_params;
fastcgi_cache fastcgi; #若需要關(guān)閉緩存則搀愧,直接off即可
fastcgi_cache_key $request_uri;
fastcgi_cache_min_uses 1;
fastcgi_cache_valid 200 301 302 10m;
fastcgi_cache_valid any 1m;
}
location ~ ^/(status|ping)$ {
fastcgi_pass 192.168.1.142:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /app/php$fastcgi_script_name;
include fastcgi_params;
}
}
實(shí)現(xiàn)調(diào)度功能
ngx_http_upstream_module模塊
1.upstream name {server ;server ;}:指定調(diào)度主機(jī),定義在http中
upstream name {
server IP地址 ;
server IP地址:port疆偿;
server IP地址:prot weight=2 max_conns=最大連接數(shù)咱筛,1.11.5版本之后才支持 max_fails=1(默認(rèn)選項(xiàng)為1)bakup;#增加權(quán)重
}
2.server:指定后端服務(wù)端的主機(jī)IP地址:port
upstream name {
server IP地址:port weight=1;
server IP地址:port;
}
weight=number:權(quán)重,默認(rèn)為1
max_conns:連接后端服務(wù)器最大并發(fā)活動(dòng)鏈接數(shù)杆故,1.11.5后支持
max_fails=number:失敗嘗試最大連接次數(shù)
fail_timeout=time:后端服務(wù)器標(biāo)記位不可用狀態(tài)的連接超時(shí)時(shí)長(zhǎng)迅箩,默認(rèn)10s
backup:將服務(wù)器標(biāo)記為備用,即所有服務(wù)器均不可用時(shí)才啟用
down:標(biāo)記為不可用处铛,配合ip_hash使用饲趋,實(shí)現(xiàn)灰度發(fā)布
3.ip_hash:原地址hash調(diào)度方法,根據(jù)客戶端訪問(wèn)服務(wù)器的IP地址來(lái)調(diào)度到同一臺(tái)服務(wù)器上
4.least_conn:最少連接調(diào)度算法撤蟆,當(dāng)server擁有不同的權(quán)重時(shí)奕塑,其為wlc,當(dāng)所有后端主機(jī)連接數(shù)相同時(shí)枫疆,則使用wrr爵川,適用于長(zhǎng)連接
5.hash key consistent:基于指定的key的hash表來(lái)實(shí)現(xiàn)對(duì)請(qǐng)求的調(diào)度,此處key可以直接文本息楔,變量或二者組合
作用:將請(qǐng)求分類寝贡,同一類請(qǐng)求將發(fā)布同一個(gè)upstream server扒披,使用consistent參數(shù),將使用ketama一致性hash算法圃泡,適用于后端時(shí)cache服務(wù)器碟案,比如varnish時(shí)使用
hash $request_uri consistent;
hash $remote_addr;
6.keepalive:為每一個(gè)worker進(jìn)程保留的空閑的長(zhǎng)連接數(shù)量,可節(jié)約nginx端口颇蜡,并減少連接管理的消耗
keepalive 10;
7价说、health_check[parameters];
健康狀態(tài)檢測(cè)機(jī)制;只能用于location上下文
常用參數(shù):
interval=time檢測(cè)的頻率风秤,默認(rèn)為5秒
fails=number:判定服務(wù)器不可用的失敗檢測(cè)次數(shù)鳖目;默認(rèn)為1次
passes=number:判定服務(wù)器可用的失敗檢測(cè)次數(shù);默認(rèn)為1次
uri=uri:做健康狀態(tài)檢測(cè)測(cè)試的目標(biāo)uri缤弦;默認(rèn)為/
match=NAME:健康狀態(tài)檢測(cè)的結(jié)果評(píng)估調(diào)用此處指定的match配置塊
注意:僅對(duì)nginxplus有效
8 match name { ... }
對(duì)backend server做健康狀態(tài)檢測(cè)時(shí)领迈,定義其結(jié)果判斷機(jī)制;只能用于http上下文
常用的參數(shù):
status code[ code ...]: 期望的響應(yīng)狀態(tài)碼
header HEADER[operator value]:期望存在響應(yīng)首部碍沐,也可對(duì)期望的響應(yīng)首部的值基于比較操作符和值進(jìn)行比較
body:期望響應(yīng)報(bào)文的主體部分應(yīng)該有的內(nèi)容
注意:僅對(duì)nginxplus有效
upstream backend {
server backend1.example.com route=a;
server backend2.example.com route=b;
sticky cookie srv_id expires=1h domain=.example.com path=/;
}
stream:模擬反向代理狸捅,基于tcp或udp的服務(wù)連接
ngx_stream_core_module模塊
1.stream{}:定義stream相關(guān)服務(wù),必須放到main中累提,和http同級(jí)
stream {
upstream mysqldb{
server 192.168
}
server{
listen
}
}
編譯安裝
1.獲取安裝包
2.創(chuàng)建用戶
[root@localhost ~]# useradd -r -s /sbin/nologin nginx
3.準(zhǔn)備編譯所需要的軟件包
[root@localhost nginx-1.12.2]# yum groupinstall -y "Development Tools"
[root@localhost nginx-1.12.2]# yum install -y pcre-devel openssl-devel
4.編譯
./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