location的語(yǔ)法規(guī)則:location [=|~|~*|^~] /uri/ { … }
location匹配的變量是$uri
關(guān)于幾種字符的說(shuō)明

字符 描述
= 表示精準(zhǔn)匹配
~ 表示區(qū)分大小寫(xiě)的正則匹配
~* 表示不區(qū)分大小寫(xiě)的正則匹配
^~ 表示uri以指定字符或字符串開(kāi)頭
/ 通用匹配,任何請(qǐng)求都會(huì)匹配到

規(guī)則優(yōu)先級(jí)

= 高于 ^~ 高于 ~* 等于 ~ 高于 /

示例1

location = "/12.jpg" { ... }
如:
www.syushin.com/12.jpg 匹配
www.syushin.com/abc/12.jpg 不匹配

location ^~ "/abc/" { ... }
如:
www.syushin.com/abc/123.html 匹配
www.syushin.com/a/abc/123.jpg 不匹配

location ~ "png" { ... }
如:
www.syushin.com/aaa/bbb/ccc/123.png 匹配
www.syushin.com/aaa/png/123.html 匹配

location ~* "png" { ... }
如:
www.syushin.com/aaa/bbb/ccc/123.PNG 匹配
www.syushin.com/aaa/png/123.html 匹配


location /admin/ { ... }
如:
www.syushin.com/admin/aaa/1.php 匹配
www.syushin.com/123/admin/1.php 不匹配

注意:

有些資料上介紹location支持不匹配 !~如: location !~ ‘png'{ … }

這是錯(cuò)誤的,location不支持 !~

如果有這樣的需求,可以通過(guò)if(location優(yōu)先級(jí)小于if )來(lái)實(shí)現(xiàn),如: if ($uri !~ ‘png’) { … }

訪問(wèn)控制

web2.0時(shí)代,很多網(wǎng)站都是以用戶為中心,網(wǎng)站允許用戶發(fā)布內(nèi)容到服務(wù)器。由于為用戶開(kāi)放了上傳功能,因此有很大的安全風(fēng)險(xiǎn),比如黑客上傳木馬程序等等。因此,訪問(wèn)控制就很有必要配置了。

deny與allow

字面上很容易理解就是拒絕和允許。

Nginx的deny和allow指令是由ngx_http_access_module模塊提供,Nginx安裝默認(rèn)內(nèi)置了該模塊。

語(yǔ)法

語(yǔ)法:allow/deny address | CIDR | unix: | all

它表示,允許/拒絕某個(gè)ip或者一個(gè)ip段訪問(wèn).如果指定unix:,那將允許socket的訪問(wèn)。

注意:unix在1.5.1中新加入的功能。

在nginx中,allow和deny的規(guī)則是按順序執(zhí)行的。

示例1:

location /
{
  allow 192.168.0.0/24;
  allow 127.0.0.1;
  deny all;
}

說(shuō)明:這段配置值允許192.168.0.0/24網(wǎng)段和127.0.0.1的請(qǐng)求,其他來(lái)源IP全部拒絕。

示例2:

location ~ "admin"
{
  allow 192.168.30.7;
  deny all
}

說(shuō)明:訪問(wèn)的uri中包含admin的請(qǐng)求,只允許192.168.30.7這個(gè)IP的請(qǐng)求。

基于location的訪問(wèn)控制

日常上,訪問(wèn)控制基本是配合location來(lái)做配置的,直接例子吧。

示例1:

location /blog/
{
  deny all;
}

說(shuō)明:針對(duì)/blog/目錄,全部禁止訪問(wèn),這里的deny all;可以改為return 403;.

示例2

location ~ ".bak|\.ht"
{
  return 403;
}

說(shuō)明:訪問(wèn)的uri中包含.bak字樣的或者包含.ht的直接返回403狀態(tài)碼。

測(cè)試鏈接舉例:

如果用戶輸入的URL是上面其中之一都會(huì)返回403。

示例3

location ~ (data|cache|tmp|image|attachment).*\.php$
{
  deny all;
}

說(shuō)明:請(qǐng)求的uri中包含data、cache、tmp、image、attachment并且以.php結(jié)尾的,全部禁止訪問(wèn)。

測(cè)試鏈接舉例:

基于$document_uri的訪問(wèn)控制

前面介紹了內(nèi)置變量$document_uri含義是當(dāng)前請(qǐng)求中不包含指令的URI。

如www.123.com/1.php?a=1&b=2的$document_uri就是1.php,不包含后面的參數(shù)。

我們可以針對(duì)這個(gè)變量做訪問(wèn)控制。

示例1

if ($document_uri ~ "/admin/")
{
  return 403;
}

說(shuō)明:當(dāng)請(qǐng)求的uri中包含/admin/時(shí),直接返回403.

注意:if結(jié)構(gòu)中不支持使用allow和deny。

測(cè)試鏈接:

1. www.xxxxx.com/123/admin/1.html 匹配
2. www.xxxxx.com/admin123/1.html? 不匹配
3. www.xxxxx.com/admin.php? 不匹配

示例2

if ($document_uri = /admin.php)
{
  return 403;
}

說(shuō)明:請(qǐng)求的uri為/admin.php時(shí)返回403狀態(tài)碼。

測(cè)試鏈接:

1. www.xxxxx.com/admin.php # 匹配
2. www.xxxxx.com/123/admin.php # 不匹配

示例3

if ($document_uri ~ '/data/|/cache/.*\.php$')
{
  return 403;
}

說(shuō)明:請(qǐng)求的uri包含data或者cache目錄,并且是php時(shí),返回403狀態(tài)碼。

測(cè)試鏈接:

1. www.xxxxx.com/data/123.php? # 匹配
2. www.xxxxx.com/cache1/123.php # 不匹配

基于$request_uri訪問(wèn)控制

$request_uri比$docuemnt_uri多了請(qǐng)求的參數(shù)。主要是針對(duì)請(qǐng)求的uri中的參數(shù)進(jìn)行控制。

示例

if ($request_uri ~ "gid=\d{9,12}")
{
  return 403;
}

說(shuō)明:\d{9,12}是正則表達(dá)式,表示9到12個(gè)數(shù)字,例如gid=1234567890就符號(hào)要求。

測(cè)試鏈接:

1. www.xxxxx.com/index.php?gid=1234567890&pid=111? 匹配
2. www.xxxxx.com/gid=123? 不匹配

背景知識(shí):

曾經(jīng)有一個(gè)客戶的網(wǎng)站cc攻擊,對(duì)方發(fā)起太多類似這樣的請(qǐng)求:/read-123405150-1-1.html
實(shí)際上,這樣的請(qǐng)求并不是正常的請(qǐng)求,網(wǎng)站會(huì)拋出一個(gè)頁(yè)面,提示帖子不存在。
所以,可以直接針對(duì)這樣的請(qǐng)求,return 403狀態(tài)碼。

基于$http_user_agent的訪問(wèn)控制(反爬蟲(chóng))

user_agent可以簡(jiǎn)單理解成瀏覽器標(biāo)識(shí),包括一些蜘蛛爬蟲(chóng)都可以通過(guò)user_agent來(lái)辨識(shí)。假如觀察訪問(wèn)日志,發(fā)現(xiàn)一些搜索引擎的蜘蛛對(duì)網(wǎng)站訪問(wèn)特別頻繁,它們并不友好。為了減少服務(wù)器的壓力,其實(shí)可以把除主流搜索引擎蜘蛛外的其他蜘蛛爬蟲(chóng)全部封掉。

示例

if ($user_agent ~ 'YisouSpider|MJ12bot/v1.4.2|YoudaoBot|Tomato')
{
  return 403;
}

說(shuō)明:user_agent包含以上關(guān)鍵詞的請(qǐng)求,全部返回403狀態(tài)碼。

測(cè)試:

1. curl -A “123YisouSpider1.0”
2. curl -A “MJ12bot/v1.4.1”

基于$http_referer的訪問(wèn)控制

$http_referer除了可以實(shí)現(xiàn)防盜鏈的功能外,還可以做一些特殊的需求。

比如:

網(wǎng)站被黑掛馬,搜索引擎收錄的網(wǎng)頁(yè)是有問(wèn)題的,當(dāng)通過(guò)搜索引擎點(diǎn)擊到網(wǎng)站時(shí),卻顯示一個(gè)博彩網(wǎng)站。
由于查找木馬需要時(shí)間,不能馬上解決,為了不影響用戶體驗(yàn),可以針對(duì)此類請(qǐng)求做一個(gè)特殊操作。
比如,可以把從百度訪問(wèn)的鏈接直接返回404狀態(tài)碼,或者返回一段html代碼。

示例

if ($http_referer ~ 'baidu.com')
{
  return 404;
}

或者

if ($http_referer ~ 'baidu.com')
{
  return 200 "<html><script>window.location.href='//$host$request_uri';</script></html>";
}

Nginx參數(shù)優(yōu)化

Nginx作為高性能web服務(wù)器,即使不特意調(diào)整配置參數(shù)也可以處理大量的并發(fā)請(qǐng)求。當(dāng)然,配置調(diào)優(yōu)會(huì)使Nginx性能更加強(qiáng)悍,配置參數(shù)需要結(jié)合服務(wù)器硬件性能等做參考。

worker進(jìn)程優(yōu)化

worker_processes num;

該參數(shù)表示啟動(dòng)幾個(gè)工作進(jìn)程,建議和本機(jī)CPU核數(shù)保持一致,每一核CPU處理一個(gè)進(jìn)程,num表示數(shù)字。

worker_rlimit_nofile

它表示Nginx最大可用的文件描述符個(gè)數(shù),需要配合系統(tǒng)的最大描述符,建議設(shè)置為102400。
還需要在系統(tǒng)里執(zhí)行ulimit -n 102400才可以。
也可以直接修改配置文件/etc/security/limits.conf修改
增加:
#* soft nofile 655350 (去掉前面的#)
#* hard nofile 655350 (去掉前面的#)

worker_connections

該參數(shù)用來(lái)配置每個(gè)Nginx worker進(jìn)程最大處理的連接數(shù),
這個(gè)參數(shù)也決定了該Nginx服務(wù)器最多能處理多少客戶端請(qǐng)求(worker_processes * worker_connections)
建議把該參數(shù)設(shè)置為10240,不建議太大。

http/tcp連接數(shù)優(yōu)化

use epoll

使用epoll模式的事件驅(qū)動(dòng)模型,該模型為L(zhǎng)inux系統(tǒng)下最優(yōu)方式。

multi_accept on

使每個(gè)worker進(jìn)程可以同時(shí)處理多個(gè)客戶端請(qǐng)求。

sendfile on

使用內(nèi)核的FD文件傳輸功能,可以減少u(mài)ser mode和kernel mode的切換,從而提升服務(wù)器性能。

tcp_nopush on

當(dāng)tcp_nopush設(shè)置為on時(shí),會(huì)調(diào)用tcp_cork方法進(jìn)行數(shù)據(jù)傳輸。
使用該方法會(huì)產(chǎn)生這樣的效果:當(dāng)應(yīng)用程序產(chǎn)生數(shù)據(jù)時(shí),
內(nèi)核不會(huì)立馬封裝包,而是當(dāng)數(shù)據(jù)量積累到一定量時(shí)才會(huì)封裝,然后傳輸。

tcp_nodelay on

不緩存data-sends(關(guān)閉 Nagle 算法),這個(gè)能夠提高高頻發(fā)送小數(shù)據(jù)報(bào)文的實(shí)時(shí)性。

(關(guān)于Nagle算法)

【假如需要頻繁的發(fā)送一些小包數(shù)據(jù),比如說(shuō)1個(gè)字節(jié),以IPv4為例的話,則每個(gè)包都要附帶40字節(jié)的頭,
也就是說(shuō),總計(jì)41個(gè)字節(jié)的數(shù)據(jù)里,其中只有1個(gè)字節(jié)是我們需要的數(shù)據(jù)。
為了解決這個(gè)問(wèn)題,出現(xiàn)了Nagle算法。
它規(guī)定:如果包的大小滿足MSS,那么可以立即發(fā)送,否則數(shù)據(jù)會(huì)被放到緩沖區(qū),等到已經(jīng)發(fā)送的包被確認(rèn)了之后才能繼續(xù)發(fā)送。
通過(guò)這樣的規(guī)定,可以降低網(wǎng)絡(luò)里小包的數(shù)量,從而提升網(wǎng)絡(luò)性能。

keepalive_timeout

定義長(zhǎng)連接的超時(shí)時(shí)間,建議30s,太短或者太長(zhǎng)都不一定合適,當(dāng)然,最好是根據(jù)業(yè)務(wù)自身的情況來(lái)動(dòng)態(tài)地調(diào)整該參數(shù)。

keepalive_requests

定義當(dāng)客戶端和服務(wù)端處于長(zhǎng)連接的情況下,每個(gè)客戶端最多可以請(qǐng)求多少次,可以設(shè)置很大,比如50000.

reset_timeout_connection on

設(shè)置為on的話,當(dāng)客戶端不再向服務(wù)端發(fā)送請(qǐng)求時(shí),允許服務(wù)端關(guān)閉該連接。

client_body_timeout

客戶端如果在該指定時(shí)間內(nèi)沒(méi)有加載完body數(shù)據(jù),則斷開(kāi)連接,單位是秒,默認(rèn)60,可以設(shè)置為10。

send_timeout

這個(gè)超時(shí)時(shí)間是發(fā)送響應(yīng)的超時(shí)時(shí)間,即Nginx服務(wù)器向客戶端發(fā)送了數(shù)據(jù)包,但客戶端一直沒(méi)有去接收這個(gè)數(shù)據(jù)包。
如果某個(gè)連接超過(guò)send_timeout定義的超時(shí)時(shí)間,那么Nginx將會(huì)關(guān)閉這個(gè)連接。單位是秒,可以設(shè)置為3。

壓縮

對(duì)于純文本的內(nèi)容,Nginx是可以使用gzip壓縮的。使用壓縮技術(shù)可以減少對(duì)帶寬的消耗。

由ngx_http_gzip_module模塊支持

配置如下:

gzip on; //開(kāi)啟gzip功能
gzip_min_length 1024; //設(shè)置請(qǐng)求資源超過(guò)該數(shù)值才進(jìn)行壓縮,單位字節(jié)
gzip_buffers 16 8k; //設(shè)置壓縮使用的buffer大小,第一個(gè)數(shù)字為數(shù)量,第二個(gè)為每個(gè)buffer的大小
gzip_comp_level 6; //設(shè)置壓縮級(jí)別,范圍1-9,9壓縮級(jí)別最高,也最耗費(fèi)CPU資源
gzip_types text/plain application/x-javascript text/css application/xml image/jpeg image/gif image/png; //指定哪些類型的文件需要壓縮
gzip_disable "MSIE 6\."; //IE6瀏覽器不啟用壓縮

測(cè)試:

curl -I -H "Accept-Encoding: gzip, deflate" http://www.xxxxx.com/1.css

日志

靜態(tài)文件過(guò)期

對(duì)于靜態(tài)文件,需要設(shè)置一個(gè)過(guò)期時(shí)間,這樣可以讓這些資源緩存到客戶端瀏覽器,
在緩存未失效前,客戶端不再向服務(wù)期請(qǐng)求相同的資源,從而節(jié)省帶寬和資源消耗。

配置示例如下:

location ~* ^.+\.(gif|jpg|png|css|js)$                   
{
  expires 1d; //1d表示1天,也可以用24h表示一天。
}
贊(0)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享網(wǎng)絡(luò)內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-62778877-8306;郵箱:fanjiao@west.cn。本站原創(chuàng)內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明出處:西部數(shù)碼知識(shí)庫(kù) » Nginx訪問(wèn)控制與參數(shù)調(diào)優(yōu)的方法

登錄

找回密碼

注冊(cè)