ngx_http_autoindex_module模塊處理以斜槓字符('/')結尾的請求(就是處理location /),並生成目錄列表。當ngx_http_index_module模塊找不到索引文件時,一般會將請求傳遞給模塊ngx_http_autoindex_module。(即ngx_http_index_module模塊找不到首頁文件,就會交給ngx_http_autoindex_module把當前目錄下的全部文件生成目錄列表)php
#啓用或禁用目錄列表輸出,on開啓,off關閉。 Syntax: autoindex on | off; Default: autoindex off; Context: http, server, location #指定是否應在目錄列表中輸出確切的文件大小,on顯示字節,off顯示大概單位。 Syntax: autoindex_exact_size on | off; Default: autoindex_exact_size on; Context: http, server, location #指定目錄列表中的時間是應以本地時區仍是UTC輸出。on本地時區,off UTC時間。 Syntax: autoindex_localtime on | off; Default: autoindex_localtime off; Context: http, server, location
[root@web ~]# cat /etc/nginx/conf.d/game.conf server { listen 80; server_name game.oldboy.com; charset utf-8,gbk; #設定字符集,防止中文字符亂碼顯示。 location / { root /code/game; autoindex on; (須要找不到index.html主頁文件,才能以目錄樹的結構顯示) autoindex_exact_size off; (off顯示的是確切的大小) } }
ngx_http_stub_status_module模塊提供對基本狀態信息的訪問。
默認狀況下不構建此模塊,應使用--with-http_stub_status_module 配置參數啓用它 。css
Syntax: stub_status; Default: — Context: server, location
[root@web ~]# cat /etc/nginx/conf.d/game.conf server { listen 80; server_name game.oldboy.com; access_log off; location /nginx_status { stub_status; } }
Active connections # 當前活動客戶端鏈接數,包括Waiting等待鏈接數。 accepts # 已接受總的TCP鏈接數。 handled # 已處理總的TCP鏈接數。 requests # 客戶端總的http請求數。 Reading # 當前nginx讀取請求頭的鏈接數。 Writing # 當前nginx將響應寫回客戶端的鏈接數。 Waiting # 當前等待請求的空閒客戶端鏈接數。 # 注意, 一次TCP的鏈接,能夠發起屢次http的請求, 以下參數可配置進行驗證 keepalive_timeout 0; # 相似於關閉長鏈接 keepalive_timeout 65; # 65s沒有活動則斷開鏈接
ngx_http_access_module模塊容許限制對某些客戶端地址的訪問。html
#容許配置語法 Syntax: allow address | CIDR | unix: | all; Default: — Context: http, server, location, limit_except #拒絕配置語法 Syntax: deny address | CIDR | unix: | all; Default: — Context: http, server, location, limit_except
[root@web ~]# cat /etc/nginx/conf.d/module.conf server { listen 80; server_name module.bgx.com; location /nginx_status { stub_status; deny 10.0.0.1/32; #拒絕指定的地址或地址段 allow all; #容許全部的地址 } } [root@web01 conf.d]# curl 10.0.0.7/basic_status Active connections: 3 server accepts handled requests 6 6 7 Reading: 0 Writing: 1 Waiting: 2
[root@web ~]# cat /etc/nginx/conf.d/module.conf server { listen 80; server_name module.bgx.com; location /nginx_status { stub_status; allow 127.0.0.1; allow 10.0.0.1/32; #容許地址或地址段 deny all; #拒絕全部人 } }
注意:deny和allow的順序是有影響的
默認狀況下,從第一條規則進行匹配
若是匹配成功,則不繼續匹配下面的內容。
若是匹配不成功,則繼續往下尋找能匹配成功的內容。node
ngx_http_auth_basic_module模塊容許使用HTTP基自己份驗證,驗證用戶名和密碼來限制對資源的訪問。nginx
#使用HTTP基自己份驗證協議啓用用戶名和密碼驗證。 Syntax: auth_basic string| off; Default: auth_basic off; Context: http, server, location, limit_except #指定保存用戶名和密碼的文件 Syntax: auth_basic_user_file file; Default: - Context: http, server, location, limit_except
#可使用htpasswd程序或"openssl passwd"命令生成對應的密碼; name1:passwd1 name2:passwd2 #使用htpaaswd建立新的密碼文件, -c建立新文件 -b容許命令行輸入密碼 [root@xuliangwei ~]# yum install httpd-tools [root@xuliangwei ~]# htpasswd -b -c /etc/nginx/auth_conf tuchuang 123456
server { listen 80; server_name module.bgx.com; access_log off; location /nginx_status { stub_status; auth_basic "Auth access Blog Input your Passwd!"; auth_basic_user_file /etc/nginx/auth_conf; } }
常常會遇到這種狀況,服務器流量異常,負載過大等等。對於大流量惡意的攻擊訪問,會帶來帶寬的浪費,服務器壓力,從而影響業務,針對這種狀況咱們能夠考慮對同一個ip的鏈接數,請求數、進行限制。git
ngx_http_limit_conn_module模塊用於限制定義key的鏈接數,特別是來自單個IP地址的鏈接數。但並不是全部鏈接都被計算在內,僅當鏈接已經讀取了整個請求頭時才計算鏈接。web
Syntax: limit_conn_zone key zone=name:size; Default: — Context: http Syntax: limit_conn zone number; Default: — Context: http, server, location
# http標籤段定義鏈接限制 http{ limit_conn_zone $binary_remote_addr zone=conn_zone:10m; } server { # 同一時刻只容許一個客戶端鏈接 limit_conn conn_zone 1; location / { root /code; index index.html; }
[root@xuliangwei ~]# yum install -y httpd-tools [root@xuliangwei ~]# ab -n 20 -c 2 http://127.0.0.1/index.html
2018/10/24 18:04:49 [error] 28656#28656: *1148 limiting connections by zone "conn_zone", client: 123.66.146.123, server: www.xuliangwei.com, request: "GET / HTTP/1.0", host: "www.xuliangwei.com" 2018/10/24 18:04:49 [error] 28656#28656: *1155 limiting connections by zone "conn_zone", client: 123.66.146.123, server: www.xuliangwei.com, request: "GET / HTTP/1.0", host: "www.xuliangwei.com"
ngx_http_limit_req_module模塊用於限制定義key請求的處理速率,特別單一的IP地址的請求的處理速率。sql
#模塊名ngx_http_limit_req_module Syntax: limit_req_zone key zone=name:size rate=rate; Default: — Context: http Syntax: limit_conn zone number [burst=number] [nodelay]; Default: — Context: http, server, location
# http標籤段定義請求限制, rate限制速率,限制一秒鐘最多一個IP請求 http { limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s; } server { listen 80; server_name module.bgx.com; # 1r/s只接收一個請求,其他請求拒絕處理並返回錯誤碼給客戶端 #limit_req zone=req_zone; # 請求超過1r/s,剩下的將被延遲處理,請求數超過burst定義的數量, 多餘的請求返回503 limit_req zone=req_zone burst=3 nodelay; location / { root /code; index index.html; } }
[root@xuliangwei ~]# yum install -y httpd-tools [root@xuliangwei ~]# ab -n 20 -c 2 http://127.0.0.1/index.html
2018/10/24 07:38:53 [error] 81020#0: *8 limiting requests, excess: 3.998 by zone "req_zone", client: 10.0.0.10, server: module.bgx.com, request: "GET /index.html HTTP/1.0", host: "10.0.0.10" 2018/10/24 07:38:53 [error] 81020#0: *9 limiting requests, excess: 3.998 by zone "req_zone", client: 10.0.0.10, server: module.bgx.com, request: "GET /index.html HTTP/1.0", host: "10.0.0.10"
Nginx鏈接限制沒有請求限制有效?
咱們先來回顧一下http協議的鏈接與請求,首先HTTP是創建在TCP基礎之上, 在完成HTTP請求須要先創建TCP三次握手(稱爲TCP鏈接),在鏈接的基礎上在完成HTTP的請求。
因此多個HTTP請求能夠創建在一次TCP鏈接之上, 那麼咱們對請求的精度限制,固然比對一個鏈接的限制會更加的有效,由於同一時刻只容許一個TCP鏈接進入, 可是同一時刻多個HTTP請求能夠經過一個TCP鏈接進入。因此針對HTTP的請求限制纔是比較優的解決方案。服務器
使用Nginx Location能夠控制訪問網站的路徑, 但一個server容許出現多個location配置, 那多個location出現衝突誰的優先級會更高呢curl
location [=|^~|~|~*|!~|!~*|/] /uri/ { ... }
匹配符 | 匹配規則 | 優先級 |
---|---|---|
= | 精確匹配 | 1 |
^~ | 以某個字符串開頭 | 2 |
~ | 區分大小寫的正則匹配 | 3 |
~* | 不區分大小寫的正則匹配 | 4 |
!~ | 區分大小寫不匹配的正則 | 5 |
!~* | 不區分大小寫不匹配的正則 | 6 |
/ | 通用匹配,任何請求都會匹配到 | 7 |
[root@Nginx conf.d]# cat testserver.conf server { listen 80; server_name module.oldboy.com; location / { default_type text/html; return 200 "location /"; } location =/ { default_type text/html; return 200 "location =/"; } location ~ / { default_type text/html; return 200 "location ~/"; } # location ^~ / { # default_type text/html; # return 200 "location ^~"; # } }
# 優先級最高符號= [root@Nginx conf.d]# curl module.oldboy.com location =/ # 註釋掉精確匹配=, 重啓Nginx [root@Nginx ~]# curl module.oldboy.com location ~/ # 註釋掉~, 重啓Nginx [root@Nginx ~]# curl module.oldboy.com location /
# 通用匹配,任何請求都會匹配到 location / { ... } # 嚴格區分大小寫,匹配以.php結尾的都走這個location location ~ \.php$ { ... } # 嚴格區分大小寫,匹配以.jsp結尾的都走這個location location ~ \.jsp$ { ... } # 不區分大小寫匹配,只要用戶訪問.jpg,gif,png,js,css 都走這條location location ~* .*\.(jpg|gif|png|js|css)$ { ... } # 不區分大小寫匹配 location ~* "\.(sql|bak|tgz|tar.gz|.git)$" { ... }