九、nginx經常使用基礎模塊

1Nginx目錄索引

ngx_http_autoindex_module模塊處理以斜槓字符('/')結尾的請求(就是處理location /),並生成目錄列表。當ngx_http_index_module模塊找不到索引文件時,一般會將請求傳遞給模塊ngx_http_autoindex_module。(即ngx_http_index_module模塊找不到首頁文件,就會交給ngx_http_autoindex_module把當前目錄下的全部文件生成目錄列表)php

1.1.指令

#啓用或禁用目錄列表輸出,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

1.2.示例配置

[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顯示的是確切的大小)
    }
}

2Nginx狀態監控

ngx_http_stub_status_module模塊提供對基本狀態信息的訪問。
默認狀況下不構建此模塊,應使用--with-http_stub_status_module 配置參數啓用它 。css

2.1.指令

Syntax: stub_status;
Default: —
Context: server, location

2.2.示例配置

[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;
    }
}

2.3.此配置建立一個簡單的網頁,其基本狀態數據可能以下所示:

2.4.提供如下狀態信息

Active connections  # 當前活動客戶端鏈接數,包括Waiting等待鏈接數。
accepts             # 已接受總的TCP鏈接數。
handled             # 已處理總的TCP鏈接數。
requests            # 客戶端總的http請求數。

Reading             # 當前nginx讀取請求頭的鏈接數。
Writing             # 當前nginx將響應寫回客戶端的鏈接數。
Waiting             # 當前等待請求的空閒客戶端鏈接數。

# 注意, 一次TCP的鏈接,能夠發起屢次http的請求, 以下參數可配置進行驗證
keepalive_timeout  0;   # 相似於關閉長鏈接
keepalive_timeout  65;  # 65s沒有活動則斷開鏈接

3Nginx訪問控制

ngx_http_access_module模塊容許限制對某些客戶端地址的訪問。html

3.1.指令

#容許配置語法
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

3.2.示例配置,拒絕指定的IP訪問該網站的/nginx_status, 其餘IP所有容許訪問

[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

3.3.示例配置,只容許指定的來源IP能訪問/nginx_status, 其它網段所有拒絕

[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

4Nginx資源限制

ngx_http_auth_basic_module模塊容許使用HTTP基自己份驗證,驗證用戶名和密碼來限制對資源的訪問。nginx

4.1.指令

#使用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

4.2.指定保存用戶名和密碼的文件,格式以下:

#可使用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

4.3.示例配置,基於用戶名和密碼認證明踐

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;
    }
}

5Nginx訪問限制

常常會遇到這種狀況,服務器流量異常,負載過大等等。對於大流量惡意的攻擊訪問,會帶來帶寬的浪費,服務器壓力,從而影響業務,針對這種狀況咱們能夠考慮對同一個ip的鏈接數,請求數、進行限制。git

5.1.ngx_http_limit_conn_module模塊用於限制定義key的鏈接數

ngx_http_limit_conn_module模塊用於限制定義key的鏈接數,特別是來自單個IP地址的鏈接數。但並不是全部鏈接都被計算在內,僅當鏈接已經讀取了整個請求頭時才計算鏈接。web

5.1.1.指令

Syntax:  limit_conn_zone key zone=name:size;
Default: —
Context: http

Syntax: limit_conn zone number;
Default: —
Context: http, server, location

5.1.2.設置共享內存區域和給定鍵值的最大容許鏈接數。超過此限制時,服務器將返回錯誤以回覆請求

# http標籤段定義鏈接限制
http{
    limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
}
server {
    # 同一時刻只容許一個客戶端鏈接
    limit_conn conn_zone 1; 

    location / {
        root /code;
        index index.html;
    }

5.1.3.使用ab工具進行壓力測試

[root@xuliangwei ~]# yum install -y httpd-tools
[root@xuliangwei ~]# ab -n 20 -c 2  http://127.0.0.1/index.html

5.1.4.nginx日誌結果

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"

5.2.ngx_http_limit_req_module模塊用於限制定義key請求的處理速率

ngx_http_limit_req_module模塊用於限制定義key請求的處理速率,特別單一的IP地址的請求的處理速率。sql

5.2.1.指令

#模塊名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

5.2.2.設置共享內存區域和請求的最大突發大小。過多的請求被延遲,直到它們的數量超過最大的限制,在這種狀況下請求以錯誤終止。

# 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;
    }
}

5.2.3.使用ab工具進行壓力測試

[root@xuliangwei ~]# yum install -y httpd-tools
[root@xuliangwei ~]# ab -n 20 -c 2  http://127.0.0.1/index.html

5.2.4.nginx日誌結果

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的請求限制纔是比較優的解決方案。服務器

6Nginx Location

使用Nginx Location能夠控制訪問網站的路徑, 但一個server容許出現多個location配置, 那多個location出現衝突誰的優先級會更高呢curl

6.1.Location語法示例

location [=|^~|~|~*|!~|!~*|/] /uri/ { ...
}

6.2.Location語法優先級排列

匹配符 匹配規則 優先級
= 精確匹配 1
^~ 以某個字符串開頭 2
~ 區分大小寫的正則匹配 3
~* 不區分大小寫的正則匹配 4
!~ 區分大小寫不匹配的正則 5
!~* 不區分大小寫不匹配的正則 6
/ 通用匹配,任何請求都會匹配到 7

6.3.配置網站驗證Location優先級

[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 ^~";
    # }
}

6.4.測試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 /

6.5.Locaiton規則配置應用場景

# 通用匹配,任何請求都會匹配到
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)$" {
    ...
}
相關文章
相關標籤/搜索