您好,登錄后才能下訂單哦!
Nginx的deny和allow
https://coding.net/u/aminglinux/p/nginx/git/blob/master/access/deny_allow.md
Nginx訪問控制 —— deny_allow
Nginx的deny和allow指令是由ngx_http_access_module模塊提供,Nginx安裝默認內置了該模塊。
除非在安裝時有指定 --without-http_access_module。
語法
語法:allow/deny address | CIDR | unix: | all
它表示,允許/拒絕某個ip或者一個ip段訪問.如果指定unix:,那將允許socket的訪問。
注意:unix在1.5.1中新加入的功能。
在nginx中,allow和deny的規則是按順序執行的。
示例
示例1:
location /
{
allow 192.168.0.0/24;
allow 127.0.0.1;
deny all;
}
說明:這段配置值允許192.168.0.0/24網段和127.0.0.1的請求,其他來源IP全部拒絕。
示例2:
location ~ "admin"
{
allow 110.21.33.121;
deny all
}
說明:訪問的uri中包含admin的請求,只允許110.21.33.121這個IP的請求。
基于location的訪問控制
在生產環境中,我們會對某些特殊的請求進行限制,比如對網站的后臺進行限制訪問。
這就用到了location配置。
示例1
location /aming/
{
deny all;
}
說明:針對/aming/目錄,全部禁止訪問,這里的deny all可以改為return 403.
示例2
location ~ ".bak|.ht"
{
return 403;
}
說明:訪問的uri中包含.bak字樣的或者包含.ht的直接返回403狀態碼。
測試鏈接舉例:
示例3
location ~ (data|cache|tmp|image|attachment).*.php$
{
deny all;
}
說明:請求的uri中包含data、cache、tmp、image、attachment并且以.php結尾的,全部禁止訪問。
測試鏈接舉例:
Nginx基于$document_uri的訪問控制
這就用到了變量$document_uri,根據前面所學內容,該變量等價于$uri,其實也等價于location匹配。
示例1
if ($document_uri ~ "/admin/")
{
return 403;
}
說明:當請求的uri中包含/admin/時,直接返回403.
if結構中不支持使用allow和deny。
測試鏈接:
示例2
if ($document_uri = /admin.php)
{
return 403;
}
說明:請求的uri為/admin.php時返回403狀態碼。
測試鏈接:
示例3
#下面兩種的結果不同
if ($document_uri ~ '/data/|/cache/..php$')
#if ($document_uri ~ '(/data/|/cache/)..php$')
{
return 403;
}
說明:請求的uri包含data或者cache目錄,并且是php時,返回403狀態碼。
測試鏈接:
nginx基于$request_uri訪問控制
$request_uri比$docuemnt_uri多了請求的參數。
主要是針對請求的uri中的參數進行控制。
示例
if ($request_uri ~ "gid=\d{9,12}")
{
return 403;
}
說明:\d{9,12}是正則表達式,表示9到12個數字,例如gid=1234567890就符號要求。
測試鏈接:
背景知識:
曾經有一個客戶的網站cc***,對方發起太多類似這樣的請求:/read-123405150-1-1.html
實際上,這樣的請求并不是正常的請求,網站會拋出一個頁面,提示帖子不存在。
所以,可以直接針對這樣的請求,return 403狀態碼。
Nginx基于$user_agent的訪問控制
user_agent大家并不陌生,可以簡單理解成瀏覽器標識,包括一些蜘蛛爬蟲都可以通過user_agent來辨識。
通過觀察訪問日志,可以發現一些搜索引擎的蜘蛛對網站訪問特別頻繁,它們并不友好。
為了減少服務器的壓力,其實可以把除主流搜索引擎蜘蛛外的其他蜘蛛爬蟲全部封掉。
另外,一些cc***,我們也可以通過觀察它們的user_agent找到規律。
示例
if ($http_user_agent ~ 'YisouSpider|MJ12bot/v1.4.2|YoudaoBot|Tomato')
{
return 403;
}
說明:user_agent包含以上關鍵詞的請求,全部返回403狀態碼。
測試:
Nginx基于$http_referer的訪問控制
在前面講解rewrite時,曾經用過該變量,當時實現了防盜鏈功能。
其實基于該變量,我們也可以做一些特殊的需求。
示例
背景:網站被黑掛馬,搜索引擎收錄的網頁是有問題的,當通過搜索引擎點擊到網站時
由于查找***需要時間,不能馬上解決,為了不影響用戶體驗,可以針對此類請求做一個特殊操作。
比如,可以把從百度訪問的鏈接直接返回404狀態碼,或者返回一段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限速
https://coding.net/u/aminglinux/p/nginx/git/blob/master/access/limit.md
Nginx的限速
可以通過ngx_http_limit_conn_module和ngx_http_limit_req_module模塊來實現限速的功能。
ngx_http_limit_conn_module
該模塊主要限制下載速度。
配置示例
http
{
...
limit_conn_zone $binary_remote_addr zone=aming:10m;
...
server
{
...
limit_conn aming 10;
...
}
}
說明:首先用limit_conn_zone定義了一個內存區塊索引aming,大小為10m,它以$binary_remote_addr作為key。
該配置只能在http里面配置,不支持在server里配置。
limit_conn 定義針對aming這個zone,并發連接為10個。在這需要注意一下,這個10指的是單個IP的并發最多為10個。
location ~ /download/ {
...
limit_rate_after 512k;
limit_rate 150k;
...
}
說明:limit_rate_after定義當一個文件下載到指定大小(本例中為512k)之后開始限速;
limit_rate 定義下載速度為150k/s。
注意:這兩個參數針對每個請求限速。
ngx_http_limit_req_module
該模塊主要用來限制請求數。
語法: limit_req_zone $variable zone=name:size rate=rate;
默認值: none
配置段: http
設置一塊共享內存限制域用來保存鍵值的狀態參數。 特別是保存了當前超出請求的數量。
鍵的值就是指定的變量(空值不會被計算)。
如limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
說明:區域名稱為one,大小為10m,平均處理的請求頻率不能超過每秒一次,鍵值是客戶端IP。
使用$binary_remote_addr變量, 可以將每條狀態記錄的大小減少到64個字節,這樣1M的內存可以保存大約1萬6千個64字節的記錄。
如果限制域的存儲空間耗盡了對于后續所有請求,服務器都會返回 503 (Service Temporarily Unavailable)錯誤。
速度可以設置為每秒處理請求數和每分鐘處理請求數,其值必須是整數,
所以如果你需要指定每秒處理少于1個的請求,2秒處理一個請求,可以使用 “30r/m”。
語法: limit_req zone=name [burst=number] [nodelay];
默認值: —
配置段: http, server, location
設置對應的共享內存限制域和允許被處理的最大請求數閾值。
如果請求的頻率超過了限制域配置的值,請求處理會被延遲,所以所有的請求都是以定義的頻率被處理的。
超過頻率限制的請求會被延遲,直到被延遲的請求數超過了定義的閾值,
這時,這個請求會被終止,并返回503 (Service Temporarily Unavailable) 錯誤。
這個閾值的默認值為0。如:
limit_req_zone $binary_remote_addr zone=aming:10m rate=1r/s;
server {
location /upload/ {
limit_req zone=aming burst=5;
}
}
限制平均每秒不超過一個請求,同時允許超過頻率限制的請求數不多于5個。
如果不希望超過的請求被延遲,可以用nodelay參數,如:
limit_req zone=aming burst=5 nodelay;
示例
http {
limit_req_zone $binary_remote_addr zone=aming:10m rate=1r/s;
server {
location ^~ /download/ {
limit_req zone=aming burst=5;
}
}
}
![](https://s1.51cto.com/images/blog/201912
將burst改為10后的結果如下
設定白名單IP
如果是針對公司內部IP或者lo(127.0.0.1)不進行限速,如何做呢?這就要用到geo模塊了。
假如,預把127.0.0.1和192.168.100.0/24網段設置為白名單,需要這樣做。
在http { }里面增加:
geo $limited {
default 1;
127.0.0.1/32 0;
192.168.100.0/24 0;
}
map $limited $limit {
1 $binary_remote_addr;
0 "";
}
原來的 “limit_req_zone $binary_remote_addr ” 改為“limit_req_zone $limit”
完整示例:
http {
geo $limited {
default 1;
127.0.0.1/32 0;
192.168.100.0/24 0;
}
map $limited $limit {
1 $binary_remote_addr;
0 "";
}
limit_req_zone $limit zone=aming:10m rate=1r/s;
server {
location ^~ /download/ {
limit_req zone=aming burst=5;
}
}
}
Nginx用戶認證
https://coding.net/u/aminglinux/p/nginx/git/blob/master/access/auth.md
Nginx的用戶認證
當訪問一些私密資源時,最好配置用戶認證,增加安全性。
步驟和示例
安裝httpd
yum install -y httpd
使用htpasswd生產密碼文件
htpasswd -c /usr/local/nginx/conf/htpasswd aming
配置nginx用戶認證
location /admin/
{
auth_basic "Auth";
auth_basic_user_file /usr/local/nginx/conf/htpasswd;
}
測試
curl -uaming:passwd www.aminglinux.com/admin/1.html
![](https://s1.51cto.com/images/blog/201912/22/2aa8fa5e12209e54c2446f69d8c91de5.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。