1脓诡、啟動壓縮功能
ngx_http_gzip_module
用gzip方法壓縮響應(yīng)數(shù)據(jù),節(jié)約帶寬
1、gzip on | off;
啟用或禁用gzip壓縮
2凌净、gzip_comp_level level;
壓縮比由低到高:1 到9,默認(rèn):1
3搁骑、gzip_disable regex ...;
匹配到客戶端瀏覽器不執(zhí)行壓縮
4懈万、gzip_min_length length;
啟用壓縮功能的響應(yīng)報文大小閾值,也就是響應(yīng)報文達(dá)到多大后才啟用壓縮
5靶病、gzip_http_version 1.0 | 1.1;
設(shè)定啟用壓縮功能時会通,協(xié)議的最小版本,默認(rèn):1.1
6娄周、gzip_buffers number size;
支持實現(xiàn)壓縮功能時緩沖區(qū)數(shù)量及每個緩存區(qū)的大小
默認(rèn):32 4k 或16 8k
7涕侈、gzip_types mime-type ...;
指明僅對哪些類型的資源執(zhí)行壓縮操作;即壓縮過濾器
默認(rèn)包含有text/html煤辨,在配置文件中寫類型的時候不用寫上text/html裳涛,否則會出錯
8、gzip_vary on | off;
如果啟用壓縮众辨,是否在響應(yīng)報文首部插入“Vary: Accept-Encoding
9端三、gzip_proxied off | expired | no-cache | no-store | private | no_last_modified| no_etag| auth| any ...;
nginx作為代理服務(wù)器,后端的真實服務(wù)器返回的響應(yīng)報文首部含有什么時啟用壓縮功能
off:表示做為代理服務(wù)器時不啟用壓縮
expired,no-cache, no-store鹃彻,private:對代理服務(wù)器請求的響應(yīng)報文首部Cache-Control值任何一個郊闯,啟用壓縮功能
示例
vim /etc/nginx/conf.d/vhost.conf
server{
listen 80 default_server;
server_name www.a.com;
root /app/website1;
access_log /var/log/nginx/nginx-com.log compression ;
gzip on;
gzip_comp_level 9;
gzip_min_length 128; ---達(dá)到128個字節(jié)就壓縮
gzip_types text/css text/plain application/xml;
}
nginx -s reload
cp /var/log/messages-20170916 a.txt
chown nginx a.txt
在客戶端測試
[root@centos6 network-scripts]#curl -I --compressed www.a.com/a.txt
HTTP/1.1 200 OK
Server: nginx/1.10.2
Date: Thu, 26 Oct 2017 12:27:38 GMT
Content-Type: text/plain
Last-Modified: Thu, 26 Oct 2017 12:25:33 GMT
Connection: keep-alive
ETag: W/"59f1d43d-2523d9"
Content-Encoding: gzip ---表示啟用了壓縮功能
2、實現(xiàn)https
ngx_http_ssl_module模塊
1蛛株、ssl on | off;
為指定虛擬機(jī)啟用HTTPS protocol团赁,建議用listen指令代替
2、ssl_certificate file;
當(dāng)前虛擬主機(jī)使用PEM格式的證書文件
3谨履、ssl_certificate_key file;
當(dāng)前虛擬主機(jī)上與其證書匹配的私鑰文件
4欢摄、ssl_protocols[SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];支持ssl協(xié)議版本,默認(rèn)為后三個
5笋粟、ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
builtin[:size]:使用OpenSSL內(nèi)建緩存怀挠,為每worker進(jìn)程私有
[shared:name:size]:在各worker之間使用一個共享的緩存,提高緩存的命中率
6析蝴、ssl_session_timeout time;
客戶端連接可以復(fù)用ssl_session_cache中緩存的ssl參數(shù)的有效時長,默認(rèn)5m
示例
cd /etc/pki/tls/certs/
make nginx.crt
openssl rsa -in nginx.key -out nginx.key ---解密私鑰的對稱秘鑰
vim /etc/nginx/conf.d/vhost.conf
server {
listen 443 ssl; ---指定監(jiān)聽的端口和協(xié)議
server_name www.a.com;
root /app/website1;
ssl on; ---此項可以不加绿淋,因為前面已經(jīng)指定了協(xié)議嫌变,就相當(dāng)于已經(jīng)開啟了
ssl_certificate /etc/pki/tls/certs/nginx.crt; ---指明證書文件路徑
ssl_certificate_key /etc/pki/tls/certs/nginx.key; ---指明私鑰文件路徑
ssl_session_cache shared:sslcache:20m; ---在各worker之間使用一個共享的緩存,緩存大小為20M
ssl_session_timeout 10m; ---客戶端復(fù)用緩存的時間為10分鐘躬它,超過10分鐘就不可以用這個緩存了
}
nginx支持一個物理服務(wù)器上創(chuàng)建多個https的虛擬主機(jī)腾啥。這一點比apache強大,apache只支持一個https虛擬主機(jī)
3冯吓、重定向
ngx_http_rewrite_module模塊
將用戶請求的URI基于PCRE regex所描述的模式進(jìn)行檢查倘待,而后完成重定向替換
1、rewrite regex replacement [flag]
將用戶請求的URI基于regex所描述的模式進(jìn)行檢查组贺,匹配到時將其替換為replacement指定的新的URI
注意:如果在同一級配置塊中存在多個rewrite規(guī)則凸舵,那么會自上而下逐個檢查;被某條件規(guī)則替換完成后失尖,會重新一輪的替換檢查啊奄,隱含有循環(huán)機(jī)制,但不超過10次;如果超過掀潮,提示500響應(yīng)碼菇夸,[flag]所表示的標(biāo)志位用于控制此循環(huán)機(jī)制
如果replacement是以http://或https://開頭,則替換結(jié)果會直接以重定向返回給客戶端
[flag]:
last:重寫完成后停止對當(dāng)前URI在當(dāng)前l(fā)ocation中后續(xù)的其它重寫操作仪吧,而后對新的URI啟動新一輪重寫檢查庄新;提前重啟新一輪循環(huán),不建議在location中使用
break:重寫完成后停止對當(dāng)前URI在當(dāng)前l(fā)ocation中后續(xù)的其它重寫操作薯鼠,而后直接跳轉(zhuǎn)至重寫規(guī)則配置塊之后的其它配置择诈;結(jié)束循環(huán),建議在location中使用出皇,last和break客戶端發(fā)起一次請求羞芍,服務(wù)器端幫你跳轉(zhuǎn),后面兩個客戶端相當(dāng)于要發(fā)起兩次請求
redirect:臨時重定向郊艘,重寫完成后以臨時重定向方式直接返回重寫后生成的新URI給客戶端荷科,由客戶端重新發(fā)起請求;不能以http://或https://開頭暇仲,使用相對路徑步做,狀態(tài)碼:302
permanent:重寫完成后以永久重定向方式直接返回重寫后生成的新URI給客戶端,由客戶端重新發(fā)起請求奈附,狀態(tài)碼:301
2、return
return code [text];
return code URL;
return URL;
停止處理煮剧,并返回給客戶端指定的響應(yīng)碼
3斥滤、rewrite_log on | off;
是否開啟重寫日志, 發(fā)送至error_log(notice level)
4将鸵、set $variable value;
用戶自定義變量
注意:變量定義和調(diào)用都要以$開頭
5、if (condition) { ... }
引入新的上下文,條件滿足時佑颇,執(zhí)行配置塊中的配置指令顶掉;server, location
condition:
比較操作符:
== 相同
!= 不同
~:模式匹配,區(qū)分字符大小寫
~*:模式匹配挑胸,不區(qū)分字符大小寫
!~:模式不匹配痒筒,區(qū)分字符大小寫
!~*:模式不匹配,不區(qū)分字符大小寫
文件及目錄存在性判斷:
-e, !-e 存在(包括文件茬贵,目錄簿透,軟鏈接)
-f, !-f 文件
-d, !-d 目錄
-x, !-x 執(zhí)行
示例
vim /etc/nginx/conf.d/vhost.conf
server{
listen 80 default_server;
server_name www.a.com;
root /app/website1;
access_log /var/log/nginx/nginx-com.log compression ;
gzip on;
gzip_comp_level 9;
gzip_min_length 128;
gzip_types text/css text/plain application/xml;
location / {
rewrite ^/(.*)$ https://www.a.com/$1 redirect; ---表示當(dāng)訪問http下的根時就臨時重定向到https下的根 ^/(.*)$用于匹配輸入的uri,如果匹配解藻,就重定向到https根下老充,$1代表前面正則表達(dá)式匹配的內(nèi)容
}
location /zz {
rewrite ^/zz/(.*)$ /zhengzhou/$1 permanent; ---表示當(dāng)輸入的uri匹配/zz/目錄下的任何文件時就永久重定向到zhengzhou這個目錄下的前面所匹配的文件
}
location /admin {
return 302 http://www.baidu.com/; ---表示訪問/admin目錄時就跳轉(zhuǎn)至百度
return 403 'disallow'; ---表示當(dāng)訪問admin目錄時就放回一個字符串disallow
}
}
4、從哪跳轉(zhuǎn)(referer)
ngx_http_referer_module模塊
用來阻止Referer首部無有效值的請求訪問螟左,可防止盜鏈
valid_referers none|blocked|server_names|string...;
定義referer首部的合法可用值啡浊,不能匹配的將是非法值
none:請求報文首部沒有referer首部
blocked:請求報文有referer首部,但無有效值
server_names:參數(shù)胶背,其可以有值作為主機(jī)名或主機(jī)名模式巷嚣,表示本機(jī)
arbitrary_string:任意字符串,但可使用*作通配符
regular expression:被指定的正則表達(dá)式模式匹配到的字符串,要使用~開頭钳吟,例如:~.*\.magedu\.com
示例1:實現(xiàn)跳轉(zhuǎn)
準(zhǔn)備兩個虛擬主機(jī)涂籽,www.a.com和www.b.com
vim /etc/nginx/conf.d/vhost.conf
server{
listen 80 default_server;
server_name www.a.com;
root /app/website1;
access_log /var/log/nginx/nginx-com.log compression ;
gzip on;
gzip_comp_level 9;
gzip_min_length 128;
gzip_types text/css text/plain application/xml;
}
server{
listen 80 ;
server_name www.b.com;
root /app/website2;
access_log /var/log/nginx/nginx-2com.log compression ;
gzip on;
gzip_comp_level 9;
gzip_min_length 128;
gzip_types text/css text/plain application/xml;
}
vim a.html ---a.html為www.a.com主目錄下的文件
<a href=http://www.b.com> b.html </a> ---表示當(dāng)你訪問http://www.a.com/a.html時會出現(xiàn)一個超鏈接b.html,鼠標(biāo)點擊這個超鏈接就會跳轉(zhuǎn)至www.b.com
在www.b.com主目錄下準(zhǔn)備一個index.html文件砸抛,這樣訪問www.a.com時就會訪問這個文件评雌,實現(xiàn)跳轉(zhuǎn)
在b上查看日志可以發(fā)現(xiàn)從www.a.com跳轉(zhuǎn)過來的。
示例2:實現(xiàn)盜鏈
cd /app/website1
cp /usr/share/pixmaps/faces/sky.jpg a.jpg ---在www.a.com網(wǎng)站的主目錄下創(chuàng)建一個圖片文件
cd /app/website2
vim b.html
<img src=http://www.a.com/a.jpg> ---表示訪問www.b.com/b.html時就會盜取www.a.com下的圖片a.jpg
測試
http://www.b.com/b.html ---發(fā)現(xiàn)成功盜取a網(wǎng)站的圖片
示例3:如何實現(xiàn)防止盜鏈
[root@centos7 website2]#vim /etc/nginx/conf.d/vhost.conf
server{
listen 80 default_server;
server_name www.a.com;
root /app/website1;
access_log /var/log/nginx/nginx-com.log compression ;
gzip on;
gzip_comp_level 9;
gzip_min_length 128;
gzip_types text/css text/plain application/xml;
valid_referers none block server_names *.a.com ~.*\.baidu\.com; ---定義一個合法的跳轉(zhuǎn)直焙,也就是允許哪些主機(jī)跳轉(zhuǎn)
if ($invalid_referer){
return 403 ; ---表示如果是無效的跳轉(zhuǎn)就被禁止景东,返回狀態(tài)碼403
}
測試
http://www.b.com/b.html ---發(fā)現(xiàn)無法盜取www.a.com網(wǎng)站上的圖片
查看www.a.com的日志文件,發(fā)現(xiàn)被禁止奔誓,出現(xiàn)403狀態(tài)碼
5斤吐、反向代理和緩存
ngx_http_proxy_module模塊
- proxy_pass URL;
Context:location, if in location, limit_except
注意:proxy_pass后面路徑不帶uri時,會將location的uri傳遞(附加)給后端主機(jī)
vim /etc/nginx/conf.d/vhost.conf
server{
listen 80 default_server;
server_name www.a.com;
root /app/website1;
location /images {
proxy_pass http://172.18.21.106; ---當(dāng)不加/時表示當(dāng)你訪問/images目錄時就反向代理至172.18.21.106/images目錄厨喂,如果加上/表示反向代理制172.18.21.106根目錄
}
}
在172.18.21.106上查看日志我們發(fā)現(xiàn)請求是來自反向代理服務(wù)器而不是真正的客戶端和措,說明nginx做為反向代理服務(wù)器代替客戶端去訪問后面真正realserver上的資源,并將結(jié)果返回給客戶端
- 如果location定義其uri時使用了正則表達(dá)式的模式蜕煌,則proxy_pass之后必須不能使用uri,也就是不能加斜線; 用戶請求時傳遞的uri將直接附加至后端服務(wù)器之后
示例:實現(xiàn)訪問html文件時調(diào)度到一臺主機(jī)派阱、訪問jpg文件時調(diào)度到另外一臺主機(jī)
vim /etc/nginx/conf.d/vhost.conf
server{
listen 80 default_server;
server_name www.a.com;
root /app/website1;
location ~ \.html$ {
proxy_pass http://172.18.21.106; ---表示當(dāng)你訪問的是.html結(jié)尾的文件時就調(diào)度到172.18.21.106目錄下以.html結(jié)尾的文件
}
location ~ \.(jpg|png|gif){
proxy_pass http://172.18.21.7; ---當(dāng)你訪問的是.jpg|png|gif結(jié)尾的文件時就調(diào)度到172.18.21.7目錄下的響應(yīng)文件
}
}
以上可以實現(xiàn).html文件和圖片文件的分別調(diào)度,要注意的是用正則表達(dá)式匹配時斜纪,不能加后面的斜線
- proxy_set_header field value;
設(shè)定發(fā)往后端realserver的請求報文的請求首部的值
Context: http, server, location
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
請求報文的標(biāo)準(zhǔn)格式如下:
X-Forwarded-For: client1, proxy1, proxy2
示例:實現(xiàn)經(jīng)過Nginx反向代理后在后端的realserver上的日志中能個夠查看到真正的客戶端的地址
在nginx上服務(wù)器上的設(shè)置
vim /etc/nginx/conf.d/vhost.conf
server{
listen 80 default_server;
server_name www.a.com;
root /app/website1;
location ~ \.html$ {
proxy_pass http://172.18.21.106;
}
location ~ \.(jpg|png|gif)$ {
proxy_pass http://172.18.21.7;
proxy_set_header zhang-header $remote_addr;
} ---$remote_addr是客戶端的地址贫母,如果用$proxy_add_x_forwarded_for也可以文兑,這個變量表示如果Nginx反向代理服務(wù)器前面還有代理服務(wù)器,比如cdn代理腺劣,這個變量表示的是客戶端和一個一個的代理服務(wù)器的地址绿贞,zhang-header可以任意寫,是自己隨便定義的一個首部
}
nginx -s reload
在后端httpd服務(wù)器上的操作
vim /etc/httpd/conf/httpd.conf
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\"\"%{zhang-header}i\" \"%{User-Agent}i\"" combined ---在日志格式中定義調(diào)用這個請求首部
systemctl restart httpd
測試
訪問http://www.a.com/b.jpg橘原,在后端的httpd服務(wù)器上查看日志籍铁,可以看到客戶端的地址
- 緩存
1、 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];
2拒名、proxy_cache zone | off; 默認(rèn)off
指明調(diào)用的緩存,或關(guān)閉緩存機(jī)制歼冰;Context:http, server, location
3靡狞、proxy_cache_keystring;
緩存中用于“鍵”的內(nèi)容
默認(rèn)值:proxy_cache_key$scheme$proxy_host$request_uri;
4、proxy_cache_valid[code ...] time;
定義對特定響應(yīng)碼的響應(yīng)內(nèi)容的緩存時長
示例:
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
5隔嫡、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 ...
在被代理的后端服務(wù)器出現(xiàn)哪種情況下甸怕,可以真接使用過期的緩存響應(yīng)客戶端
6、proxy_cache_methods GET | HEAD | POST ...;
對哪些客戶端請求方法對應(yīng)的響應(yīng)進(jìn)行緩存腮恩,GET和HEAD方法總是被緩存
7梢杭、proxy_hide_header field;
默認(rèn)nginx在響應(yīng)報文不傳遞后端服務(wù)器的首部字段Date, Server, X-Pad, X-Accel-等,用于隱藏后端服務(wù)器特定的響應(yīng)首部
8秸滴、proxy_connect_timeout time;
定義與后端服務(wù)器建立連接的超時時長武契,如超時會出現(xiàn)502錯誤,默認(rèn)為60s荡含,一般不建議超出75s咒唆,
9、proxy_send_timeout time;
將請求發(fā)送給后端服務(wù)器的超時時長释液;默認(rèn)為60s
10全释、proxy_read_timeout time;
等待后端服務(wù)器發(fā)送響應(yīng)報文的超時時長,默認(rèn)為60s
示例
1误债、vim /etc/nginx/nginx.conf
proxy_cache_path /var/lib/nginx/tmp/pcache levels=1:2:2 keys_zone=proxycache:20m inactive=120s max_size=1g; ---注意只能定義在http浸船,不能定義在server、location寝蹈,keys_zone=proxycache:20m定義一個緩存空間的名字李命,也就是內(nèi)存中的緩存空間,大小是20M箫老, max_size=1g表示保存到磁盤上的最大空間是1g
tcp_nodelay on;
2封字、vim /etc/nginx/conf.d/vhost.conf
server{
listen 80 default_server;
server_name www.a.com;
root /app/website1;
location ~ \.html$ {
proxy_pass http://172.18.21.106;
proxy_cache proxycache; ---調(diào)用前面定義的緩存空間
proxy_cache_key $request_uri;
proxy_cache_valid 200 301 302 1h; ---定義每種狀態(tài)碼緩存的時間
proxy_cache_valid any 1m;
}
}
nginx -s reload
3、訪問、測試
http://www.a.com/a.html ---訪問之后就會有緩存
ab -c 1000 -n 10000 172.18.21.107/a.html ---測試周叮,和之前的對比辩撑,發(fā)現(xiàn)緩存之后速度提升很多
[root@centos7 pcache]#tree
.
├── 5
│ └── bd
│ └── 00
│ └── b7337bb1b8a2bfd56bccb9cecb200bd5
└── b
├── 2d
│ └── 78
│ └── 65827078a9f7ccce59632263294782db
└── 82
└── a4
└── d1546d731a9f30cc80127d57142a482b
levels=1:2:2 定義緩存的目錄結(jié)構(gòu)界斜,用于存儲客戶端訪問的資源和文件仿耽,先是對緩存的文件進(jìn)行哈希值運算,運算后是一個16進(jìn)制的數(shù)字各薇,每個16進(jìn)制代表4位二進(jìn)制项贺,如果用md5算法進(jìn)行哈希值運算,得出來是128位峭判,1:2:2代表用哈希運算后的從后至前1位16進(jìn)制數(shù)字表示1級目錄的名字开缎,2位16進(jìn)制數(shù)字代表二級目錄的名字,2位16進(jìn)制代表三級目錄的名字
每一級目錄的個數(shù)如下圖
- ngx_http_headers_module模塊
向由代理服務(wù)器響應(yīng)給客戶端的響應(yīng)報文添加自定義首部林螃,或修改指定首部的值奕删,用于向客戶端發(fā)送的響應(yīng)報文中,添加代理服務(wù)器的首部信息
1疗认、add_header name value [always];
添加自定義首部
add_header X-Via $server_addr; ---添加代理服務(wù)的地址
add_header X-Cache $upstream_cache_status;
add_header X-Accel $server_name; ---添加代理服務(wù)的FQDN名字
2完残、add_trailer name value [always];
添加自定義響應(yīng)信息的尾部
6、Nginx反向代理至php和緩存
ngx_http_fastcgi_module
轉(zhuǎn)發(fā)客戶端的請求到FastCGI服務(wù)器横漏,不支持php模塊方式
1谨设、fastcgi_pass address;
address為后端的fastcg iserver的地址,可用位置:location, if in location
2、fastcgi_index name;
fastcgi默認(rèn)的主頁資源
示例:fastcgi_index index.php;
3缎浇、fastcgi_param parameter value [if_not_empty];
設(shè)置傳遞給FastCGI服務(wù)器的參數(shù)值扎拣,可以是文本,變量或組合
示例:實現(xiàn)當(dāng)客戶端訪問的是php程序的時候就反向代理至后端的php服務(wù)器
1素跺、在php服務(wù)器上安裝php-fpm
yum install php-fpm
vim /etc/php-fpm.d/www.conf
listen = 9000
;listen.allowed_clients = 127.0.0.1 ---把這一行用分號注釋掉二蓝,默認(rèn)允許任何主機(jī)訪問
pm.status_path = /status ---打開下面這兩項就可以查看php的運行狀態(tài)
ping.path = /ping
service php-fpm start
mkdir /app/php ---創(chuàng)建一個存放php程序的根目錄
vim a.php
vim a.php
<?php
phpinfo();
?>
2、在nginx服務(wù)器上的配置
vim /etc/nginx/conf.d/vhost.conf
server{
listen 80 default_server;
server_name www.a.com;
root /app/website1;
location ~* \.php$ { ---當(dāng)匹配的uri是以.php結(jié)尾的文件時就反向代理至后端的php服務(wù)器
fastcgi_pass 172.18.21.106:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /app/php$fastcgi_script_name; ---指明后端存放php程序的目錄指厌,$fastcgi_script_name匹配的是你訪問的uri中.php文件
include fastcgi_params; ---此文件在/etc/nginx/目錄下
}
location ~* ^/(status|ping)$ { ---當(dāng)匹配的cui是status或者ping時就反向代理至后端的php服務(wù)器刊愚,可以查看php服務(wù)器的運行狀態(tài)
fastcgi_pass 172.18.21.106:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
include fastcgi_params;
}
}
nginx -s reload
3、測試
http://www.a.com/a.php ---可以發(fā)現(xiàn)連接php成功
http://www.a.com/status ---可以查看php運行狀態(tài)
http://www.a.com/ping ---當(dāng)后端的php是活著的時候會出現(xiàn)pong字樣仑乌,表示是活著的
- 實現(xiàn)fastcgi緩存
1百拓、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的緩存;
path 緩存位置為磁盤上的文件系統(tǒng)
max_size=size:磁盤path路徑中用于緩存數(shù)據(jù)的緩存空間上限
levels=levels:緩存目錄的層級數(shù)量晰甚,以及每一級的目錄數(shù)量,levels=ONE:TWO:THREE,示例:leves=1:2:2
keys_zone=name:size:k/v映射的內(nèi)存空間的名稱及大小,也就是在內(nèi)存中定義一個緩存空間的名稱和大小
inactive=time非活動時長
2衙传、fastcgi_cache zone | off;
調(diào)用指定的緩存空間來緩存數(shù)據(jù)
可用位置:http, server, location
3、fastcgi_cache_key string;
定義用作緩存項的key的字符串
示例:fastcgi_cache_key $request_rui;
4厕九、fastcgi_cache_methods GET | HEAD | POST ...;
為哪些請求方法使用緩存
5蓖捶、fastcgi_cache_min_uses number;
緩存空間中的緩存項在inactive定義的非活動時間內(nèi)至少要被訪問到此處所指定的次數(shù)方可被認(rèn)作活動項
6、fastcgi_keep_conn on | off;
收到后端服務(wù)器響應(yīng)后扁远,fastcgi服務(wù)器是否關(guān)閉連接俊鱼,建議啟用長連接
7刻像、fastcgi_cache_valid[code ...] time;
不同的響應(yīng)碼各自的緩存時長
示例
1、vim /etc/nginx/nginx.conf
fastcgi_cache_path /var/lib/nginx/tmp/fastcgicache levels=1:2:2 keys_zone=fastcgicac
he:20m inactive=120s max_size=1g; ---只能放在http位置并闲,不能放在server和location
2细睡、vim /etc/nginx/conf.d/vhost.conf
server{
listen 80 default_server;
server_name www.a.com;
root /app/website1;
location ~* \.php$ {
fastcgi_pass 172.18.21.106:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /app/php$fastcgi_script_name;
include fastcgi_params;
fastcgi_cache fastcgicache; ---調(diào)用上面定義的緩存空間
fastcgi_cache_key $request_uri;
fastcgi_cache_valid 200 301 302 1h; ---定義每種響應(yīng)碼緩存的時間
fastcgi_cache_valid any 1m;
}
3、測試
http://www.a.com/index.php ---在瀏覽器訪問后會有緩存
ab -c 100 -n 1000 172.18.21.107/a.php ---發(fā)現(xiàn)比原來的快了很多
7帝火、upstream實現(xiàn)將用戶的請求反向調(diào)度至后端的多個realserver溜徙,實現(xiàn)平衡負(fù)載
ngx_http_upstream_module模塊
用于將多個服務(wù)器定義成服務(wù)器組,而由proxy_pass, fastcgi_pass等指令進(jìn)行引用
1犀填、upstream name { ... }
定義后端服務(wù)器組趁桃,會引入一個新的上下文
默認(rèn)調(diào)度算法是wrr
Context: http
upstream httpdsrvs{
server ...
server...
...
}
2牵舱、server address [parameters];
在upstream上下文中server成員蛙埂,以及相關(guān)的參數(shù)室琢;Context:upstream
address的表示格式:
unix:/PATH/TO/SOME_SOCK_FILE
IP[:PORT]
HOSTNAME[:PORT]
parameters:
weight=number 權(quán)重,默認(rèn)為1
max_conns連接后端報務(wù)器最大并發(fā)活動連接數(shù)冕广,1.11.5后支持
max_fails=number失敗嘗試最大次數(shù)疏日;超出此處指定的次數(shù)時,server將被標(biāo)記為不可用,默認(rèn)為1
fail_timeout=time 后端服務(wù)器標(biāo)記為不可用狀態(tài)的連接超時時長佳窑,默認(rèn)10s
backup將服務(wù)器標(biāo)記為“備用”制恍,即所有服務(wù)器均不可用時才啟用
down標(biāo)記為“不可用”,配合ip_hash使用神凑,實現(xiàn)灰度發(fā)布,也就是讓服務(wù)器一部分一部分的上線
3净神、ip_hash源地址hash調(diào)度方法
4、least_conn最少連接調(diào)度算法溉委,當(dāng)server擁有不同的權(quán)重時其為wlc鹃唯,當(dāng)所有后端主機(jī)連接數(shù)相同時,則使用wrr瓣喊,適用于長連接
5坡慌、hash key [consistent]基于指定的key的hash表來實現(xiàn)對請求的調(diào)度,此處的key可以直接文本藻三、變量或二者組合
作用:將請求分類洪橘,同一類請求將發(fā)往同一個upstream server,使用consistent參數(shù)棵帽,將使用ketama一致性hash算法熄求,適用于后端是Cache服務(wù)器(如varnish)時使用
hash $request_uri consistent;訪問相同的uri調(diào)度到同一個realserver
hash $remote_addr;
6、keepalive連接數(shù)N;
為每個worker進(jìn)程保留的空閑的長連接數(shù)量,可節(jié)約nginx端口逗概,并減少連接管理的消耗
示例
vim /etc/nginx/nginx.conf
upstream webserver { ---只能定義在http處
server 172.18.21.106:80 weight=2;
server 172.18.21.7:80;
}
vim /etc/nginx/conf.d/vhost.conf
server{
listen 80 default_server;
server_name www.a.com;
root /app/website1;
location / {
proxy_pass http://webserver; ---當(dāng)訪問根時就會根據(jù)算法調(diào)度到后面的realserver上
}
}
測試
http://www.a.com/
8弟晚、實現(xiàn)基于tcp或udp的反向調(diào)度
ngx_stream_core_module模塊
模擬反代基于tcp或udp的服務(wù)連接,即工作于傳輸層的反代或調(diào)度器
ngx_stream_proxy_module模塊
可實現(xiàn)代理基于TCP,UDP (1.9.13), UNIX-domain sockets的數(shù)據(jù)流
1 proxy_pass address;
指定后端服務(wù)器地址
2 proxy_timeout timeout;
無數(shù)據(jù)傳輸時卿城,保持連接狀態(tài)的超時時長枚钓,默認(rèn)為10m
3 proxy_connect_timeout time;
設(shè)置nginx與被代理的服務(wù)器嘗試建立連接的超時時長
默認(rèn)為60s
示例:實現(xiàn)nginx反向代理mysql數(shù)據(jù)庫服務(wù)
1、在后端兩個mysql數(shù)據(jù)庫服務(wù)器上的操作
yum install mysql-server
service mysqld start
chkconfig mysqld on
mysql
create user test@'172.18.21.107' identified by 'centos'; ---在兩臺mysql服務(wù)器上都要創(chuàng)建一個用戶能夠遠(yuǎn)程連接mysql數(shù)據(jù)瑟押,在這里設(shè)定的是172.18.21.107這臺主機(jī)的test用戶可以連接搀捷,默認(rèn)root用戶是不能遠(yuǎn)程連接的。
2勉耀、在nginx服務(wù)器上的操作
vim /etc/nginx/nginx.conf ---注意要把這個語句塊放到http上面指煎,和http語句塊是平級的關(guān)系
stream{
upstream mysqlsrvs{
server 172.18.21.6:3306;
server 172.18.21.7:3306; ---兩臺rs的地址和端口
least_conn; ---指明調(diào)度算法為最小連接
}
server{
listen 172.18.21.107:3306;
proxy_pass mysqlsrvs;
proxy_timeout 60s; ---無數(shù)據(jù)傳輸時保持連接狀態(tài)的超時時長
proxy_connect_timeout 10s; ----nginx與后端rs嘗試建立連接的超時時長
}
}
nginx ----啟動服務(wù)
3蹋偏、在客戶端測試
mysql -utest -p'centos' -h'172.18.21.107' ---輸入兩次便斥,發(fā)現(xiàn)每次連接的數(shù)據(jù)庫不同,說明nginx反向調(diào)度成功
9威始、源碼編譯安裝nginx
1枢纠、安裝開發(fā)包組和響應(yīng)的軟件包、創(chuàng)建賬號
yum groupinstall "development tools"
yum install pcre-devel openssl-devel zlib-devel
useradd -r nginx -s /sbin/nologin ---創(chuàng)建一個nginx賬號
cd /app
tar xvf nginx-1.12.2.tar.gz
2黎棠、更改源碼信息晋渺,將版本信息更改
vim /app/nginx-1.12.2/src/http/ngx_http_header_filter_module.c
static u_char ngx_http_server_string[] = "Server: zhanginx" CRLF; ---表示關(guān)閉server_tokens off時顯示的版本信息
vim /app/nginx-1.12.2/src/core/nginx.h
#define NGINX_VERSION "6.66.666."
#define NGINX_VER "tengine/" NGINX_VERSION
3、執(zhí)行configure腳本脓斩,并安裝
./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 -j 4 && make install
4木西、修改PATH變量
vim /etc/profile.d/nginx.sh
PATH=/usr/local/sbin/:$PATH
. /etc/profile.d/nginx.sh
echo $PATH
5、修改配置文件随静,并啟動服務(wù)
vim /etc/nginx/nginx.conf
user nginx; ---將user改為nginx八千,否則啟動不了服務(wù)
nginx ---啟動服務(wù)
6、測試
[root@centos6 php.d]#curl -I 172.18.21.7
HTTP/1.1 200 OK
Server: tengine/6.66.666. ---發(fā)現(xiàn)版本信息已經(jīng)修改
Date: Sat, 28 Oct 2017 13:24:34 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Sat, 28 Oct 2017 13:10:09 GMT
Connection: keep-alive
ETag: "59f481b1-264"
Accept-Ranges: bytes
7燎猛、修改配置文件
vim /etc/nginx/nginx.conf
server_tokens off; ---在http語句塊中加上這條內(nèi)容
nginx -s reload
8恋捆、測試
[root@centos6 php.d]#curl -I 172.18.21.7
HTTP/1.1 200 OK
Server: zhanginx ---發(fā)現(xiàn)版本號是我們自己定義的了
Date: Sat, 28 Oct 2017 13:26:48 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Sat, 28 Oct 2017 13:10:09 GMT
Connection: keep-alive
ETag: "59f481b1-264"
Accept-Ranges: bytes
備注:
編譯安裝nginx選項:
--prefix=/etc/nginx 安裝路徑
--sbin-path=/usr/sbin/nginx 指明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 指明pid文件安裝位置
--lock-path=/var/run/nginx.lock 鎖文件安裝位置
--http-client-body-temp-path=/var/cache/nginx/client_temp
--http-proxy-temp-path=/var/cache/nginx/proxy_temp作為代理服務(wù)器,服務(wù)器響應(yīng)報文的臨時文件存放路徑
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp作為fastcgi代理服務(wù)器重绷,服務(wù)器響應(yīng)報文的臨時文件存放路徑
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp作為uwsgi代理服務(wù)器沸停,服務(wù)器響應(yīng)報文的臨時文件存放路徑
--http-scgi-temp-path=/var/cache/nginx/scgi_temp作為scgi反代服務(wù)器,服務(wù)器響應(yīng)報文的臨時文件存放路徑
--user=nginx指明以那個身份運行worker進(jìn)程昭卓,主控master進(jìn)程一般由root運行
--group=nginx
--with-http_ssl_module表示把指定模塊編譯進(jìn)來
客戶端body部分的臨時文件存放路徑愤钾,如果服務(wù)器允許客戶端使用put方法提交大數(shù)據(jù)時,臨時存放的磁盤路徑
[root@centos7 ~]#nginx -V ---使用此條命令在用yum安裝的nginx服務(wù)器上可以看到y(tǒng)um編譯安裝時候的各個選項的設(shè)置