nginx詳解

Nginx 是一個高性能的Http和反向代理web服務(wù)器剥哑。它可以作為靜態(tài)資源服務(wù)器掠拳,反向代理服務(wù)器,也可以用作負(fù)載均衡筐赔。

一、nginx安裝

1揖铜、安裝依賴包
  • 在安裝nginx前需要先安裝nginx的依賴包:
//gcc  
//PCRE:一個perl庫茴丰,包括perl兼容的正則表達(dá)式,nginx的http模板需要pcre來解析
//zlib:提供多種壓縮和解壓縮的方式,nginx使用zlib對http包的內(nèi)容進(jìn)行g(shù)zip
//openssl:是一個強(qiáng)大的安全套接字層密碼庫性含,包括主要的密碼算法替废、常用的密鑰和證書封裝管理功能及SSL協(xié)議趣席,nginx不僅支持http協(xié)議,還支持https
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
  • 將下載下來的.tar.gz移動到要存放的文件夾汤功,然后使用命令解壓:
//tar -zxvf 包名(根據(jù)自己包名進(jìn)行修改)
tar -zxvf nginx-1.16.1.tar.gz

tar -zxvf:用于解壓 .tar.gz 后綴結(jié)尾的
tar -xvf:用于解壓 .tar后綴結(jié)尾的

  • 解壓后進(jìn)入解壓后的文件夾中,這時需要使用make命令進(jìn)行編譯溜哮,但是解壓后的文件夾中沒有make文件滔金,所以我們需要使用configure來創(chuàng)建make文件:
/** 
--prefix:用于指定nginx安裝到哪里
--pid-path:每個進(jìn)程都有個pid文件,這里指定pid文件存放位置
--lock-path:lock文件存放位置
--error-log-path:錯誤日志存放位置
--http-log-path:訪問日志存放位置
--with-http_gzip_static_module:gzip模塊
--http-client-body-temp-path:臨時文件保存位置
下面同上茂嗓,這些temp的目錄在nginx啟動后都需要存在餐茵,否則會報錯。
*/
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi
  • 創(chuàng)建好make文件后使用命令編譯和安裝:
make
make install
  • 安裝好后述吸,我們需要在var下創(chuàng)建temp/nginx忿族,否則啟動報錯:
//-p代表可以創(chuàng)建多層目錄
mkdir /var/temp/nginx -p
  • 接下來到安裝好的nginx目錄下的sbin
cd /usr/local/nginx/sbin
//啟動nginx
./nginx
  • 啟動成功后通過命令查詢是否啟動成功
ps aux|grep nginx

上圖代表啟動成功。

  • 關(guān)閉nginx
//可以這樣關(guān)閉蝌矛,18705為上面圖中的id
kill 18705  
//一般來說在sbin下這樣關(guān)閉
./nginx -s stop
  • 重新加載配置文件道批,不用關(guān)機(jī)
./nginx -s reload

nginx安裝完成后如果要添加模塊

先找到源碼包目錄,然后執(zhí)行下面命令入撒,要添加上以前安裝過的模塊隆豹,因為這相當(dāng)于是重新安裝nginx:

#此處添加--with-http_ssl_module模塊
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--with-http_ssl_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi
//具體安裝在哪,路徑自己定衅金,要加上之前安裝的模塊

執(zhí)行:make 編譯
注意:不要使用make install噪伊,否則會覆蓋掉你現(xiàn)在正在使用的nginx

然后備份原來的可執(zhí)行文件,并將剛剛編譯好的nginx可執(zhí)行文件覆蓋掉原有的nginx氮唯,覆蓋前先停掉nginx:

//備份
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
//覆蓋鉴吹,objs為源碼包中的文件夾,里面有nginx的可執(zhí)行文件
cp ./objs/nginx /usr/local/nginx/sbin/

使用命令:nginx -V來查看是否添加成功惩琉,configure arguments后面表示當(dāng)前已經(jīng)安裝的nginx模塊:


二豆励、nginx配置反向代理

一個請求先訪問到nginx,然后通過nginx將請求轉(zhuǎn)發(fā)到配置的服務(wù)器瞒渠,實現(xiàn)反向代理良蒸。

upstream tomcat {
    server www.test.com:8080;
    server ...   #可以設(shè)置多個
}
server {
    listen       80;
    server_name  www.test.com;
    location / {
        proxy_pass   http://tomcat;
        index  index.html index.htm;
    }
    #下面配置的是靜態(tài)資源過濾
    location ~ .*\.(gif|jpg|png|jpeg|ico|bmp|swf|css|js|eot|svg|ttf|woff|woff2|properties|json)$ {
        proxy_pass http://tomcat;
        proxy_read_timeout 600s;
        proxy_set_header ?X-Real-IP ?$remote_addr;
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    
    }
    error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
    }
}
1、靜態(tài)資源過濾中的配置介紹:
- proxy_read_timeout:proxy后端服務(wù)器超時時間伍玖。連接成功后嫩痰,等候后端服務(wù)器響應(yīng)時間,其實已經(jīng)進(jìn)入后端排隊之中等候處理窍箍。
- proxy_set_header : proxy反向代理設(shè)置請求頭串纺,是傳遞給后端服務(wù)器的
- proxy_set_header:
        X-Real-IP:真實IP
            $remote_addr:是前一節(jié)點的IP丽旅,并不一定是用戶的真實IP。
        Host:
            $host:代理服務(wù)器本身IP纺棺。
            $server_port:nginx監(jiān)聽的端口榄笙。
            $proxy_port : 服務(wù)器真正訪問的端口。
        X-Forwarded-For:后面的$remote_addr與$proxy_add_x_forwarded_for
            當(dāng)只有一層代理服務(wù)器的情況下祷蝌,兩者的X-Forwarded-For值一致茅撞,都是用戶的真實IP。
            $remote_addr:是前一節(jié)點的IP巨朦,并不一定是用戶的真實IP米丘。
            $http_x_forwarded_for:獲取的是前一節(jié)點的X-Forwarded-For的值。
            $proxy_add_x_forwarded變量包含:$http_x_forwarded_for與$remote_addr兩部分罪郊,它們之間用逗號分開蠕蚜。
2、配置反向代理是在server中進(jìn)行配置:
server中:
    lister:這里設(shè)置你要監(jiān)聽的端口
    server_name:這里是你的請求名字悔橄,例如你的網(wǎng)站名或是ip
    location中:
        proxy_pass:這里配置代理轉(zhuǎn)發(fā)的位置靶累,如tomcat就需要在前面加上http://
upstream中:
    upstream后面的tomcat就是下面location中的proxy_pass
    server:這里配置端口號

注意問題:如果location按照^~匹配,則proxy_pass后的url需要加上/癣疟,不然轉(zhuǎn)發(fā)是會把匹配的路徑也加上挣柬。
例如:
1、請求是http://aaa.com/前綴/index.html睛挚,配置proxy_pass http://aaa.com/邪蛔,則被代理成:http://aaa.com/index.html
2扎狱、請求是http://aaa.com/前綴/index.html侧到,配置proxy_pass http://aaa.com,則被代理成:http://aaa.com/前綴/index.html淤击。

上面這些配完匠抗,當(dāng)你訪問www.test.com時就可以訪問到你的項目。這里相當(dāng)于把www.test.com:80的請求轉(zhuǎn)發(fā)到你本地的tomcat的8080端口上污抬。
我們可以配置多個汞贸,這樣你就再復(fù)制一個server,然后去配置印机。

3矢腻、關(guān)于nginx使用反向代理時靜態(tài)資源無法加載問題
  • 帶項目名的訪問路徑
    當(dāng)我們使用nginx作反向代理時,如果是下面的配置:
location ^~ /api/ {
    proxy_pass  http://localhost:8080;
}

這時靜態(tài)資源可以訪問的到射赛。

但是我們有時需要使用nginx的負(fù)載均衡多柑,或是需要多個web服務(wù)器的時候,我們就需要使用upstream楣责,我們看如下配置:

upstream tomcat {
      server  127.0.0.1:8080;
      #這里可以添加其他sever竣灌,然后配置負(fù)載均衡
}
location ^~ /api/ {
    proxy_pass  http://tomcat;
}

上面這種配置時诫隅,靜態(tài)資源就無法訪問,這時我們看到圖片的Request URL是下面的:

Request URL:http://tomcat/project/img/logo.jpg

從這里可以看出帐偎,nginx反向代理后,轉(zhuǎn)發(fā)的請求網(wǎng)址不對蛔屹,tomcat處應(yīng)該是localhost(注:我的nginx和tomcat都在一臺服務(wù)器)削樊。這時因為nginx沒有獲取到轉(zhuǎn)發(fā)上一層的請求情況,所以我們要加一些東西兔毒,下面是完整配置:

upstream ...
location ^~ /api/ {
    proxy_pass  http://tomcat;
    proxy_set_header ?X-Real-IP ?$remote_addr;
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
---------------------------------------------------------------------------------------------
訪問的網(wǎng)址為:www.aaa.com/api/toIndex;
location前綴api后面加了/漫贞,即為精確匹配。
在proxy_pass后面tomcat后面是不是加/育叁,作用于區(qū)別本文中有解釋迅脐,這里不做介紹。

上面的配置我們就可以正常訪問了豪嗽。

三谴蔑、server中l(wèi)ocation的配置

1、location中root和alias的區(qū)別
location /i/ {
    root /data/w3/images/;
}
當(dāng)請求是/i/top.gif時龟梦,nginx將會請求/data/w3/images/i/top.gif
root處理結(jié)果:root路徑+location路徑
使用root時隐锭,目錄后面的"/"可有可無。
location /i/ {
    alias /data/w3/images/;
}
當(dāng)請求/i/top.gif時计贰,nginx將會請求/data/w3/images/top.gif
alias處理結(jié)果:使用alias路徑替換location路徑
注意:
    使用alias時钦睡,目錄名后面一定要加"/"。
    alias只能位于location塊中躁倒。

root和alias主要區(qū)別在于nginx如何解釋location后面的uri荞怒。

2、location后面的uri
location語法:location [=|~|~*|^~|@] /uri/ { … }

location分為兩類:一類是普通location秧秉,一類是正則location

普通location是以:= 或 ^~ 為前綴或者沒有任何前綴的uri
注:普通location都是以 / 開始的uri請求
正則location是以:~ 或 ~* 為前綴的uri
  • 普通location
前綴 作用 說明
/ 匹配任何請求褐桌。 因為所有請求都是以"/"開始,但是更長字符匹配或者正則表達(dá)式匹配會優(yōu)先匹配,如果是location =/ {}福贞,則只響應(yīng)/請求撩嚼。
/* 最大前綴匹配。 例如/uri/api/*挖帘,普通location最長字符匹配完丽,與location在配置文件中的順序無關(guān),是按照匹配的長短來取匹配結(jié)果拇舀。若完全匹配逻族,就停止匹配。
= 前綴精確匹配骄崩。 必須嚴(yán)格等于聘鳞,匹配到則立即停止薄辅,不會去執(zhí)行“最大前綴”匹配結(jié)果。
^~ 非正則匹配抠璃。 與普通匹配的差別是站楚,告訴nginx不繼續(xù)正則匹配。請求/images/,那么/images/搏嗡、/images/a窿春、/images/a/b/index.html這三個都會在/images/這停止,后面的location和這三個一樣也不會匹配到采盒。
@ nginx內(nèi)部跳轉(zhuǎn) 用于定義一個location塊旧乞,且該塊不能被外部client訪問,只能被nginx內(nèi)部配置指令所訪問磅氨。
  • 正則location
    正則匹配順序則為location在配置文件中出現(xiàn)的順序尺栖,從上到下進(jìn)行匹配,如果符合則停止烦租。
前綴 說明
~ 表示區(qū)分大小寫的正則匹配
~* 表示不區(qū)分大小寫的正則匹配
!~ 表示區(qū)分大小寫不匹配的正則
!~* 表示不區(qū)分大小寫不匹配的正則
  • location匹配優(yōu)先級:
//優(yōu)先級
#精確匹配(=) > 最大前綴匹配(/ *延赌,需完全匹配) > 非正則匹配(^~) > 正則匹配(|~|~*|!~|!~*|) > 最大前綴匹配(/ *,不完全匹配) > location通配(/)
解釋:
1左权、先查找是否有=開頭的精確匹配皮胡,如果沒有繼續(xù)查找。
2赏迟、再查找普通匹配屡贺,以最大前綴為原則。例如:/a/和/a/a锌杀,則匹配到后一項甩栈。如果沒有繼續(xù)查找。
3糕再、匹配到一個普通格式后量没,并沒有結(jié)束,而是暫存當(dāng)前匹配結(jié)果并繼續(xù)突想。
如果找到非正則匹配(^~)項殴蹄,則終止搜索,將以此項為最終匹配結(jié)果猾担;如果沒有將繼續(xù)查找袭灯。
4、接著匹配正則绑嘹,將第一個匹配項作為最終結(jié)果稽荧,也覆蓋了前面緩存的匹配結(jié)果,并終止搜索工腋。正則受在配置文件中配置的前后順序影響姨丈,普通匹配不會畅卓。
5、如果沒有找到正則匹配項蟋恬,則以3中緩存的結(jié)果為最終結(jié)果翁潘。
6、如果一個都沒有匹配到歼争,返回404唐础。

看下面例子:

//配置示例
#location / {  config A  }
請求為:/aaa/index.html  匹配到:cofig A  ------通用匹配,如果匹配到A以后矾飞,往后沒有任何匹配,則使用config A

#location =/ {  config B  }
請求為:/  匹配到:cofig B  ------精確匹配呀邢,即使/index.html也匹配不了

#location /api/ {  config C  }
請求為:/api/index.html  匹配到:cofig  C ------先匹配到C洒沦,往下沒有任何匹配項,使用config C
請求為:/api/1.jpg 匹配到:config E  ------先匹配到C价淌,往下找到正則匹配項申眼,所以使用config E

#location ~ /api/Abc {  config CC  }
請求為:/api/Abc.jpg  匹配到:cofig CC  ------最長前綴先匹配到C,繼續(xù)往下找到正則CC蝉衣,終止搜索括尸,不會往下到E。

#location ^~ /images/ {  config D  }
請求為:/images/abc.jpg  匹配到:cofig D  ------先匹配到F病毡,繼續(xù)搜索找到D濒翻,然后停止,不會再去查找正則啦膜。

#location /images/ {  config F  }
請求為:/images/1.jpg  匹配到:cofig D  ------先匹配到F有送,因為普通匹配不受順序影響,然后有非正則項僧家,所以使用config D雀摘,不會再查找正則。

#location /images/abc {  config G  }
請求為:/images/abc/1.jpg或/images/abc.jpg  匹配到:cofig D  ------先匹配到G八拱,然后有非正則阵赠,所以使用D。

#location ~ /images/abc/ {  config H ] }
請求為:/images/abc/1.jpg  匹配到:cofig D  ------如果沒有非正則項肌稻,此配置最長會匹配到H清蚀,正則第一個匹配項會被作為最終項。

#location ~* \.(gif|jpg|jpeg)$ {  config E  }
請求為:/1.jpg  匹配到:cofig E  ------此項為關(guān)于圖片后綴的正則灯萍,不區(qū)分大小寫轧铁。
  • location中以@開頭的uri
    用于定義一個location塊,且該塊不能被外部client訪問旦棉,只能被nginx內(nèi)部配置指令所訪問齿风。
//示例:
location /img/ {
    error_page 404 @img_err;
}
location @img_err {
    config A
}
#以 /img/ 開頭的請求药薯,如果連接的狀態(tài)為 404。則會匹配到 @img_err 這條規(guī)則上救斑。
  • location前綴后面的 / 加與不加的區(qū)別
//示例:
location /images/pic { config A }
location /images/pic/ { config A }

location進(jìn)行的是模糊匹配童本,如上面示例:

  • 當(dāng)沒有 / 時,/images/pic可以匹配/images/picabc請求脸候,也可以匹配/images/pic/abc請求
  • 當(dāng)有 / 時穷娱,/images/pic/不可以匹配/images/picabc請求,只可以匹配/images/pic/anything這樣的請求

四运沦、Rewrite地址重寫

參考:https://blog.csdn.net/qq_41475058/article/details/89516051

Nginx的rewrite的主要功能是實現(xiàn)URL地址重寫泵额。Nginx的rewrite規(guī)則需要PCRE軟件的支持,即通過Perl兼容正則表達(dá)式語法進(jìn)行規(guī)則匹配携添。

rewrite和location的功能有點相像嫁盲,都能實現(xiàn)跳轉(zhuǎn),主要區(qū)別在于rewrite常用于同一域名內(nèi)更改獲取資源的路徑烈掠,而location是對一類路徑做控制訪問和反向代理羞秤,可以proxy_pass到其他服務(wù)器。

rewrite功能就是使用nginx提供的全局變量或自己設(shè)置的變量左敌,結(jié)合正則表達(dá)式和標(biāo)志位實現(xiàn)url重寫以及重定向瘾蛋。

地址重寫和地址轉(zhuǎn)發(fā)的含義:
地址重寫是為了實現(xiàn)地址的標(biāo)準(zhǔn)化,比如在地址欄中中輸入 www.baidu.com. 我們也可以輸入 www.baidu.cn. 最后都會被重寫到 www.baidu.com 上矫限。瀏覽器的地址欄也會顯示www.baidu.com哺哼。會產(chǎn)生兩次請求。
地址轉(zhuǎn)發(fā)它是指在網(wǎng)絡(luò)數(shù)據(jù)傳輸過程中數(shù)據(jù)分組到達(dá)路由器或橋接器后叼风,該設(shè)備通過檢查分組地址并將數(shù)據(jù)轉(zhuǎn)發(fā)到最近的局域網(wǎng)的過程幸斥。只會有一次請求。

rewrite只能放在 server{}, location{}, if{}中咬扇,并且只能對域名后邊的除去傳遞的參數(shù)外的字符串起作用甲葬。
例如:www.baidu.com/a/b/index.html?id=1,則只對/a/b/index.html重寫懈贺。

1经窖、rewrite相關(guān)指令
指令 默認(rèn)值 使用范圍
break none if,server,location
if ( condition ) { … } none server,location
return none server,if,location
rewrite regex replacement flag server,location,if
uninitialized_variable_warn on/off on http,server,location,if
set variable value none

指令作用見下:

break:
    完成當(dāng)前的規(guī)則集,不再處理rewrite指令(屬于rewrite的指令)梭灿,需要和last加以區(qū)分画侣。
if ( condition ) { … }:
    用于檢測一個條件是否符合,符合則執(zhí)行大括號內(nèi)的語句堡妒。不支持嵌套配乱,不支持多個條件&&或處理
return:
    用于結(jié)束規(guī)則的執(zhí)行和返回狀態(tài)碼給客戶端。
    狀態(tài)碼的值可以是:204,400,402,406,408,410,411,413,416以及500~504,
    另外非標(biāo)準(zhǔn)狀態(tài)碼444搬泥,表示以不發(fā)送任何的Header頭來結(jié)束連接桑寨。
rewrite regex replacement flag:
    該指令根據(jù)表達(dá)式來重定向URI,或者修改字符串忿檩。
    指令根據(jù)配置文件中的順序來執(zhí)行尉尾。注意重寫表達(dá)式只對相對路徑有效。
    該指令根據(jù)表達(dá)式來重定向URI燥透,或者修改字符串沙咏。
    指令根據(jù)配置文件中的順序來執(zhí)行。注意重寫表達(dá)式只對相對路徑有效班套。
uninitialized_variable_warn on/off:
    該指令用于開啟和關(guān)閉未初始化變量的警告信息肢藐,默認(rèn)值為開啟。
set variable value:
    該指令用于定義一個變量吱韭,并且給變量進(jìn)行賦值窖壕。變量的值可以是文本、一個變量或者變量和文本的聯(lián)合杉女,文本需要用引號引起來。
2鸳吸、rewrite常用全局變量
變量 說明
$args 該變量中存放了請求URL中的請求指令熏挎。
比如aaa.com?arg1=value1&arg2=value2 中的
"arg1=value1&arg2=value2"
$content_length 該變量中存放了請求頭中的Content-length字段
$content_type 該變量中存放了請求頭中的 Content-type字段
$document_root 該變量中存放了針對當(dāng)前請求的根路徑
$document_uri 該變量中存放了請求的當(dāng)前URI, 但是不包括請求指令。
比如aaa.com/aaa/1?arg1=value1&arg2=value2; 中的 "/aaa/1"
$host 變量中存放了請求的URL中的主機(jī)部分字段晌砾,比如aaa.com/home中的 aaa.com坎拐。
如果請求中的主機(jī)部分字段不可用或者為空,
則存放Nginx配置中server塊中的server_name指令的配置值
$http_host 該變量與$host唯一區(qū)別帶有端口號:比如上面的是 aaa.com:8080
$http_user_agent 變量中存放客戶端的代理信息
$http_cookie 該變量中存放客戶端的cookie信息
$limit_rate 變量中存放Nginx服務(wù)器對網(wǎng)絡(luò)連接速率的限制养匈,也就是Nginx配置中的limit_rate指令的配置值
$remote_addr 該變量中存放客戶端的地址哼勇。
$remote_port 該變量中存放了客戶端與服務(wù)器建立連接的端口號
$remote_user 變量中存放客戶端的用戶名。
$request_body_file 變量中存放了發(fā)給后端服務(wù)器的本地文件資源的名稱
$request_method 變量中存放了客戶端的請求方式呕乎,比如 'GET'积担、'POST'等
$request_filename 變量中存放了當(dāng)前請求的資源文件的路徑名
$request_uri 變量中存放了當(dāng)前請求的URI,并且?guī)д埱笾噶?/td>
$query_string 和變量$args含義一樣
$scheme 變量中存放了客戶端請求使用的協(xié)議猬仁,比如 'http', 'https'和'ftp'等
$server_protocol 變量中存放了客戶端請求協(xié)議的版本, 比如 'HTTP/1.0'帝璧、'HTTP/1.1' 等
$server_addr 變量中存放了服務(wù)器的地址
$server_name 變量中存放了客戶端請求到達(dá)的服務(wù)器的名稱
$server_port 變量中存放了客戶端請求到達(dá)的服務(wù)器的端口號
$uri 與變量$document_uri含義相同
3、rewrite語法
  • rewrite regex replacement [flag];
rewrite:為固定關(guān)鍵字湿刽,表示開始進(jìn)行rewrite匹配規(guī)則的烁。
regex:用于匹配URI的正則表達(dá)式。
replacement :將regex正則匹配到的內(nèi)容替換成 replacement诈闺。
flag:flag標(biāo)記渴庆。
        flag有如下值:
        last: 本條規(guī)則匹配完成后,繼續(xù)向下匹配新的location URI 規(guī)則。(不常用)last一般寫在server和if中襟雷。
        break: 本條規(guī)則匹配完成即終止刃滓,不再匹配后面的任何規(guī)則(不常用)。break一般使用在location中嗤军。
        redirect: 返回302臨時重定向注盈,瀏覽器地址會顯示跳轉(zhuǎn)新的URL地址。
        permanent: 返回301永久重定向叙赚。瀏覽器地址會顯示跳轉(zhuǎn)新的URL地址老客。
rewrite ^/(.*) http://www.baidu.com permanent;
當(dāng)請求過來會重寫,然后重定向到www.baidu.com
  • set和return
    使用 $ 來引用變量震叮。
location / {
    #set賦值胧砰,可以直接賦字符串,或是變量苇瓣,或是變量和字符串的組合
    set $set_value_uri “111 $request_uri”;
    return 200 $set_value_uri;
}
www.aaa.com/aaa請求后尉间,將返回200的status,還有111 
  • if
    if中的判斷條件condition為空或為0击罪,都為false哲嘲,不支持嵌套,不支持多個條件&&或處理媳禁。
相關(guān)判斷表達(dá)式:
- 變量與字符串比較眠副,= 為等于,!= 為不等
- 變量與正則表達(dá)式匹配竣稽,~ 為區(qū)分大小寫匹配囱怕,~* 為不區(qū)分大小寫匹配,!~ 和 !~* 前面兩者的非操作毫别,即區(qū)分和不區(qū)分大小寫不匹配娃弓。
- 檢查文件是否存在,-f 存在即為true岛宦,!-f 不存在即為true
- 檢查目錄是否存在台丛,-d 存在即為true,!-d 不存在即為true
- 檢查文件或目錄是否存在砾肺,-e 存在即為true齐佳,!-e 不存在即為true
- 檢查文件是否可執(zhí)行,-x 可執(zhí)行即為true债沮,!-x 不可執(zhí)行即為true
如果/usr/local文件或文件夾存在炼吴,則返回200
if(-e /usr/local){
      return 200;
}

五、防盜鏈配置

防盜鏈及實現(xiàn)原理:別人直接拿我們的圖片鏈接用在自己的服務(wù)器上疫衩,為了防止這種行為硅蹦,就出現(xiàn)了防盜鏈。要實現(xiàn)防盜鏈先了解下圖片的加載,客戶端向服務(wù)器請求資源時童芹,為了減少網(wǎng)絡(luò)帶寬和提高響應(yīng)時間涮瞻,服務(wù)器會分開加載資源。比如請求一個網(wǎng)頁假褪,先傳回文本署咽,解析中發(fā)現(xiàn)網(wǎng)頁中有圖片,瀏覽器再次請求圖片資源生音。但是如果別人拿到你的圖片鏈接直接放到自己的網(wǎng)頁上宁否,那么別人在請求他的服務(wù)器后,網(wǎng)頁中有你的圖片缀遍,則瀏覽器會直接向你的服務(wù)器請求慕匠,這種會增加你服務(wù)器的負(fù)擔(dān),消耗你的帶寬域醇,這個就是盜鏈行為台谊。因此我們要實現(xiàn)防盜鏈。

實現(xiàn)防盜鏈:使用http協(xié)議中請求頭部的Referer頭域來判斷當(dāng)前訪問的網(wǎng)頁或文件的源地址譬挚。通過該頭域的值锅铅,我們可以檢測訪問目標(biāo)資源的源地址。如果目標(biāo)源地址不是我們自己站內(nèi)的URL的話减宣,那么這種情況下盐须,我們采取阻止措施,實現(xiàn)防盜鏈蚪腋。但是注意的是:Referer頭域中的值是可以被更改的。因此該方法也不能完全安全阻止防盜鏈姨蟋。

nginx服務(wù)器的rewrite功能實現(xiàn)防盜鏈

Nginx中有一個指令valid_referers屉凯。該指令可以用來獲取Referer頭域中的值,并且根據(jù)該值的情況給Nginx全局變量invalidreferer賦值眼溶。如果Referer頭域中沒有符合validreferers指令的值的話invalid_referer變量將會賦值為1.悠砚。

  • valid_referers 指令基本語法如下:
valid_referers  none | blocked | server_names | arbitrary_string | regular experssion
  • valid_referers后面參數(shù)的意思:
none:代表請求頭中沒有referer信息,這一般是直接在瀏覽器輸入圖片網(wǎng)址堂飞。
blocked:代表Referer頭域的值被防火墻或者代理服務(wù)器刪除或偽裝的情況灌旧。那么在這種情況下,該頭域的值不以"http://" 或 "https://" 開頭绰筛。
server_names:當(dāng)設(shè)置一個或多個URL枢泰,即nginx監(jiān)聽的server_name 。檢測Referer頭域的值是否是URL中的某個铝噩。
arbitrary_string:自定義指定字符串衡蚂,但使用作通配符 
regular experssion:被指定的正則表達(dá)式模式匹配到的字符串,需要使用~開頭,如:~ aaa.com
示例:
根據(jù)請求文件類型實現(xiàn)防盜鏈配置
location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip)$ {
    valid_referers none blocked www.aaa.com *.bbb.com;
    if($invalid_referer){
        rewrite ^/ http://www.aaa.com/images/aaa.png;
    }
}
根據(jù)請求目錄實現(xiàn)防盜鏈配置
location /images/ {
    valid_referers none blocked www.aaa.com *.bbb.com;
    if($invalid_referer){
        rewrite ^/ http://www.aaa.com/images/aaa.png;
    }
}

示例中,blocked后面的地址就相當(dāng)于白名單毛甲,如果請求的資源文件不是以這些域名開頭的話年叮,就說明請求的資源文件不是該域下的請求,可以判斷它是盜鏈玻募。然后invalid_referer被賦值為1只损,而1代表是true,就進(jìn)入if代碼塊七咧,然后把它重定向到aaa.png這個圖片跃惫。

六、其他

1坑雅、設(shè)置過期時間(expires [time])
根據(jù)文件類型設(shè)置過期時間
location ~* \.(js|css|jpg|jpeg|gif|png|swf)$
if(-f $request_filename){
      expires 30d;
      break;
}
設(shè)置圖片緩存時間
location ~ \.(gif|jpg|png)${
     expires 1h; 
}
2辈挂、禁止訪問某個目錄(deny all)
location ~* \.(txt|doc)${
     root /data/images;  #所有用戶都禁止訪問這個目錄
    deny all;
}
3、隱藏版本號

在http中添加:server_tokens off;


寫在最后:

  • 如果文章中有錯誤或是表達(dá)不準(zhǔn)確的地方裹粤,歡迎大家評論中指正终蒂,以便我完善。
  • 文章我也會根據(jù)所學(xué)到新的知識不斷更新遥诉。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拇泣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子矮锈,更是在濱河造成了極大的恐慌霉翔,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件苞笨,死亡現(xiàn)場離奇詭異债朵,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)瀑凝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門序芦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人粤咪,你說我怎么就攤上這事谚中。” “怎么了寥枝?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵宪塔,是天一觀的道長。 經(jīng)常有香客問我囊拜,道長某筐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任冠跷,我火速辦了婚禮来吩,結(jié)果婚禮上敢辩,老公的妹妹穿的比我還像新娘。我一直安慰自己弟疆,他們只是感情好戚长,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著怠苔,像睡著了一般同廉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上柑司,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天迫肖,我揣著相機(jī)與錄音,去河邊找鬼攒驰。 笑死蟆湖,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的玻粪。 我是一名探鬼主播隅津,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼劲室!你這毒婦竟也來了伦仍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤很洋,失蹤者是張志新(化名)和其女友劉穎充蓝,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體喉磁,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡谓苟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了协怒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涝焙。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖斤讥,靈堂內(nèi)的尸體忽然破棺而出纱皆,到底是詐尸還是另有隱情湾趾,我是刑警寧澤芭商,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站搀缠,受9級特大地震影響铛楣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜艺普,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一簸州、第九天 我趴在偏房一處隱蔽的房頂上張望鉴竭。 院中可真熱鬧,春花似錦岸浑、人聲如沸搏存。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽璧眠。三九已至,卻和暖如春读虏,著一層夾襖步出監(jiān)牢的瞬間责静,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工盖桥, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留灾螃,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓揩徊,卻偏偏與公主長得像腰鬼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子靴拱,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353