Nginx-文章總綱
友情鏈接
1蒋困、基礎(chǔ)篇:ngxin 的簡(jiǎn)介葱峡,安裝,目錄說(shuō)明,配置文件詳解(理論為主)
http://www.reibang.com/p/d46dc6bce6ed
2茄猫、應(yīng)用篇:靜態(tài)部署,后端配置难述,反向代碼妻往,負(fù)載均衡,緩存集成(實(shí)操為主)
http://www.reibang.com/p/3a39e18550b5
3载碌、集群篇:集群搭建猜嘱,高可用解決方案,制作下載站點(diǎn)和用戶認(rèn)證(提升)
http://www.reibang.com/p/2e9ca678ef73
4嫁艇、模塊篇:ngx-lua的結(jié)合使用朗伶,lua基本語(yǔ)法介紹(綜合)
http://www.reibang.com/p/2e9ca678ef73
一、Nginx服務(wù)器基礎(chǔ)配置案例
1步咪、根據(jù)下面需求實(shí)現(xiàn)案例
(1)有如下訪問(wèn):
http://106.52.23.202:8081/server1/location1 訪問(wèn)的是:index_sr1_location1.html http://106.52.23.202:8081/server1/location2 訪問(wèn)的是:index_sr1_location2.html http://106.52.23.202:8082/server2/location1 訪問(wèn)的是:index_sr2_location1.html http://106.52.23.202:8082/server2/location2 訪問(wèn)的是:index_sr2_location2.html
(2)如果訪問(wèn)的資源不存在论皆, 返回自定義的404頁(yè)面
(3)將/server1和/server2的配置使用不同的配置文件分割 將文件放到/home/www/conf.d目錄下,然后使用include進(jìn)行 合并
(4)為/server1和/server2各自創(chuàng)建一個(gè)訪問(wèn)日志文件
2猾漫、準(zhǔn)備相關(guān)文件点晴,目錄如下:
3、開(kāi)始配置
(1)/usr/nginx/conf/nginx.conf 核心配置文件
##全局塊 begin##
#配置允許運(yùn)行Nginx工作進(jìn)程的用戶和用戶組
user www;
#配置運(yùn)行Nginx進(jìn)程生成的worker進(jìn)程數(shù)
worker_processes 2;
#配置Nginx服務(wù)器運(yùn)行對(duì)錯(cuò)誤日志存放的路徑
error_log logs/error.log;
#配置Nginx服務(wù)器允許時(shí)記錄Nginx的master進(jìn)程的PID:文件路徑和名稱
pid logs/nginx.pid;
#配置Nginx服務(wù)是否以守護(hù)進(jìn)程方法啟動(dòng),默認(rèn)就是以下配置
#daemon on;
###全局塊 end##
#events塊 begin##
events{
#設(shè)置Nginx網(wǎng)絡(luò)連接序列化
accept_mutex on;
#設(shè)置Nginx的worker進(jìn)程是否可以同時(shí)接收多個(gè)請(qǐng)求
multi_accept on;
#設(shè)置Nginx的worker進(jìn)程最大的連接數(shù)
worker_connections 1024;
#設(shè)置Nginx使用的事件驅(qū)動(dòng)模型
use epoll;
}
##events塊 end## ##http塊 start##
##http塊 start##
http{
#定義MIME-Type
include mime.types;
default_type application/octet-stream;
#配置允許使用sendfile方式運(yùn)輸
sendfile on;
#配置連接超時(shí)時(shí)間
keepalive_timeout 65;
#配置請(qǐng)求處理日志格式
log_format server1 '===>server1 access log';
log_format server2 '===>server2 access log';
##server塊 開(kāi)始##
include /home/www/conf.d/*.conf;
##server塊 結(jié)束##
}
##http塊 end##
(2)server1.conf
server{
#配置監(jiān)聽(tīng)端口和主機(jī)名稱
listen 8081;
server_name localhost;
#配置請(qǐng)求處理日志存放路徑
access_log /home/www/myweb/server1/logs/access.log server1;
#配置錯(cuò)誤頁(yè)面
error_page 404 /404.html;
#配置處理/server1/location1請(qǐng)求的location
location /server1/location1{
root /home/www/myweb;
index index_sr1_location1.html;
}
#配置處理/server1/location2請(qǐng)求的location
location /server1/location2{
root /home/www/myweb;
index index_sr1_location2.html;
}
#配置錯(cuò)誤頁(yè)面轉(zhuǎn)向
location = /404.html {
root /home/www/myweb;
index 404.html;
}
}
(3)server2.conf
server{
#配置監(jiān)聽(tīng)端口和主機(jī)名稱
listen 8082;
server_name localhost;
#配置請(qǐng)求處理日志存放路徑
access_log /home/www/myweb/server2/logs/access.log server2;
#配置錯(cuò)誤頁(yè)面
error_page 404 /404.html;
#配置處理/server2/location1請(qǐng)求的location
location /server2/location1{
root /home/www/myweb;
index index_sr2_location1.html;
}
#配置處理/server2/location2請(qǐng)求的location
location /server2/location2{
root /home/www/myweb;
index index_sr2_location2.html;
}
#配置錯(cuò)誤頁(yè)面轉(zhuǎn)向
location = /404.html {
root /home/www/myweb;
index 404.html;
}
}
(4)訪問(wèn)測(cè)試:
(5)測(cè)試循環(huán)實(shí)時(shí)打印日志輸出:tail -f /home/www/myweb/server2/logs/access.log
(6)可能遇到的問(wèn)題:指令輸錯(cuò)了悯周,配置文件寫(xiě)法缺胳膊少腿的
二粒督、Nginx服務(wù)操作的問(wèn)題
經(jīng)過(guò)前面的操作,我們會(huì)發(fā)現(xiàn)禽翼,如果想要啟動(dòng)屠橄、關(guān)閉或重新加載nginx配置文件,都需要先進(jìn)入到nginx
的安裝目錄的sbin目錄捐康,然后使用nginx的二進(jìn)制可執(zhí)行文件來(lái)操作仇矾,相對(duì)來(lái)說(shuō)操作比較繁瑣,這塊該如
何優(yōu)化解总?另外如果我們想把Nginx設(shè)置成隨著服務(wù)器啟動(dòng)就自動(dòng)完成啟動(dòng)操作贮匕,又該如何來(lái)實(shí)現(xiàn)?這就需
要用到以下兩種方式:
1、Nginx配置成系統(tǒng)服務(wù)
把Nginx應(yīng)用服務(wù)設(shè)置成為系統(tǒng)服務(wù)花枫,方便對(duì)Nginx服務(wù)的啟動(dòng)和停止等相關(guān)操作刻盐,具體實(shí)現(xiàn)步驟:
(1) 在/usr/lib/systemd/system目錄下添加nginx.service,內(nèi)容如下:
vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx web service
Documentation=http://nginx.org/en/docs/
After=network.target
[Service]
Type=forking
#-----------------------這塊內(nèi)容要配置自己的路徑----------------------
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c
/usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
#-----------------------這塊內(nèi)容要配置自己的路徑----------------------
PrivateTmp=true
[Install]
WantedBy=default.target
(2)添加完成后如果權(quán)限有問(wèn)題需要進(jìn)行權(quán)限設(shè)置
chmod 755 /usr/lib/systemd/system/nginx.service
(3)使用系統(tǒng)命令來(lái)操作Nginx服務(wù)
啟動(dòng): systemctl start nginx
停止: systemctl stop nginx
重啟: systemctl restart nginx
重新加載配置文件: systemctl reload nginx
查看nginx狀態(tài): systemctl status nginx
開(kāi)機(jī)啟動(dòng): systemctl enable nginx
2、Nginx命令配置到系統(tǒng)環(huán)境
(1)修改/etc/profile文件:vim /etc/profile
#在最后一行添加
export PATH=$PATH:/usr/local/nginx/sbin
(2)使之立即生效:source /etc/profile
(3)執(zhí)行nginx命令:nginx -V
三劳翰、Nginx靜態(tài)資源部署
1敦锌、Nginx靜態(tài)資源概述
上網(wǎng)去搜索訪問(wèn)資源對(duì)于我們來(lái)說(shuō)并不陌生,通過(guò)瀏覽器發(fā)送一個(gè)HTTP請(qǐng)求實(shí)現(xiàn)從客戶端發(fā)送請(qǐng)求到服務(wù)器端獲取所需要內(nèi)容后并把內(nèi)容回顯展示在頁(yè)面的一個(gè)過(guò)程佳簸。這個(gè)時(shí)候乙墙,我們所請(qǐng) 求的內(nèi)容就分為兩種類型颖变,一類是靜態(tài)資源、一類是動(dòng)態(tài)資源听想。 靜態(tài)資源即指在服務(wù)器端真實(shí)存在并且能直接拿來(lái)展示的一些文件腥刹,比如常見(jiàn)的html頁(yè)面、css文件汉买、js文件衔峰、圖 片、視頻等資源蛙粘; 動(dòng)態(tài)資源即指在服務(wù)器端真實(shí)存在但是要想獲取需要經(jīng)過(guò)一定的業(yè)務(wù)邏輯處理垫卤,根據(jù)不同的條件展示在頁(yè)面不同這 一部分內(nèi)容,比如說(shuō)報(bào)表數(shù)據(jù)展示出牧、根據(jù)當(dāng)前登錄用戶展示相關(guān)具體數(shù)據(jù)等資源穴肘;
Nginx處理靜態(tài)資源的內(nèi)容,我們需要考慮下面這幾個(gè)問(wèn)題:
(1)靜態(tài)資源的配置指令
(2)靜態(tài)資源的配置優(yōu)化
(3)靜態(tài)資源的壓縮配置指令
(4)靜態(tài)資源的緩存處理
(5)靜態(tài)資源的訪問(wèn)控制舔痕,包括跨域問(wèn)題和防盜鏈問(wèn)題
2梢褐、Nginx靜態(tài)資源的配置指令
1、listen指令
(1)listen:用來(lái)配置監(jiān)聽(tīng)端口赵讯。
語(yǔ)法 | listen address[:port] [default_server]...; |
---|---|
listen | port [default_server]...; |
默認(rèn)值 | listen *:80 | *:8000 |
位置 | server |
(2)listen的設(shè)置比較靈活,我們通過(guò)幾個(gè)例子來(lái)把常用的設(shè)置方式熟悉下:
listen 127.0.0.1:8000; // listen localhost:8000 監(jiān)聽(tīng)指 定的IP和端口
listen 127.0.0.1; 監(jiān)聽(tīng)指定IP的所有端口
listen 8000; 監(jiān)聽(tīng)指定端口上的連接
listen *:8000; 監(jiān)聽(tīng)指定端口上的連接
(3)default_server屬性是標(biāo)識(shí)符耿眉,用來(lái)將此虛擬主機(jī)設(shè)置成默認(rèn)主機(jī)边翼。所謂的默認(rèn)主機(jī)指的是如果
沒(méi)有匹配到對(duì)應(yīng)的address:port,則會(huì)默認(rèn)執(zhí)行的鸣剪。如果不指定默認(rèn)使用的是第一個(gè)server组底。
server{
listen 8080;
server_name 127.0.0.1;
location /{
root html;
index index.html;
}
}
server{
listen 8080
default_server;
server_name localhost;
default_type text/plain;
return 444 'This is a error request';
}
2、server_name指令
(1)server_name:用來(lái)設(shè)置虛擬主機(jī)服務(wù)名稱筐骇。
eg:127.0.0.1 债鸡、 localhost 、域名[www.baidu.com | www.jd.com]
語(yǔ)法 | server_name name ...; name 可以提供多個(gè)中間用空格分隔 |
---|---|
默認(rèn)值 | server_name ""; |
位置 | server |
(2)server_name的配置方式有三種
① 配置方式一:精確配置
server {
listen 80;
server_name www.xinlang.cn www.baidu.cn;
...
}
補(bǔ)充小知識(shí)點(diǎn):
hosts是一個(gè)沒(méi)有擴(kuò)展名的系統(tǒng)文件铛纬,可以用記事本等工具打開(kāi)厌均,其作用 就是將一些常用的網(wǎng)址域名與其對(duì)應(yīng)的IP地址建立一個(gè)關(guān)聯(lián)“數(shù)據(jù)庫(kù)”,當(dāng) 用戶在瀏覽器中輸入一個(gè)需要登錄的網(wǎng)址時(shí)告唆,系統(tǒng)會(huì)首先自動(dòng)從hosts文 件中尋找對(duì)應(yīng)的IP地址,一旦找到擒悬,系統(tǒng)會(huì)立即打開(kāi)對(duì)應(yīng)網(wǎng)頁(yè),如果沒(méi)有 找到,則系統(tǒng)會(huì)再將網(wǎng)址提交DNS域名解析服務(wù)器進(jìn)行IP地址的解析畜侦。
windows:C:\Windows\System32\drivers\etc
centos:/etc/hosts
vim /etc/hosts
127.0.0.1 www.xinlang.cn
127.0.0.1 www.baidu.cn
② 配置方式二:通配符配置
server_name中支持通配符"*",但需要注意的是通配符不能出現(xiàn)在域名的中間元扔,只能出現(xiàn)在首段或尾段,如:
server {
listen 80;
server_name *.itcast.cn www.itheima.*;
# www.xinlang.cn abc.xinlang.cn www.baidu.cn www.baidu.com
...
}
下面的配置就會(huì)報(bào)錯(cuò)
server {
listen 80;
server_name www.*.cn www.baidu.c*
...
}
③ 配置方式二:正則表達(dá)式配置
server_name中可以使用正則表達(dá)式夏伊,并且使用~作為正則表達(dá)式字符串的開(kāi)始標(biāo)記摇展。
代碼 | 說(shuō)明 |
---|---|
^ | 匹配搜索字符串開(kāi)始位置 |
$ | 匹配搜索字符串結(jié)束位置 |
. | 匹配除換行符\n之外的任何單個(gè)字符 |
\ | 轉(zhuǎn)義字符,將下一個(gè)字符標(biāo)記為特殊字符 |
[xyz] | 字符集溺忧,與任意一個(gè)指定字符匹配 |
[a-z] | 字符范圍咏连,匹配指定范圍內(nèi)的任何字符 |
\w | 與以下任意字符匹配 A-Z a-z 0-9 和下劃線,等效于[A-Za-z0-9_] |
\d | 數(shù)字字符匹配,等效于[0-9] |
{n} | 正好匹配n次 |
{n,} | 至少匹配n次 |
{n,m} | 匹配至少n次至多m次 * 零次或多次鲁森,等效于{0,} |
+ | 一次或多次祟滴,等效于{1,} |
? | 零次或一次,等效于{0,1} |
配置如下:
server{
listen 80;
server_name ~^www\.(\w+)\.com$;
default_type text/plain;
return 200 $1 $2 ..;
}
注意 ~后面不能加空格歌溉,括號(hào)可以取值
匹配執(zhí)行順序:由于server_name指令支持通配符和正則表達(dá)式垄懂,因此在包含多個(gè)虛擬主機(jī)的配置文件中,可能會(huì)出現(xiàn)一個(gè)名稱被多個(gè)虛擬主機(jī)的server_name匹配成功痛垛,當(dāng)遇到這種情況草慧,當(dāng)前的請(qǐng)求交給誰(shuí)來(lái)處理呢?
server{
listen 80;
server_name www.baidu.com;
default_type text/plain;
return 200 'exact_success';
}
server{
listen 80;
server_name ~^www\.\w+\.com$;
default_type text/plain;
return 200 'regex_success';
}
server{
listen 80;
server_name *.baidu.com;
default_type text/plain;
return 200 'wildcard_before_success';
}
server{
listen 80;
server_name www.baidu.*;
default_type text/plain;
return 200 'wildcard_after_success';
}
server{
listen 80
default_server;
server_name _;
default_type text/plain;
return 444 'default_server not found server';
}
輸出結(jié)論:
No1:準(zhǔn)確匹配server_name --------------輸出:exact_success
No2:通配符在開(kāi)始時(shí)匹配server_name成功 --------------輸出:regex_success
No3:通配符在結(jié)束時(shí)匹配server_name成功 --------------輸出: wildcard_before_success
No4:正則表達(dá)式匹配server_name成功 ----------------- 輸出:wildcard_after_success
No5:被默認(rèn)的default_server處理匙头,如果沒(méi)有指定默認(rèn)找第一個(gè) server ----------輸出:default_server not found server
3漫谷、location指令
server{
listen 80;
server_name localhost;
location / {
}
location /abc{
}
...
}
location:用來(lái)設(shè)置請(qǐng)求的URI
語(yǔ)法 | location [ = | ~ | ~* | ^~ |@ ] uri{...} |
---|---|
默認(rèn)值 | — |
位置 | server,location |
uri變量是待匹配的請(qǐng)求字符串,可以不包含正則表達(dá)式蹂析,也可以包含正則表達(dá)式舔示,那么nginx服務(wù)器在搜索匹配location
的時(shí)候,是先使用不包含正則表達(dá)式進(jìn)行匹配电抚,找到一個(gè)匹配度最高的一個(gè)惕稻,然后在通過(guò)包含正則表達(dá)式的進(jìn)行匹配,
如果能匹配到直接訪問(wèn)蝙叛,匹配不到俺祠,就使用剛才匹配度最高的那個(gè)location來(lái)處理請(qǐng)求。
(1)不帶符號(hào)借帘,要求必須以指定模式開(kāi)始
server {
listen 80;
server_name 127.0.0.1;
location /abc{
default_type text/plain;
return 200 "access success";
}
}
#以下訪問(wèn)都是正確的 (四個(gè))
http://192.168.200.133/abc http://192.168.200.133/abc?p1=TOM
http://192.168.200.133/abc/ http://192.168.200.133/abcdef
(2)=號(hào) : 用于不包含正則表達(dá)式的uri前锻煌,必須與指定的模式精確匹配
server {
listen 80;
server_name 127.0.0.1;
location =/abc{
default_type text/plain;
return 200 "access success";
}
}
#可以匹配到
http://192.168.200.133/abc
http://192.168.200.133/abc?p1=TOM
#匹配不到
http://192.168.200.133/abc/
http://192.168.200.133/abcdef
(3)~號(hào) : 用于表示當(dāng)前uri中包含了正則表達(dá)式,并且區(qū)分大小寫(xiě)
~*號(hào): 用于表示當(dāng)前uri中包含了正則表達(dá)式姻蚓,并且不區(qū)分大小寫(xiě)宋梧。
換句話說(shuō),如果uri包含了正則表達(dá)式狰挡,需要用上述兩個(gè)符號(hào)來(lái)標(biāo)識(shí)
server {
listen 80;
server_name 127.0.0.1;
location ~^/abc\w${
default_type text/plain;
return 200 "access success";
}
}
server {
listen 80;
server_name 127.0.0.1;
location ~*^/abc\w${
default_type text/plain;
return 200 "access success";
}
}
(4)^~: 用于不包含正則表達(dá)式的uri前捂龄,功能和不加符號(hào)的一致释涛,唯一不同的是,如果模式匹配倦沧,
那么就停止搜索其他模式了唇撬。
server {
listen 80;
server_name 127.0.0.1;
location ^~/abc{
default_type text/plain;
return 200 "access success";
}
}
4、設(shè)置請(qǐng)求資源的目錄root / alias
(1)root:設(shè)置請(qǐng)求的根目錄
語(yǔ)法 | root path; |
---|---|
默認(rèn)值 | root html; |
位置 | http展融、server窖认、location |
path為Nginx服務(wù)器接收到請(qǐng)求以后查找資源的根目錄路徑氢妈。
(2)alias:用來(lái)更改location的URI
語(yǔ)法 | alias path; |
---|---|
默認(rèn)值 | — |
位置 | location |
path為修改后的根路徑握爷。
以上兩個(gè)指令都可以來(lái)指定訪問(wèn)資源的路徑,那么這兩者之間的區(qū)別是什么?
舉例說(shuō)明:
① 在/usr/local/nginx/html目錄下創(chuàng)建一個(gè) images目錄,并在目錄下放入一張圖片mv.png圖片
location /images {
root /usr/local/nginx/html;
}
訪問(wèn)圖片的路徑為:http://192.168.200.133/images/mv.png
② 如果把root改為alias
location /images {
alias /usr/local/nginx/html;
}
再次訪問(wèn)上述地址梁丘,頁(yè)面會(huì)出現(xiàn)404的錯(cuò)誤燕偶,查看錯(cuò)誤日志會(huì)發(fā)現(xiàn)是因?yàn)榈刂凡粚?duì)喝噪,所以驗(yàn)證了:
root的處理結(jié)果是: root路徑+location路徑
/usr/local/nginx/html/images/mv.png
alias的處理結(jié)果是:使用alias路徑替換location路徑
/usr/local/nginx/html/images
需要在alias后面路徑改為:
location /images {
alias /usr/local/nginx/html/images;
}
③ 如果location路徑是以/結(jié)尾,則alias也必須是以/結(jié)尾,root沒(méi)有要求:
將上述配置修改為:
location /images/ {
alias /usr/local/nginx/html/images;
}
訪問(wèn)就會(huì)出問(wèn)題指么,查看錯(cuò)誤日志還是路徑不對(duì)酝惧,所以需要把a(bǔ)lias后面加上 /
小結(jié):
root的處理結(jié)果是: root路徑+location路徑
alias的處理結(jié)果是:使用alias路徑替換location路徑
alias是一個(gè)目錄別名的定義,root則是最上層目錄的含義伯诬。
如果location路徑是以/結(jié)尾,則alias也必須是以/結(jié)尾晚唇,root沒(méi)有要 求
5、index指令
index:設(shè)置網(wǎng)站的默認(rèn)首頁(yè)
語(yǔ)法 | index file ...; |
---|---|
默認(rèn)值 | index index.html; |
位置 | http盗似、server缺亮、location |
index后面可以跟多個(gè)設(shè)置,如果訪問(wèn)的時(shí)候沒(méi)有指定具體訪問(wèn)的資源桥言,則會(huì)依次進(jìn)行查找,找到第一個(gè)為止葵礼。
舉例說(shuō)明:
location / {
root /usr/local/nginx/html;
index index.html index.htm;
}
訪問(wèn)該location的時(shí)候号阿,可以通過(guò) http://ip:port/,地址后面如果 不添加任何內(nèi)容鸳粉,則默認(rèn)依次訪問(wèn)index.html和index.htm扔涧,找到第一 個(gè)來(lái)進(jìn)行返回
6、error_page指令
error_page:設(shè)置網(wǎng)站的錯(cuò)誤頁(yè)面
語(yǔ)法 | error_page code ... [=[response]] uri; |
---|---|
默認(rèn)值 | — |
位置 | http届谈、server枯夜、location...... |
當(dāng)出現(xiàn)對(duì)應(yīng)的響應(yīng)code后,如何來(lái)處理艰山。
舉例說(shuō)明:
(1)可以指定具體跳轉(zhuǎn)的地址
server {
error_page 404 http://www.baidu.cn;
}
(2)可以指定重定向地址
server{
error_page 404 /50x.html;
error_page 500 502 503 504 /50x.html;
location =/50x.html{
root html;
}
}
(3)使用location的@符合完成錯(cuò)誤信息展示
server{
error_page 404 @jump_to_error;
location @jump_to_error {
default_type text/plain;
return 404 'Not Found Page...';
}
}
可選項(xiàng)=[response]的作用是用來(lái)將相應(yīng)代碼更改為另外一個(gè)
server{
error_page 404 =200 /50x.html;
location =/50x.html{
root html;
}
}
這樣的話湖雹,當(dāng)返回404找不到對(duì)應(yīng)的資源的時(shí)候,在瀏覽器上可以看到曙搬, 最終返回的狀態(tài)碼是200摔吏,這塊需要注意下鸽嫂,
編寫(xiě)error_page后面的內(nèi) 容,404后面需要加空格征讲,200前面不能加空格
3据某、靜態(tài)資源優(yōu)化配置語(yǔ)法
Nginx對(duì)靜態(tài)資源如何進(jìn)行優(yōu)化配置。這里從三個(gè)屬性配置進(jìn)行優(yōu)化:
sendfile on;
tcp_nopush on;
tcp_nodeplay on;
(1)sendfile诗箍,用來(lái)開(kāi)啟高效的文件傳輸模式
語(yǔ)法 | sendfile on |off; |
---|---|
默認(rèn)值 | sendfile off; |
位置 | http癣籽、server、location... |
請(qǐng)求靜態(tài)資源的過(guò)程:客戶端通過(guò)網(wǎng)絡(luò)接口向服務(wù)端發(fā)送請(qǐng)求滤祖,操作系統(tǒng)將這些客戶端的請(qǐng)求傳遞給服務(wù)器端應(yīng)用程序筷狼,服務(wù)器端應(yīng)用程序會(huì)處理這些請(qǐng)求,請(qǐng)求處理完成以后氨距,操作系統(tǒng)還需要將處理得到的結(jié)果通過(guò)網(wǎng)絡(luò)適配器傳遞回去桑逝。
如:
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html;
}
}
在html目錄下有一個(gè)welcome.html頁(yè)面俏让,
訪問(wèn)地址:http://192.168.200.133/welcome.html
圖解:
(2)tcp_nopush:該指令必須在sendfile打開(kāi)的狀態(tài)下才會(huì)生效楞遏,主要是用來(lái)提升網(wǎng)絡(luò)包的傳輸'效率'
語(yǔ)法 | tcp_nopush on|off; |
---|---|
默認(rèn)值 | tcp_nopush off; |
位置 | http、server首昔、location |
(3)tcp_nodelay:該指令必須在keep-alive連接開(kāi)啟的情況下才生效寡喝,來(lái)提高網(wǎng)絡(luò)包傳輸?shù)?實(shí)時(shí)性'
語(yǔ)法 | tcp_nodelay on|off; |
---|---|
默認(rèn)值 | tcp_nodelay on; |
位置 | http、server勒奇、location |
(4)小結(jié):
經(jīng)過(guò)剛才的分析预鬓,"tcp_nopush"和”tcp_nodelay“看起來(lái)是"互斥的",那么為什么要將這兩個(gè)值都打開(kāi)赊颠,這個(gè)大家需要知道的是在linux2.5.9以后的版本中兩者是可以兼容的格二,三個(gè)指令都開(kāi)啟的好處是,sendfile可以開(kāi)啟高效的文件傳輸模式竣蹦,tcp_nopush開(kāi)啟可以確保在發(fā)送到客戶端之前數(shù)據(jù)包已經(jīng)充分“填滿”顶猜, 這大大減少了網(wǎng)絡(luò)開(kāi)銷(xiāo),并加快了文件發(fā)送的速度痘括。 然后长窄,當(dāng)它到達(dá)最后一個(gè)可能因?yàn)闆](méi)有“填滿”而暫停的數(shù)據(jù)包時(shí),Nginx會(huì)忽略tcp_nopush參數(shù)纲菌, 然后挠日,tcp_nodelay強(qiáng)制套接字發(fā)送數(shù)據(jù)。由此可知翰舌,TCP_NOPUSH可以與TCP_NODELAY一起設(shè)置嚣潜,它比單獨(dú)配置TCP_NODELAY具有更強(qiáng)的性能。所以我們可以使用如下配置來(lái)優(yōu)化Nginx靜態(tài)資源的處理
sendfile on;
tcp_nopush on;
tcp_nodelay on;
4椅贱、Nginx靜態(tài)資源壓縮實(shí)戰(zhàn)
經(jīng)過(guò)上述內(nèi)容的優(yōu)化郑原,我們?cè)俅嗡伎家粋€(gè)問(wèn)題唉韭,假如在滿足上述優(yōu)化的前提下,我們傳送一個(gè)1M的數(shù)據(jù)和一個(gè)10M的數(shù)據(jù)那個(gè)效率高?犯犁,答案顯而易見(jiàn)属愤,傳輸內(nèi)容小,速度就會(huì)快酸役。那么問(wèn)題又來(lái)了住诸,同樣的內(nèi)容,如果把大小降下來(lái)涣澡,我們腦袋里面要蹦出一個(gè)詞就是"壓縮"贱呐,接下來(lái),我們來(lái)學(xué)習(xí)Nginx的靜態(tài)資源壓縮模塊入桂。
在Nginx的配置文件中可以通過(guò)配置gzip來(lái)對(duì)靜態(tài)資源進(jìn)行壓縮奄薇,相關(guān)的指令可以配置在http塊、
server塊和location塊中抗愁,Nginx可以通過(guò)
ngx_http_gzip_module模塊
ngx_http_gzip_static_module模塊
ngx_http_gunzip_module模塊
1馁蒂、Gzip模塊配置指令
下面的壓縮指令都來(lái)自ngx_http_gzip_module模塊,該模塊會(huì)在nginx安裝的時(shí)候內(nèi)置到nginx的安裝環(huán)境中蜘腌,
也就是說(shuō)我們可以直接使用這些指令沫屡。
(1) gzip指令:該指令用于開(kāi)啟或者關(guān)閉gzip功能
語(yǔ)法 | gzip on|off; |
---|---|
默認(rèn)值 | gzip off; |
位置 | http、server沮脖、location... |
注意只有該指令為打開(kāi)狀態(tài),下面的指令才有效果
http{
gzip on;
}
(2)gzip_types指令:該指令可以根據(jù)響應(yīng)頁(yè)的MIME類型選擇性地開(kāi)啟 Gzip壓縮功能
語(yǔ)法 | gzip_types mime-type ...; |
---|---|
默認(rèn)值 | gzip_types text/html; |
位置 | http芯急、server勺届、location |
所選擇的值可以從mime.types文件中進(jìn)行查找,也可以使用"*"代表所有娶耍。
http{
gzip_types application/javascript;
}
(3)gzip_comp_level指令:該指令用于設(shè)置Gzip壓縮程度免姿,級(jí)別從1-9, 1表示要是程度最低,要是效率最高伺绽,9剛好相反,壓縮程度最高嗜湃,但是效率最低最費(fèi)時(shí)間奈应。
語(yǔ)法 | gzip_comp_level level; |
---|---|
默認(rèn)值 | gzip_comp_level 1; |
位置 | http、server购披、location |
http{
gzip_comp_level 6;
}
(4)gzip_vary指令:該指令用于設(shè)置使用Gzip進(jìn)行壓縮發(fā)送是否攜帶“Vary:Accept-Encoding”頭域的響應(yīng)頭部杖挣。主要是告訴接收方,所發(fā)送的數(shù)據(jù)經(jīng)過(guò)了Gzip壓縮處理
語(yǔ)法 | gzip_vary on|off; |
---|---|
默認(rèn)值 | gzip_vary off; |
位置 | http刚陡、server惩妇、location |
(5)gzip_buffers指令:該指令用于處理請(qǐng)求壓縮的緩沖區(qū)數(shù)量和大小
語(yǔ)法 | gzip_buffers number size; |
---|---|
默認(rèn)值 | gzip_buffers 32 4k|16 8k; |
位置 | http株汉、server、location |
其中numbe:指定Nginx服務(wù)器向系統(tǒng)申請(qǐng)緩存空間個(gè)數(shù)歌殃,size指的是每個(gè)緩存空間的大小乔妈。主要實(shí)現(xiàn)的是申請(qǐng)
number個(gè)每個(gè)大小為size的內(nèi)存空間。這個(gè)值的設(shè)定一般會(huì)和服務(wù)器的操作系統(tǒng)有關(guān)氓皱,所以建議此項(xiàng)不設(shè)置路召,
使用默認(rèn)值即可
gzip_buffers 4 16K; #緩存空間大小
(6)gzip_disable指令:針對(duì)不同種類客戶端發(fā)起的請(qǐng)求,可以選擇性地開(kāi)啟和關(guān)閉Gzip功能波材。
語(yǔ)法 | gzip_disable regex ...; |
---|---|
默認(rèn)值 | — |
位置 | http股淡、server、location |
regex:根據(jù)客戶端的瀏覽器標(biāo)志(user-agent)來(lái)設(shè)置廷区,支持使用正則表達(dá)式唯灵。指定的瀏覽器標(biāo)志不使用Gzip.
該指令一般是用來(lái)排除一些明顯不支持Gzip的瀏覽器。
gzip_disable "MSIE [1-6]\.";
(7)gzip_http_version指令:針對(duì)不同的HTTP協(xié)議版本隙轻,可以選擇性地開(kāi)啟和關(guān)閉Gzip功能
語(yǔ)法 | gzip_http_version 1.0|1.1; |
---|---|
默認(rèn)值 | gzip_http_version 1.1; |
位置 | http埠帕、server、location |
該指令是指定使用Gzip的HTTP最低版本大脉,該指令一般采用默認(rèn)值即可
(8)gzip_min_length指令:該指令針對(duì)傳輸數(shù)據(jù)的大小搞监,可以選擇性地開(kāi)啟和關(guān)閉Gzip功能
語(yǔ)法 | gzip_min_length length; |
---|---|
默認(rèn)值 | gzip_min_length 20; |
位置 | http、server镰矿、location |
nignx計(jì)量大小的單位:bytes[字節(jié)] / kb[千字節(jié)] / M[兆] 例如: 1024 / 10k|K / 10m|M
Gzip壓縮功能對(duì)大數(shù)據(jù)的壓縮效果明顯琐驴,但是如果要壓縮的數(shù)據(jù)比較小的化,可能出現(xiàn)越壓縮數(shù)據(jù)量越大的情況秤标,
因此我們需要根據(jù)響應(yīng)內(nèi)容的大小來(lái)決定是否使用Gzip功能绝淡,響應(yīng)頁(yè)面的大小可以通過(guò)頭信息中的
Content-Length來(lái)獲取。但是如何使用了Chunk編碼動(dòng)態(tài)壓縮苍姜,該指令將被忽略牢酵。建議設(shè)置為1K或以上。
(9)gzip_proxied指令:該指令設(shè)置是否對(duì)服務(wù)端返回的結(jié)果進(jìn)行Gzip壓縮
語(yǔ)法 | gzip_proxied off|expired|no-cache| no-store|private|no_last_modified|no_etag|auth|any; |
---|---|
默認(rèn)值 | gzip_proxied off; |
位置 | http衙猪、server馍乙、location |
off - 關(guān)閉Nginx服務(wù)器對(duì)后臺(tái)服務(wù)器返回結(jié)果的Gzip壓縮 expired - 啟用壓縮,如果header頭中包含 "Expires" 頭信息
no-cache - 啟用壓縮垫释,如果header頭中包含 "Cache-Control:no-cache" 頭信息 no-store - 啟用壓縮丝格,如果header頭中
包含 "Cache-Control:no-store" 頭信息 private -啟用壓縮,如果header頭中包含 "Cache-Control:private" 頭信息
no_last_modified - 啟用壓縮,如果header頭中不包含 "Last-Modified"頭信息 no_etag - 啟用壓縮 ,如果header頭中不包
含 "ETag" 頭信息 auth - 啟用壓縮 , 如果header頭中包含 "Authorization" 頭信息 any - 無(wú)條件啟用壓縮
2棵譬、案例:Gzip壓縮功能的配置
gzip on; #開(kāi)啟gzip功能
gzip_types *; #壓縮源文件類型,根據(jù)具體的訪問(wèn)資源類型設(shè)定
gzip_comp_level 6; #gzip壓縮級(jí)別
gzip_min_length 1024; #進(jìn)行壓縮響應(yīng)頁(yè)面的最小長(zhǎng)度,
content- length gzip_buffers 4 16K; #緩存空間大小
gzip_http_version 1.1; #指定壓縮響應(yīng)所需要的最低HTTP請(qǐng)求版本
gzip_vary on; #往頭信息中添加壓縮標(biāo)識(shí)
gzip_disable "MSIE [1-6]\."; #對(duì)IE6以下的版本都不進(jìn)行壓縮
gzip_proxied off显蝌; #nginx作為反向代理壓縮服務(wù)端返回?cái)?shù)據(jù)的條件
這些配置在很多地方可能都會(huì)用到,所以我們可以將這些內(nèi)容抽取到一個(gè)配置文件中订咸,然后通過(guò)include指令把
配置文件再次加載到nginx.conf 配置文件中曼尊,方法使用酬诀。
① 待引入文件:nginx_gzip.conf:
gzip on; gzip_types *;
gzip_comp_level 6;
gzip_min_length 1024;
gzip_buffers 4 16K;
gzip_http_version 1.1;
gzip_vary on;
gzip_disable "MSIE [1-6]\.";
gzip_proxied off;
② nginx.conf:
include nginx_gzip.conf
3、Gzip和sendfile的共存問(wèn)題
前面在講解sendfile的時(shí)候骆撇,提到過(guò)瞒御,開(kāi)啟sendfile以后,在讀取磁盤(pán)上的靜態(tài)資源文件的時(shí)候艾船,可以減少拷貝的次數(shù)葵腹,
可以不經(jīng)過(guò)用戶進(jìn)程將靜態(tài)文件通過(guò)網(wǎng)絡(luò)設(shè)備發(fā)送出去,但是Gzip要想對(duì)資源壓縮屿岂,是需要經(jīng)過(guò)用戶進(jìn)程進(jìn)行操作的践宴。所以如何解決兩個(gè)設(shè)置的共存問(wèn)題。
可以使用 ngx_http_gzip_static_module模塊的gzip_static指令來(lái)解決爷怀。
gzip_static指令
gzip_static: 檢查與訪問(wèn)資源同名的.gz文件時(shí)阻肩,response中以gzip相關(guān)的header返回.gz文件的內(nèi)容
語(yǔ)法 | gzip_static on | off | always; |
---|---|
默認(rèn)值 | gzip_static off; |
位置 | http、server运授、location |
添加上述命令后烤惊,會(huì)報(bào)一個(gè)錯(cuò)誤,unknown directive吁朦,"gzip_static"主要的原因是Nginx默認(rèn)是沒(méi)有添加
ngx_http_gzip_static_module模塊柒室。
★:具體實(shí)現(xiàn)步驟
步驟一:查詢當(dāng)前Nginx的配置參數(shù),nginx -V
步驟二:將nginx安裝目錄下sbin目錄中的nginx二進(jìn)制文件進(jìn)行更名
cd /usr/local/nginx/sbin
mv nginx nginxold
步驟三:進(jìn)入Nginx的安裝目錄逗宜,cd /root/nginx/core/nginx-1.16.1
步驟四:執(zhí)行make clean清空之前編譯的內(nèi)容雄右,make clean
步驟五:使用configure來(lái)配置參數(shù),./configure --with-http_gzip_static_module
步驟六:使用make命令進(jìn)行編譯纺讲,make
步驟七:將objs目錄下的nginx二進(jìn)制執(zhí)行文件移動(dòng)到nginx安裝目錄下的sbin目錄中
mv objs/nginx /usr/local/nginx/sbin
步驟八:執(zhí)行更新命令擂仍,make upgrade
5、靜態(tài)資源的緩存處理
1熬甚、什么是緩存
緩存(cache),原始意義是指訪問(wèn)速度比一般隨機(jī)存取存儲(chǔ)器(RAM) 快的一種高速存儲(chǔ)器乡括,通常它不像系統(tǒng)主存那樣使用DRAM技術(shù)肃廓,而使用昂 貴但較快速的SRAM技術(shù)。緩存的設(shè)置是所有現(xiàn)代計(jì)算機(jī)系統(tǒng)發(fā)揮高性能的 重要因素之一诲泌。
2盲赊、什么是web緩存
Web緩存是指一個(gè)Web資源(如html頁(yè)面,圖片档礁,js角钩,數(shù)據(jù)等)存在于 Web服務(wù)器和客戶端(瀏覽器)之間的副本吝沫。緩存會(huì)根據(jù)進(jìn)來(lái)的請(qǐng)求保存 輸出內(nèi)容的副本呻澜;當(dāng)下一個(gè)請(qǐng)求來(lái)到的時(shí)候递礼,如果是相同的URL,緩存會(huì) 根據(jù)緩存機(jī)制決定是直接使用副本響應(yīng)訪問(wèn)請(qǐng)求羹幸,還是向源服務(wù)器再次發(fā) 送請(qǐng)求脊髓。比較常見(jiàn)的就是瀏覽器會(huì)緩存訪問(wèn)過(guò)網(wǎng)站的網(wǎng)頁(yè),當(dāng)再次訪問(wèn)這 個(gè)URL地址的時(shí)候栅受,如果網(wǎng)頁(yè)沒(méi)有更新将硝,就不會(huì)再次下載網(wǎng)頁(yè),而是直接 使用本地緩存的網(wǎng)頁(yè)屏镊。只有當(dāng)網(wǎng)站明確標(biāo)識(shí)資源已經(jīng)更新依疼,瀏覽器才會(huì)再 次下載網(wǎng)頁(yè)
3、web緩存的種類
客戶端緩存
?????瀏覽器緩存
服務(wù)端緩存
?????Nginx / Redis / Memcached等
4而芥、瀏覽器緩存
為了節(jié)約網(wǎng)絡(luò)的資源加速瀏覽律罢,瀏覽器在用戶磁盤(pán)上對(duì)最近請(qǐng)求過(guò)的文 檔進(jìn)行存儲(chǔ),當(dāng)訪問(wèn)者再次請(qǐng)求這個(gè)頁(yè)面時(shí)棍丐,瀏覽器就可以從本地磁盤(pán)顯 示文檔误辑,這樣就可以加速頁(yè)面的閱覽.
5、為什么要用瀏覽器緩存
成本最低的一種緩存實(shí)現(xiàn)
減少網(wǎng)絡(luò)帶寬消耗
降低服務(wù)器壓力
減少網(wǎng)絡(luò)延遲歌逢,加快頁(yè)面打開(kāi)速度
6巾钉、瀏覽器緩存的執(zhí)行流程
HTTP協(xié)議中和頁(yè)面緩存相關(guān)的字段,我們先來(lái)認(rèn)識(shí)下:
header | 說(shuō)明 |
---|---|
Expires | 緩存過(guò)期的日期和時(shí)間 |
Cache-Control | 設(shè)置和緩存相關(guān)的配置信息 |
Last-Modified | 請(qǐng)求資源最后修改時(shí)間 |
ETag | 請(qǐng)求變量的實(shí)體標(biāo)簽的當(dāng)前值秘案,比如文件的MD5值 |
(1)用戶首次通過(guò)瀏覽器發(fā)送請(qǐng)求到服務(wù)端獲取數(shù)據(jù)砰苍,客戶端是沒(méi)有對(duì)應(yīng)的緩存,所以需要發(fā)送request請(qǐng)求來(lái)獲取數(shù)據(jù)踏烙;
(2)服務(wù)端接收到請(qǐng)求后师骗,獲取服務(wù)端的數(shù)據(jù)及服務(wù)端緩存的允許后,返回200的成功狀態(tài)碼并且在響應(yīng)頭上附上對(duì)
應(yīng)資源以及緩存信息讨惩;
(3)當(dāng)用戶再次訪問(wèn)相同資源的時(shí)候辟癌,客戶端會(huì)在瀏覽器的緩存目錄中查找是否存在響應(yīng)的緩存文件
(4)如果沒(méi)有找到對(duì)應(yīng)的緩存文件,則走(2)步
(5)如果有緩存文件荐捻,接下來(lái)對(duì)緩存文件是否過(guò)期進(jìn)行判斷黍少,過(guò)期的判斷標(biāo)準(zhǔn)是(Expires)
(6)如果沒(méi)有過(guò)期,則直接從本地緩存中返回?cái)?shù)據(jù)進(jìn)行展示
(7)如果Expires過(guò)期处面,接下來(lái)需要判斷緩存文件是否發(fā)生過(guò)變化
(8)判斷的標(biāo)準(zhǔn)有兩個(gè)厂置,一個(gè)是ETag(Entity Tag),一個(gè)是Last-Modified
(9)判斷結(jié)果是未發(fā)生變化,則服務(wù)端返回304魂角,直接從緩存文件中獲取數(shù)據(jù)
(10)如果判斷是發(fā)生了變化昵济,重新從服務(wù)端獲取數(shù)據(jù),并根據(jù)緩存協(xié)商(服務(wù)端所設(shè)置的是否需要進(jìn)行緩
存數(shù)據(jù)的設(shè)置)來(lái)進(jìn)行數(shù)據(jù)緩存。
7访忿、瀏覽器緩存相關(guān)指令
1瞧栗、expires指令
expires:該指令用來(lái)控制頁(yè)面緩存的作用『C可以通過(guò)該指令控制HTTP應(yīng)答中的“Expires"和”Cache-Control"
time:可以整數(shù)也可以是負(fù)數(shù)迹恐,指定過(guò)期時(shí)間,如果是負(fù)數(shù)卧斟,Cache?Control則為no-cache,如果為整數(shù)或0殴边,則Cache-Control的值為max?age=time;
epoch: 指定Expires的值為'1 January,1970,00:00:01 GMT'(1970-01-0100:00:00),Cache-Control的值no-cache
max:指定Expires的值為'31 December2037 23:59:59GMT' (2037-12-31 23:59:59) 珍语,Cache-Control的值為10年
off:默認(rèn)不緩存
2锤岸、add_header指令
add_header指令是用來(lái)添加指定的響應(yīng)頭和響應(yīng)值。
Cache-Control作為響應(yīng)頭信息板乙,可以設(shè)置如下值:
緩存響應(yīng)指令:
6能耻、Nginx的跨域問(wèn)題解決
1、同源策略
瀏覽器的同源策略:是一種約定亡驰,是瀏覽器最核心也是最基本的安全功能晓猛,如果瀏覽器少了同源策略,則瀏覽器的
正常功能可能都會(huì)受到影響凡辱。
同源: 協(xié)議戒职、域名(IP)、端口相同即為同源
http://192.168.200.131/user/1
https://192.168.200.131/user/1
http://192.168.200.131/user/1
http://192.168.200.132/user/1
http://192.168.200.131/user/1
http://192.168.200.131:8080/user/1
http://www.nginx.com/user/1
http://www.nginx.org/user/1
http://192.168.200.131/user/1
http://192.168.200.131:8080/user/1
// 以上幾組都不滿足透乾,以下一組滿足
http://www.nginx.org:80/user/1
http://www.nginx.org/user/1
2洪燥、跨域問(wèn)題:
有兩臺(tái)服務(wù)器分別為A,B,如果從服務(wù)器A的頁(yè)面發(fā)送異步請(qǐng)求到服務(wù)器B獲 取數(shù)據(jù),如果服務(wù)器A和服務(wù)器B不滿足
同源策略乳乌,則就會(huì)出現(xiàn)跨域問(wèn)題捧韵。
3、解決方案:
使用add_header指令汉操,該指令可以用來(lái)添加一些頭信息
此處用來(lái)解決跨域問(wèn)題再来,需要添加兩個(gè)頭信息,一個(gè)是Access- Control-Allow-Origin , Access-Control-Allow-Methods
Access-Control-Allow-Origin: 直譯過(guò)來(lái)是允許跨域訪問(wèn)的源地址信息磷瘤,可以配置多個(gè)(多個(gè)用逗號(hào)分隔)芒篷,也可以
使用*代表所有源
Access-Control-Allow-Methods:直譯過(guò)來(lái)是允許跨域訪問(wèn)的請(qǐng)求方式,值可以為 GET POST PUT DELETE...,
可以全部設(shè)置采缚,也可以根據(jù)需要設(shè)置针炉,多個(gè)用逗號(hào)分隔
具體配置方式
location /getUser{
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE;
default_type application/json;
return 200 '{"id":1,"name":"TOM","age":18}';
}
7、靜態(tài)資源防盜鏈
1扳抽、什么是資源盜鏈
資源盜鏈指的是此內(nèi)容不在自己服務(wù)器上篡帕,而是通過(guò)技術(shù)手段殖侵,繞過(guò)別人的限制將別人的內(nèi)容放到自己頁(yè)面上
最終展示給用戶。以此來(lái)盜取大網(wǎng)站的空間和流量镰烧。簡(jiǎn)而言之就是用別人的東西成就自己的網(wǎng)站愉耙。
比如準(zhǔn)備一個(gè)頁(yè)面引用京東和百度的圖片
從上面的效果,可以看出來(lái)拌滋,下面的圖片地址添加了防止盜鏈的功能急波,
京東這邊我們可以直接使用其圖片熊榛。
2黑界、Nginx防盜鏈的實(shí)現(xiàn)原理:
了解防盜鏈的原理之前讥此,我們得先學(xué)習(xí)一個(gè)HTTP的頭信息Referer,當(dāng)瀏覽器向web服務(wù)器發(fā)送請(qǐng)求的時(shí)候撼嗓,
一般都會(huì)帶上Referer,來(lái)告訴瀏覽器該網(wǎng)頁(yè)是從哪個(gè)頁(yè)面鏈接過(guò)來(lái)的所袁。
后臺(tái)服務(wù)器可以根據(jù)獲取到的這個(gè)Referer信息來(lái)判斷是否為自己信任的網(wǎng)站地址监婶,如果是則放行繼續(xù)訪問(wèn)屉佳,如果不是
則可以返回403(服務(wù)端拒絕訪問(wèn))的狀態(tài)信息览芳。
在本地模擬上述的服務(wù)器效果:
Nginx防盜鏈的具體實(shí)現(xiàn):
valid_referers:nginx會(huì)通就過(guò)查看referer自動(dòng)和valid_referers后面的內(nèi)容進(jìn)行匹配斜姥,如果匹配到了就將$invalid_referer
變量置0,如果沒(méi)有匹配到沧竟,則將$invalid_referer變量置為1铸敏,匹配的過(guò)程中不區(qū)分大小寫(xiě)。
none: 如果Header中的Referer為空悟泵,允許訪問(wèn)
blocked:在Header中的Referer不為空杈笔,但是該值被防火墻或代理進(jìn)行偽裝過(guò),如不帶"http://" 糕非、"https://"等協(xié)議頭的資源允許訪問(wèn)蒙具。
server_names:指定具體的域名或者IP
string: 可以支持正則表達(dá)式和*的字符串。如果是正則表達(dá)式朽肥,需要以~開(kāi)頭表示禁筏,例如
location ~*\.(png|jpg|gif){
valid_referers none blocked www.baidu.com
192.168.200.222
*.example.com example.*
www.example.org
~\.google\.;
if ($invalid_referer){
return 403;
}
root /usr/local/nginx/html;
}
針對(duì)目錄進(jìn)行防盜鏈:
location /images {
valid_referers none
blocked www.baidu.com
192.168.200.222
*.example.com example.*
www.example.org ~\.google\.;
if ($invalid_referer){
return 403;
}root /usr/local/nginx/html;
}
8、Rewrite 功能配置
Rewrite是Nginx服務(wù)器提供的一個(gè)重要基本功能衡招,是Web服務(wù)器產(chǎn)品中幾乎必備的功能篱昔。主要的作用是用來(lái)實(shí)現(xiàn)
URL的重寫(xiě)。注意:Nginx服務(wù)器的Rewrite功能的實(shí)現(xiàn)依賴于PCRE的支持始腾,因此在編譯安裝Nginx服務(wù)器之前旱爆,
需要安裝PCRE庫(kù)。Nginx使用的是 ngx_http_rewrite_module模塊來(lái)解析和處理Rewrite功能的相關(guān)配置窘茁。
"地址重寫(xiě)"與"地址轉(zhuǎn)發(fā)"區(qū)別
1怀伦、地址重寫(xiě)瀏覽器地址會(huì)發(fā)生變化而地址轉(zhuǎn)發(fā)則不變
2、一次地址重寫(xiě)會(huì)產(chǎn)生兩次請(qǐng)求而一次地址轉(zhuǎn)發(fā)只會(huì)產(chǎn)生一次請(qǐng)求
3山林、地址重寫(xiě)到的頁(yè)面必須是一個(gè)完整的路徑而地址轉(zhuǎn)發(fā)則不需要
4房待、地址重寫(xiě)因?yàn)槭莾纱握?qǐng)求所以request范圍內(nèi)屬性不能傳遞給新頁(yè)面而地址轉(zhuǎn)發(fā)因?yàn)槭且淮握?qǐng)求所以可以傳遞值
5邢羔、地址轉(zhuǎn)發(fā)速度快于地址重寫(xiě)
1、set指令
該指令用來(lái)設(shè)置一個(gè)新的變量桑孩。
variable:變量的名稱拜鹤,該變量名稱要用"$"作為變量的第一個(gè)字符,且不能與Nginx服務(wù)器預(yù)設(shè)的全局變量同名流椒。
value:變量的值敏簿,可以是字符串、其他變量或者變量的組合等宣虾。
2惯裕、Rewrite常用全局變量
3、if指令
該指令用來(lái)支持條件判斷绣硝,并根據(jù)條件判斷結(jié)果選擇不同的Nginx配置蜻势。
condition為判定條件,可以支持以下寫(xiě)法:
- 變量名鹉胖。如果變量名對(duì)應(yīng)的值為空或者是0握玛,if都判斷為false,其他條
件為true。
if ($param){
}
- 使用"="和"!="比較變量和字符串是否相等甫菠,滿足條件為true挠铲,不滿 足為false
if ($request_method = POST){
return 405;
}
注意:此處和Java不太一樣的地方是字符串不需要添加引號(hào)。
windown dos命令 發(fā)送POS請(qǐng)求
curl -X POST http://192.168.200.122:8081/testif
- 使用正則表達(dá)式對(duì)變量進(jìn)行匹配寂诱,匹配成功返回true市殷,否則返回false。變量與正則表達(dá)式之間使用
"~","~*","!~","!~*"來(lái)連接刹衫。
"~"代表匹配正則表達(dá)式過(guò)程中區(qū)分大小寫(xiě)醋寝,
"~*"代表匹配正則表達(dá)式過(guò)程中不區(qū)分大小寫(xiě)
"!~"和"!~*"剛好和上面取相反值,如果匹配上返回false,匹配不上返回true
if ($http_user_agent ~ MSIE){
#$http_user_agent的值中是否包含MSIE字符串带迟,如果包含返回 true
}
注意:正則表達(dá)式字符串一般不需要加引號(hào)音羞,但是如果字符串中包含"}"或者是";"等字符時(shí),
就需要把引號(hào)加上仓犬。
- 判斷請(qǐng)求的文件是否存在使用"-f"和"!-f",
當(dāng)使用"-f"時(shí)嗅绰,如果請(qǐng)求的文件存在返回true,不存在返回false搀继。當(dāng)使用"!f"時(shí)窘面,如果請(qǐng)求文件不存在,
但該文件所在目錄存在返回 true,文件和目錄都不存在返回false,如果文件存在返回false
if (-f $request_filename){
#判斷請(qǐng)求的文件是否存在
}
if (!-f $request_filename){
#判斷請(qǐng)求的文件是否不存在
}
判斷請(qǐng)求的目錄是否存在使用"-d"和"!-d"
當(dāng)使用"-d"時(shí)叽躯,如果請(qǐng)求的目錄存在财边,if返回true,如果目錄不存在則返回false
當(dāng)使用"!-d"時(shí)点骑,如果請(qǐng)求的目錄不存在但該目錄的上級(jí)目錄存在則返回true酣难,該目錄和它上級(jí)目錄都不存在則返回false,如果請(qǐng)求目錄存在也返回false.判斷請(qǐng)求的目錄或者文件是否存在使用"-e"和"!-e"
當(dāng)使用"-e",如果請(qǐng)求的目錄或者文件存在時(shí)谍夭,if返回true,否則返回 false.
當(dāng)使用"!-e",如果請(qǐng)求的文件和文件所在路徑上的目錄都不存在返回 true,否則返回false判斷請(qǐng)求的文件是否可執(zhí)行使用"-x"和"!-x"
當(dāng)使用"-x",如果請(qǐng)求的文件可執(zhí)行,if返回true,否則返回false
當(dāng)使用"!-x",如果請(qǐng)求文件不可執(zhí)行憨募,返回true,否則返回false
4紧索、break指令
該指令用于中斷當(dāng)前相同作用域中的其他Nginx配置。與該指令處于同一作用域的Nginx配置中菜谣,位于它前面的指令
配置生效珠漂,位于后面的指令配置無(wú)效。
location /{
if ($param){
set $id $1;
break;
limit_rate 10k;
}
}
5尾膊、return指令
該指令用于完成對(duì)請(qǐng)求的處理媳危,直接向客戶端返回響應(yīng)狀態(tài)代碼。在 return后的所有Nginx配置都是無(wú)效的眯停。
code:為返回給客戶端的HTTP狀態(tài)代理∏湓螅可以返回的狀態(tài)代碼為0~999的任意HTTP狀態(tài)代理
text:為返回給客戶端的響應(yīng)體內(nèi)容莺债,支持變量的使用
URL:為返回給客戶端的URL地址
6、rewrite指令
該指令通過(guò)正則表達(dá)式的使用來(lái)改變URI签夭∑氚睿可以同時(shí)存在一個(gè)或者多個(gè)指令,按照順序依次對(duì)URL進(jìn)行匹配和處理第租。
URL和URI的區(qū)別:
1措拇、URI:統(tǒng)一資源標(biāo)識(shí)符
2、URL:統(tǒng)一資源定位符
regex:用來(lái)匹配URI的正則表達(dá)式
replacement:匹配成功后慎宾,用于替換URI中被截取內(nèi)容的字符串丐吓。如果
該字符串是以"http://"或者"https://"開(kāi)頭的,則不會(huì)繼續(xù)向下對(duì)URI進(jìn)行
其他處理趟据,而是直接返回重寫(xiě)后的URI給客戶端券犁。
flag:用來(lái)設(shè)置rewrite對(duì)URI的處理行為,可選值有如下:
last:
break
redirect
permanent
7汹碱、rewrite_log指令
該指令配置是否開(kāi)啟URL重寫(xiě)日志的輸出功能粘衬。
9、Rewrite 的案例
1咳促、域名跳轉(zhuǎn)
先來(lái)看案例稚新,如果我們想訪問(wèn)京東網(wǎng)站,大家都知道我們可以輸入 www.jd.com ,但是同樣的我們也可以輸入www.360buy.com同樣也都能訪問(wèn)到京東網(wǎng)站跪腹。這個(gè)其實(shí)是因?yàn)榫〇|剛開(kāi)始的時(shí)候域名就是www.360.buy.com褂删,
后面由于各種原因把自己的域名換成了www.jd.com, 雖然說(shuō)域名變量,但是對(duì)于以前只記住了www.360buy.com
的用戶來(lái)說(shuō)冲茸,我們?nèi)绾伟堰@部分用戶也遷移到我們新域名的訪問(wèn)上來(lái)笤妙,針對(duì)于這個(gè)問(wèn)題冒掌,我們就可以使用Nginx中
Rewrite的域名跳轉(zhuǎn)來(lái)解決。
1蹲盘、環(huán)境準(zhǔn)備
vim /etc/hosts
以下配置:
192.168.200.133 www.360buy.com
192.168.200.133 www.jd.com
在/usr/local/nginx/html/kk目錄下創(chuàng)建一個(gè)訪問(wèn)頁(yè)面
<html>
<title></title>
<body>
<h1>歡迎來(lái)到林被的網(wǎng)站</h1>
</body>
</html>
通過(guò)Nginx實(shí)現(xiàn)當(dāng)訪問(wèn)www.訪問(wèn)到系統(tǒng)的首頁(yè)
server {
listen 80;
server_name www.lb.com;
location /{
root /usr/local/nginx/html/kk;
index index.html;
}
}
通過(guò)Rewrite完成將www.360buy.com的請(qǐng)求跳轉(zhuǎn)到www.jd.com
server {
listen 80;
server_name www.360buy.com;
rewrite ^/ http://www.jd.com permanent;
}
問(wèn)題描述:如何在域名跳轉(zhuǎn)的過(guò)程中攜帶請(qǐng)求的URI股毫?
修改配置信息
server {
listen 80;
server_name www.kjk.com;
rewrite ^(.*) http://www.lb.com$1 permanent;
}
2、域名鏡像
上述案例中召衔,將www.360buy.com 和 www.jingdong.com都能跳轉(zhuǎn)到w
ww.jd.com铃诬,那么www.jd.com我們就可以把它起名叫主域名,其他兩個(gè)
就是我們所說(shuō)的鏡像域名苍凛,當(dāng)然如果我們不想把整個(gè)網(wǎng)站做鏡像趣席,只想
為其中某一個(gè)子目錄下的資源做鏡像,我們可以在location塊中配置
rewrite功能醇蝴,比如:
server {
listen 80;
server_name rewrite.myweb.com;
location ^~ /source1{
rewrite ^/resource1(.*) http://rewrite.myweb.com/web$1 last;
}
location ^~ /source2{
rewrite ^/resource2(.*) http://rewrite.myweb.com/web$1 last;
}
}
3宣肚、獨(dú)立域名
一個(gè)完整的項(xiàng)目包含多個(gè)模塊,比如購(gòu)物網(wǎng)站有商品商品搜索模塊悠栓、商品詳情模塊已經(jīng)購(gòu)物車(chē)模塊等霉涨,那么
我們?nèi)绾螢槊恳粋€(gè)模塊設(shè)置獨(dú)立的域名。
需求:
http://search.kk.com 訪問(wèn)商品搜索模塊
http://item.kk.com 訪問(wèn)商品詳情模塊
http://cart.k.com 訪問(wèn)商品購(gòu)物車(chē)模塊
配置:
server{
listen 80;
server_name search.kk.com;
rewrite ^(.*) http://www.kk.com/bbs$1 last;
}
server{
listen 81;
server_name item.kk.com;
rewrite ^(.*) http://www.kk.com/item$1 last;
}
server{
listen 82;
server_name cart.kk.com;
rewrite ^(.*) http://www.kk.com/cart$1 last;
}
4惭适、目錄自動(dòng)添加"/"
通過(guò)一個(gè)例子來(lái)演示下問(wèn)題:
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html;
}
}
要想訪問(wèn)上述資源笙瑟,很簡(jiǎn)單,只需要通過(guò)http://192.168.200.133直接就能訪問(wèn)癞志,地址后面不需要加/往枷,
但是如果將上述的配置修改為如下內(nèi)容:
server {
listen 80;
server_name localhost;
location /kk {
root html;
index index.html;
}
}
這個(gè)時(shí)候,要想訪問(wèn)上述資源凄杯,按照上述的訪問(wèn)方式错洁,我們可以通過(guò)http://192.168.200.133/kk/來(lái)訪問(wèn),
但是如果地址后面不加斜杠,頁(yè)面就會(huì)出問(wèn)題戒突。如果不加斜杠墓臭,Nginx服務(wù)器內(nèi)部會(huì)自動(dòng)做一個(gè)301的重定
向,重定向的地址會(huì)有一個(gè)指令叫server_name_in_redirect on|off;來(lái)決定重定向的地址:
如果該指令為on
重定向的地址為: http://server_name/目錄名/;
如果該指令為off
重定向的地址為: http://原URL中的域名/目錄名/;
所以就拿剛才的地址來(lái)說(shuō)妖谴,http://192.168.200.133/kk如果不加斜杠窿锉,那么按照上述規(guī)則,如果指令server_name_in_redirect為on膝舅,則301重定向地址變?yōu)?http://localhost/kk/,如果為off嗡载,則301重定向地址
變?yōu)?a target="_blank">http://192.168.200.133/kkx/。后面這個(gè)是正常的仍稀,前面地址就有問(wèn)題洼滚。
注意server_name_in_redirect指令在Nginx的0.8.48版本之前默認(rèn)都是on,之后改成了off,所以現(xiàn)在我們這個(gè)版本
不需要考慮這個(gè)問(wèn)題技潘,但是如果是0.8.48以前的版本并且server_name_in_redirect設(shè)置為on遥巴,我們?nèi)绾瓮ㄟ^(guò)rewrite
來(lái)解決這個(gè)問(wèn)題千康?
解決方案:使用rewrite功能為末尾沒(méi)有斜杠的URL自動(dòng)添加一個(gè)斜杠
server {
listen 80;
server_name localhost;
server_name_in_redirect on;
location /kk {
if (-d $request_filename){
rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
}
}
}
5、合并目錄
搜索引擎優(yōu)化(SEO)是一種利用搜索引擎的搜索規(guī)則來(lái)提供目的網(wǎng)站的有關(guān)搜索引擎內(nèi)排名的方式铲掐。
我們?cè)趧?chuàng)建自己的站點(diǎn)時(shí)拾弃,可以通過(guò)很多中方式來(lái)有效的提供搜索引擎優(yōu)化的程度。其中有一項(xiàng)就包含URL
的目錄層級(jí)一般不要超過(guò)三層摆霉,否則的話不利于搜索引擎的搜索也給客戶端的輸入帶來(lái)了負(fù)擔(dān)豪椿,但是將所有
的文件放在一個(gè)目錄下又會(huì)導(dǎo)致文件資源管理混亂并且訪問(wèn)文件的速度也會(huì)隨著文件增多而慢下來(lái),這兩個(gè)
問(wèn)題是相互矛盾的携栋,那么使用rewrite如何解決上述問(wèn)題?
舉例搭盾,網(wǎng)站中有一個(gè)資源文件的訪問(wèn)路徑時(shí) /server/11/22/33/44/20.html,也就是說(shuō)20.html存在于第5級(jí)目錄下,
如果想要訪問(wèn)該資源文件婉支,客戶端的URL地址就要寫(xiě)成 http://www.web.name/server/11/22/33/44/20.html ,
server {
listen 80;
server_name www.web.name;
location /server{
root html;
}
}
但是這個(gè)是非常不利于SEO搜索引擎優(yōu)化的鸯隅,同時(shí)客戶端也不好記.使用 rewrite我們可以進(jìn)行如下配置:
server {
listen 80;
server_name www.web.name;
location /server{
rewrite ^/server-([0-9]+)-([0-9]+)-([0-9]+)- ([0-9]+)\.html$ /server/$1/$2/$3/$4/$5.html last;
}
}
這樣的話,客戶端只需要輸入http://www.web.name/server-11-22-33-44-20.html就可以訪問(wèn)到20.html頁(yè)面了向挖。
這里也充分利用了rewrite指令支持正則表達(dá)式的特性蝌以。
6、防盜鏈
防盜鏈之前我們已經(jīng)介紹過(guò)了相關(guān)的知識(shí)户誓,在rewrite中的防盜鏈和之前將的原理其實(shí)都是一樣的饼灿,只不過(guò)通過(guò)
rewrite可以將防盜鏈的功能進(jìn)行完善下幕侠,當(dāng)出現(xiàn)防盜鏈的情況帝美,我們可以使用rewrite將請(qǐng)求轉(zhuǎn)發(fā)到自定義的一
張圖片和頁(yè)面,給用戶比較好的提示信息晤硕。下面我們就通過(guò)根據(jù)文件類型實(shí)現(xiàn)防盜鏈的一個(gè)配置實(shí)例:
server{
listen 80;
server_name www.web.com;
locatin ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip)${
valid_referers none blocked server_names *.web.com;
if ($invalid_referer){
rewrite ^/ http://www.web.com/images/forbidden.png;
}
}
}
根據(jù)目錄實(shí)現(xiàn)防盜鏈配置:
server{
listen 80;
server_name www.web.com;
location /file/{
root /server/file/;
valid_referers none blocked server_names *.web.com;
if ($invalid_referer){
rewrite ^/ http://www.web.com/images/forbidden.png;
}
}
}