一.I/O介紹
httpdMPM
perfork:一個master進程開啟多個子進程,master只負責讀取配置文件和生成子進程,子進程只負責處理每一個進程
worker:一個master進程開啟多個子進程,每一個子進程復制開啟多個線程,每一個線程負責相應一個請求
event:事件驅動,一個進程可以處理多個請求
??網絡IO:本質是socket讀取,數據收到請求,進入網卡,應用程序就要讀取數據就是I,用戶準備好數據,相應數據就是O,都是從socket中IO
??硬盤IO:用戶空間給內核發送指令,讓內核從磁盤讀取數據,內核將數據存入內核空間,然后賦值給用戶空間,這個過程就發生了一次硬盤IO
同步和異步:關心的是消息的通訊機制
同步:調用者自動等待被調用返回消息,才能繼續執行。
異步:被調用者通過狀態,通知回調機制,回調機制主動通知調用者被調用者的狀態。
阻塞和非阻塞:關心的是用戶是否等待
阻塞:指IO操作需要徹底完成才返回到用戶空間,調用結果返回前,調用者被掛起
非阻塞:指IO操作需要徹底完成后才返回到用戶空間,調用結果返回前,調用者不會被掛起
同步阻塞IO模型:
??用戶發送請求訪問頁面,內核解開封裝,然后內核將數據包發送給Nginx進程,Nginx查看MIME類型,然后發送指令讓內核訪問硬盤讀取數據,然后內核將數據放在緩沖區,將數據復制給進程空間,Ninx在將數據發送給用戶。缺點:CPU利用不高
PIO:CPU全程參與
DMA:只是發送指令,不直接參與
同步非阻塞IO模型
??進程發送請求,請求發送給內核,內核去磁盤中訪問數據,將數據存放在緩沖區,然后在復制到進程的內存空間,在這個過程中,進程不會等待,但是需要一次 一次來詢問,從另外一個角度看,進程來詢問請求是否完成也是一個CPU資源的浪費
IO多路復用模型
??在接受請求之前增加了一個系統條用(select只是其中一個),有系統調用來幫進程處理后面的事,系統調用程序可以同時接受多個進程訪問,但是該模型也是會阻塞,子select開始時會阻塞
應用場景:
當客戶端處理多個描述符時,一般是交互式輸入和網絡套接字
一個客戶端同時處理多個套接字
當一個TCP服務器既要處理監聽套接字,又要處理已經連接的套接字
當一個服務器既要處理TCP,又要處理UDP
-
當一個服務器要處理多個服務或多個協議
image.png
信號驅動IO模型:
??阻塞在內核到進程空間拷貝數據階段,前面的階段可以繼續執行其他操作,用戶進程通過sigaction系統注冊一個信號處理程序
異步IO模型:
??整個過程都不會阻塞,但是該模型內核比較繁忙,進程比較輕松,但是進程可以處理更多的用戶請求,所以每一個進程可以支持更多的并發鏈接
主要使用IO復用和信號驅動IO模型
主要實現:
select:Linux實現,IO復用模型,支持各種操作系統,Apache使用。
poll:Linux實現,IO復用模型,system V。
epoll:Linux實現,IO復用模型,具有信號驅動IO模型的某些特性,Nginx能夠實現高并發就是因為使用epoll。
水平觸發:如果報告進程后沒有被處理,那么下次poll還會再次報告。
邊緣觸發:只通知一次,epoll支持。
epoll:支持水平觸發和邊緣觸發,只會告訴一次,沒有并發連接限制,能打開1024(1G的內存能監聽10萬個端口)
不會隨著fd數目的增加而效率下降。
mmap():直接內存讀取,文件映射,就是將磁盤的文件直接映射到內存中來提高訪問速度。
二、Nginx基礎
Nginx主要功能:
- WEB服務器
- 反向代理
- 郵件服務器反向代理
- 基于TCP協議代理,偽4層調度器
反向代理作用:
- 負載均衡,Nginx可以通過upstream模塊實現負載均衡。
- 安全性,真正的服務器不會暴露在外網,客戶端不會直接接觸WEB服務器。
- 動靜分離,將文件直接分開調度到不同的服務器,也可以通過客戶端調度到不同的服務器。
- 檢查后端服務器的健康狀態。
- 可以在反向代理服務器上增加緩存。
- 支持模塊化。
- 支持fastCGI和uWCGI。
sedfile:直接在內核空間相應用戶,加快訪問速度。
Nginx框架
- 虛擬機
- 支持長連接和管道連接
- 支持日志
- URL rewirte:地址重寫
- 路徑別名
- 基于IP及用戶的訪問
- 平滑升級,可以不斷業務的升級,舊的子進程還會繼續訪問正在連接的用戶請求,等待完成后才會將舊進程停止
- 支持速率及并發數限制
- 支持Memcached的GET接口
image.png
Nginx服務的主要功能:
1.WEB服務器
2.反向代理服務器
3.負載均衡
4.fastCGI
5.動靜分離,根據需求調度服務器
6.安全,外網不會直接接觸
7.支持緩存,可以加速訪問
Nginx程序結構
master/worker結構,一個master進程至負責加載和分析配置文件,管理worker進程,平滑升級,一個或多個worker進程處理相應用戶請求
核心模塊:
http模塊、mail模塊、TCP的stream模塊
第三方模塊
Nginx軟件包文件說明
軟件包:Nginx,需要epel源
配置文件
/etc/nginx/nginx.conf:主配置文件
/etc/nginx/nginx.conf.default:默認配置文件
/usr/sbin/nginx:主程序
/var/log/nginx:日志文件
/usr/lib64/nginx/modules:模塊目錄
/etc/nginx/conf.d/*.conf:擴展配置文件
相關命令:
nginx:啟動服務,測試使用
nginx -s reload或stop:用來重讀配置文件或停止服務
-T:測試并且打印到屏幕
-h:命令幫助
-c:用來檢測指定配置文件
三、常用配置參數
配置文件格式
main
envents {
}
http {
server {
listen 80;
root 主目錄;
index 主頁;
alias
location / {
rewrite
}
}
include ;
server{
listen 443;
}
}
mail {
mail協議相關配置段;
}
stream {
stream,tcp調度服務器相關配置段;
}
main常見配置
1.user:指定提供服務的用戶,默認指定哪個用戶,就用同用戶名的組
user nginx;
2.pid /PATH:定義pid文件路徑及文件名
pid /run/nginx.pid;
3.include:定義其他的擴展配置
include /usr/share/nginx/modules/*.conf;
4.load_module file:調用模塊路徑
include /usr/share/nginx/modules/*.conf; #定義模塊路徑
性能相關配置
1.worker_processes:定義worker進程打開數量,通常應該為主機CPU的物理核心數
worker_processes auto;
2.worker_cpu_affinity:將每個CPU綁定到某個CPU,提高緩存命中率,默認不存在,CPU核心數使用二進制使用
worker_cpu_affinity 0001 0010 0100 1000;
3.worker_priority:指定worker進程的nice值,優先級-20~19,默認不存在
worker_priority 0:默認為0
ps axo pid,cmd,psr,ni |grep nginx #查看進程工作在那個cpu上
4.worker_rlimit_nofile:worker進程所能夠打開的文件數量上限,默認不存在
worker_rlimit_nofiler nuber
事件驅動相關的配置
events {
worker_connetions 1024;
}
1.worker_connetions:每個worker進程所能打開的最大并發連接數,總的最大并發數=worker_processes*worker_connetions
worker_connetions 1024;
2.use:指明并發連接請求的處理方法,默認自動選擇最優方法epoll,無需修改
use epoll;
3.accept_mutex:互斥,處理新的連接請求的方法,on指由各個worker輪流處理請求,off指每個新請求到達時,都會通知所有的worker進程,只有一個進程可獲得連接,造成驚群,影響性能,默認on;
accept_mutex on|off;
調試和定位
1.daemon:是否以守護進程方式運行nginx,默認為守護進程的方式,若關閉則表示占用終端的方式運行服務
daemon on|off
2.master_process:是否以master/worker模型運行nginx,默認為on,off則不會在開啟worker進程,若關閉,則master直接提供服務
master_process on|off
3.error_log file或error_log level:定義錯誤日志路徑,或定義日志的級別
level:debug|info|notice|warn|error|crit|alter|emerg
error_log /var/log/nginx/error.log;
server配置段
ngx_http_core_module:模塊名
1.server {}:虛擬主機
server{
listen 80;
root /path;
index index.html;
......
}
2.listen:指定監聽端口或IP地址
listen 80;
listen IP地址:port;
listen hostname;
3.server_name:虛擬主機的名稱,表示只要可以解析,那么就是在網頁中輸入的RUL
匹配優先級機制從高到低:
- 字符精確匹配
- 左側*通配符
- 右側*通配符
- 正則表達式
- 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:在長連接狀態下,是否啟用tcp_nodelay選項,當為off時,將延遲發送,將不夠一個數據包的數據等待后面的數據一塊發送,會影響速度,默認為ON,不延遲發送
tcp_nodelay on|off
5.sendfile:是否開啟在內核中封裝報文直接發送,默認off
sendfile on|off
6.server_tokens:是否在相應文本server首部顯示nginx的版本,商業版或自己編譯源碼可以定制顯示版本
server_tokens on|off|build|string
7.root:指定訪問網站的路徑
root /var/www/html;
8.location:在server配置段為特定的路徑進行其他的配置
在location中可以對URI進行精確匹配或模糊匹配
=:對URI做精確匹配
^~:對URI最左側部分做匹配檢查,不區分字符大小寫
~:對URI做正則表達式模式匹配,區分大小寫
~:對URI做正則表達式模式匹配,不區分字符大小寫
不帶符號:匹配起始于URL的所有的URI
匹配優先級從高到低:
=,^~ /,不帶符號
server{
root /path;
location / {
root /path/path;
}
}
location ~ / {
alias /web/webser1; #在訪問網站的根時,相當于訪問/web/webser1目錄下的網站
}
9.alias:路徑別名,文檔映射的另一種機制,僅能夠使用在location上下文
location中的alias和root的指令意義不同
root:給定的路徑對應于location中的uri左側的/
alias:給定的路徑對應于location中的url右側的/
location / {
alias /web; #在訪問網站的/目錄時,實際上就是訪問/web目錄下的資源
}
10.index:定義網站的主頁,可以定義多個,若定義多個主頁格式,則誰在前誰優先
index index.html index.php;
11.error_page:錯誤頁面,若輸入的頁面不存在,則可以指定錯誤頁面
error_page 404 /錯誤頁面;
error_page 404 =200 /錯誤頁面; #有些瀏覽器看到錯誤頁面會顯示瀏覽器自定義錯誤頁面,可以顯示正確代碼來確定顯示自己指定的錯誤頁面
12.try_files:按順序檢查文件是否存在,最后一個頁面必須存在,否則返回網頁錯誤代碼
try_files $uri /app/$uri uri =錯誤代碼;
server{
listen 80;
server_name www.lin.com;
root /app/web/webser1/;
index index.html;
location / {
try_files $uri /test/$uri =404; #該參數在后面指定文件不存在,則尋找后面的目錄中是否有該文件,一直找到最后,若都沒有則顯示后面指定的錯誤代碼,若沒有指定,則顯示500服務器錯誤代碼
}
}
定義客戶端請求相關配置
13.keepalive_timeout:設定保持連接超時時長,0表示禁止長連接,默認為75s
keepalive_timeout 0;
14.keepalive_requests:設置一次長連接上所允許請求資源的最大數量
keepalive_requests 100;
15.keepalive_diable:對那種瀏覽器禁用長連接
keepalive_disble none|browser;
16.send_timeout time:兩次寫操作之間的間隔時長,不是整個相應過程的輸出時長
send_timeout 10;
17.client_bady_buffer_size:用于接受每個客戶端請求報文的body部分緩沖區的大小,默認16k,超出的部分將被暫存到磁盤上有client_body_temp_path參數來控制
client_bady_buffer_size 16k;
18.client_body_temp_path: 指定超過緩存區大小的部分存放位置,并且根據hash值32中取幾位創建目錄來加速訪問,根據16進制數來創建,其中數字代表去16進制的幾位
client_bady_temp_path path 1 2; #表示第一級目錄取1位16進制數,第二級目錄取2位 0-f
19.limit_rate:限制相應給客戶端的傳輸速率,0表示不限速
limit_rate 0;
20.limit_except method {}:僅用于location,限制除了指定請求方法之外的其他方法
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;
}
文件操作優化的配置
21.aio:是否開啟aio功能
22.directio:是否同步寫磁盤
aio on;
directio size|off;
23.open_file_cache:是否允許緩存數據的元數據,若超過則按照LRU算法管理,將最久的刪除
open_file_cache off;
open_file_cache max=N [inactive=time];
nginx可以緩存以下三種數據
1.文件元數據:文件的描述符,文件大小和最近一次的修改時間
2.打開的目錄結構
3.沒有找到的或沒有訪問的文件相關信息
max=N:可緩存的上限,達到上限后會使用LRU算法實現管理
inactive=time:緩存項的非活動時長,在此處指定的時長內未被命中的或命中次數少于open_file_cache_min_uses指令所指定的次數的緩存項及非活動項,將被刪除
24.open_file_cache_errors:是否緩存查找時發生的文件一類的信息默認值為off
open_file_cache_errors on|off;
25.open_file_cache_min_uses:open_file_cache指令的inactive參數指定的時長內,至少命中此處指定的次數才能被歸類為活動項,默認1
open_file_cache_min_uses 1;
26.open_file_cache_vaid:緩存項有效性的檢查頻率,默認60
open_file_cache_valid 60;
基于IP地址的訪問控制
ngx_http_access_module模塊
1.allow:允許訪問
allow all|IP地址|網段;
2.deny:拒絕訪問
deny all|IP地址|網段;
例如
location /admin { #僅允許一個IP地址進入該目錄下,其他用戶不允許進入
allow 192.168.1.1;
deny all;
}
基于用戶的訪問控制,使用basic機制進行用戶認證
ngx_http_auth_basic_module模塊
1.auth_basic定義顯示字符串
auth_basic string|off;
2.auth_basic_user_file:指定用戶認證文件,nginx沒有專門生成賬戶密碼的命令需要使用htpasswd來實現
location /admin/ {
auth_basic "admin page";
auth_basic_user_file /etc/nginx/.ngxpasswd;
}
nginx基本狀態信息網頁
ngx_http_stub_status_module模塊
location /status {
stub_status; #必須添加,若需要訪問控制,可以根據allow和deny來控制,也可以根據用戶來控制
allow 172.16.0.1;
deny all;
}
日志格式記錄請求
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:指定日志路徑 緩存大小 緩存時間 壓縮比
access_log /var/log/nginx/www.lin.com.access_log buffer=32k gzip=6;
3.open_log_file_cache:緩存各日志文件相關的元數據信息
用gzip方法壓縮相應數據,節約帶寬
1.gzip:關閉或關閉gzip壓縮
gzip on|off;
2.gzip_comp_level:定義壓縮級別1-9
gzip_comp_level 9;
3.gzip_disable:匹配到的客戶端瀏覽器不執行壓縮
gzip_disable regex;#匹配條件可以使用正則表達式
4.gzip_min_length:啟用壓縮功能的相應報文大小閾值
gzip_min_length 100K;
5.gzip_http_version:設置啟用壓縮功能,協議最小版本,默認為1.1
gzip_http_version 1.1;
6.gzip_buffers:指定支持實現壓縮功能緩沖區數量及每個緩沖區大小
gzip_buffers 32 4k;指定幾個,指定大小
7.gzip_types :指定僅對那些類型的資源執行壓縮,默認包含有text/html,不用顯示指定,否則就會出錯,可以根據 /etc/mime.types或者根據nginx軟件包自帶的類型/etc/nginx/mime.types
gzip_types mime-type; #設置類型,不用添加text/html類型
8.gzip_vary:如果啟用壓縮,是否在相應報文首部插入"vary:Accept-Encoding"
gzip_vary on|off;
9.gzip_proxied:nginx對于代理服務器請求的相應報文,在任何條件下啟用壓縮功能
gzip_proxixd off|expired|no-cache|no-store|prvate|no_last_modified|no_etag|auth|any;
off:對代理的請求不啟用壓縮
expired,no-cache,no-store,private:對代理服務器請求的相應報文首部cache-control值任何一個,啟用壓縮功能
例如
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:是否開啟https功能
ssl on|off;
2.ssl_certificate:指定當前虛擬主機使用的公鑰文件
ssl_certificate /path; #公鑰文件
3.ssl_certificate_key:指定當前虛擬主機使用的私鑰文件
ssl_certificate_key /path; #私鑰文件
4.ssl_protocols:定義支持協議版本
ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2]; #定義支持協議版本,默認支持后三個版本
5.ssl_session_cache:定義worker進程是否有緩存,緩存時每一個worker都有單獨的緩存空間,也可以多個worker公用一個共享空間
off:關閉
none:實際沒有緩存,但是會告訴客戶端可以緩存
builtin:為每個worker進程創建緩存空間
shared:在各個worker之間使用一個共享的緩存
ssl_session_cache off|none|builtin:size|shared:name:size;
6.ssl_session_timeout:客戶端連接可以復用ssl_session_cache中緩存的sll參數的有效時長,默認5m
ssl_session_timeout 5m;
例如
1.生成公鑰和私鑰文件,這里使用的時自簽名證書文件
[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 #解開私鑰密碼,不然在每此啟動服務都需要輸入密碼
[root@vs certs]# make nginx.crt #生成自簽名證書文件
[root@vs certs]# cp nginx.* /etc/nginx/conf.d/ #將證書文件復制到指定目錄下
[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:將用戶請求的URI基于條件匹配所描述的模式進行檢查,而后完成重定向替換
ngx_http_rewrite_module:模塊
1.rewrite:將一個URI路徑轉換成另外一個路徑
rewrite 匹配路徑 改變路徑 last|break|redirect|permanent;
last:重寫完成后停止對當前URI在當前location中后續的其他重寫操作,而后對新的URI啟動新一輪重寫檢查,提前重啟新一輪循環
break:重寫完成后停止對當前URI在當前location中后續的其他重寫操作,而后直接跳轉至重寫規則匹配塊之后的其他配置,結束循環,建議在location中使用
redirect:臨時重定向,重寫完成后以臨時重定向方式直接返回重寫后新生成的新URI給客戶端,由客戶端重新發起請求,不能以http://或https://開頭,使用相對路徑,狀態碼302
permanent:重寫完成后以永久重定向直接返回重寫生成的新URI給客戶端,由客戶端重新發起請求,狀態碼301
例如,該參數不可以重新定義root目錄
server{
listen 80;
server_name www.lin.com;
root /app/web/;
index index.html;
location /webser1 {
rewrite ^/webser1/(.*)$ /webser2/$1 break;
}
}
2.return:停止處理,并返回給客戶端指定的響應嗎
return 500;
return URL;
return 301|302 URL; #不可以寫錯誤代碼,錯誤代碼則顯示后面RUL地址,不會跳轉
3.rewrite_log:是否開啟重寫日志,發送至err_log
rewrite_log on|off;
4.set $variable value:
5.if (條件) {}: 引入新的上下文,條件滿足時,執行配置塊中的配置指令,server,location,conditi on
比較操作符
==:相等
!=:不同
~:模式匹配,區分字符大小寫
~:模式匹配,不區分字符大小寫
!~:模式不匹配,區分大小寫
!~:模式不匹配,不區分字符大小寫
文件及目錄存在性判斷:
-e,!-e:存在,包括文件,目錄,軟連接
-f,!-f:文件
-d,!-d:目錄
-x,!-x:執行
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;
}
防盜鏈技術
1.valid_referers:定義referer首部的合法可用值,不能匹配的將時非法值
none:請求報文沒有referer首部
blocked:請求報文有referer首部,但無有效值
server_names:參數,其可以有值作為主機名或主機模式
arbitrary_string:任意字符串,但可使用作通配符
regular:被指定的正則表達式模式匹配到的字符串,要使用開頭,例如:.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:匹配指定的路徑,若匹配則重新定義到某個服務器,可以放到location,if中
server {
...
server_name HOSTNAME;
location ~|~* /uri/ {
proxy_pass http://host; #不能加/,加上/則表示置換,相當于alias
}
...
}
2.proxy_set_header:詳情求報文中增加內容,因為添加代理之后,在后端服務器上顯示訪問網站的來源全部都是代理服務器,所以需要增加該內容
1.在代理服務配置文件中設置
proxy_set_header 字段名 $remote_addr(表示客戶端地址)
2.在真是服務器上將日志格式修改
在日志格式出增增加
%{字段名}i #在日志logformat定義格式中增加即可,若需要重新定義,則需要重新引用
$remote_addr #當前面只有一個代理時
$X-Forwarded-For #當前面不止一個代理服務器時,使用該服務器
3.proxy_cache_path:定義緩存路徑,將特定數據分成兩部分,數據本身放到磁盤上,數據名字做hash做運算,放入內存的表中,將hash值分成若干個段,然后根據hash的位數來分層創建目錄
該命令是定義,只能存放到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:級別
use_temp_path=on|off:是否開啟臨時目錄
keys:指定誰做hash值,起個名稱
調用定義好的緩存
4.proxy_cache:指明調用的緩存,或關閉緩存功能
proxy_cache keys_zone指定的name |off
5.proxy_cache_key $request_uri :緩存中用于的鍵的內容 ```bash
proxy_cache_key $request_uri;
6.proxy_cache_valid:定義對特定響應碼的響應內容的緩存時長
```bash
proxy_cache_valid 200 302 301 1h;
proxy_cache_valid any 1m;
7.proxy_cache_use_stale:在被代理的后端服務器出現那種情況下,可以直接使用過期相應客戶端
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方法可以緩存默認之后GET,HEAD
proxy_cache_methods GET HEAD;
9.proxy_hide_header:隱藏后端的一些信息,默認隱藏
proxy_hide_header Server; #定義隱藏后端服務器特定的相應首部
10.prixy_connect_timeout time:定義后端服務器建立連接的時長,不要設置太長,默認60,一般不建議超過75s
prixy_connect_timeout 60; #默認定義與后端服務器建立連接的時長,默認60s
11:proxy_send_timeout:把請求發送給后端服務器對的超時時間,默認60s
proxy_send_timeout 60;
12:proxy_read_timeout:等待后端服務器發送相應報文的超時時長,默認60s
proxy_read_timeout 60;
實例
1.定義配置文件中的緩存定義
http代碼段
proxy_cache_path /app/cache levels=1:2:2 keys_zone=cache:20m inactive=120s max_size=1g;
2.擴展配置文件,可以在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;
}
}
修改數據包的首部信息和尾部信息
ngx_http_headers_module模塊
1.add_header name value:首部信息
add_header server test;
2.add_trailer name value:尾部信息
add_header server test;
fastcgi模塊
Nginx默認不支持php請求,需要fastcgi來發送到能處理到服務器上
代理功能可以是同構協議,也可以是異構協議
ngx_http_fastcgi_module模塊,不支持php模塊模式的fpm,只能是單獨的php-fpm
1.fastcgi_pass address:后端fastcgi server的地址,放到location if中
2.fastcgi_index name :指定默認主頁資源
3.fastcgi_param:文件路徑
1.在后端安裝單獨的php-fpm軟件,來處理php類型的網頁
[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.設置代理服務器
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.在后端安裝單獨的php-fpm軟件,來處理php類型的網頁
[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.設置代理服務器
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:緩存位置為磁盤上的文件系統
max_size:磁盤path路徑中用于緩存數據的緩存空間上限
levels=leves:緩存目錄的層級數量,以及每一集的目錄數量
keys_zone=name:size:定義映射在內存中的名稱以及大小
inactive=time:非活動時長
5.fastcgi_cache:調用緩存空間來緩存數據
fastcgi_cache zone|off;
6.fastcgi_cache_key:定義用作緩存項的key的字符串
fastcgi_cache_key $requost_uri;
7.fastcgi_cache_methods:那些請求方法使用緩存
fastcgi_cache_methods GET|HEAD|POST;
8.fastcgi_cache_min_uses:緩存空間的緩存項存在inactive定義的非活動時間內至少要訪問到此處指定的次數方可被認作活動項
fastcgi_cache_min_uses number;
9.fastcgi_keep_conn:收到后端服務器相應后,fastcgi服務器是否關閉連接,建議啟用長連接
fastcgi_keep_conn on|off;
10.fastcgi_cache_valid:不同響應碼各自的緩存時長
fastcgi_cache_valid time;
實驗:利用上面已經搭建好的環境,來添加加速
1.在http代碼段定義fastcgi
fastcgi_cache_path /app/fastcgi levels=1:2:2 keys_zone=fastcgi:20m inactive=120s max_size=1g;
2.在server中調用定義好的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; #若需要關閉緩存則,直接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;
}
}
實現調度功能
ngx_http_upstream_module模塊
1.upstream name {server ;server ;}:指定調度主機,定義在http中
upstream name {
server IP地址 ;
server IP地址:port;
server IP地址:prot weight=2 max_conns=最大連接數,1.11.5版本之后才支持 max_fails=1(默認選項為1)bakup;#增加權重
}
2.server:指定后端服務端的主機IP地址:port
upstream name {
server IP地址:port weight=1;
server IP地址:port;
}
weight=number:權重,默認為1
max_conns:連接后端服務器最大并發活動鏈接數,1.11.5后支持
max_fails=number:失敗嘗試最大連接次數
fail_timeout=time:后端服務器標記位不可用狀態的連接超時時長,默認10s
backup:將服務器標記為備用,即所有服務器均不可用時才啟用
down:標記為不可用,配合ip_hash使用,實現灰度發布
3.ip_hash:原地址hash調度方法,根據客戶端訪問服務器的IP地址來調度到同一臺服務器上
4.least_conn:最少連接調度算法,當server擁有不同的權重時,其為wlc,當所有后端主機連接數相同時,則使用wrr,適用于長連接
5.hash key consistent:基于指定的key的hash表來實現對請求的調度,此處key可以直接文本,變量或二者組合
作用:將請求分類,同一類請求將發布同一個upstream server,使用consistent參數,將使用ketama一致性hash算法,適用于后端時cache服務器,比如varnish時使用
hash $request_uri consistent;
hash $remote_addr;
6.keepalive:為每一個worker進程保留的空閑的長連接數量,可節約nginx端口,并減少連接管理的消耗
keepalive 10;
7、health_check[parameters];
健康狀態檢測機制;只能用于location上下文
常用參數:
interval=time檢測的頻率,默認為5秒
fails=number:判定服務器不可用的失敗檢測次數;默認為1次
passes=number:判定服務器可用的失敗檢測次數;默認為1次
uri=uri:做健康狀態檢測測試的目標uri;默認為/
match=NAME:健康狀態檢測的結果評估調用此處指定的match配置塊
注意:僅對nginxplus有效
8 match name { ... }
對backend server做健康狀態檢測時,定義其結果判斷機制;只能用于http上下文
常用的參數:
status code[ code ...]: 期望的響應狀態碼
header HEADER[operator value]:期望存在響應首部,也可對期望的響應首部的值基于比較操作符和值進行比較
body:期望響應報文的主體部分應該有的內容
注意:僅對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的服務連接
ngx_stream_core_module模塊
1.stream{}:定義stream相關服務,必須放到main中,和http同級
stream {
upstream mysqldb{
server 192.168
}
server{
listen
}
}
編譯安裝
1.獲取安裝包
2.創建用戶
[root@localhost ~]# useradd -r -s /sbin/nologin nginx
3.準備編譯所需要的軟件包
[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