Nginx之常用基本配置(二)
上一篇我們把nginx的主配置檔案結構大概介紹了下,全域性配置段比較常用的指令說了一下,http配置段關於http伺服器配置指令介紹了下,以及有幾個調優的指令,server_name的匹配機制,錯誤頁面自定義,location匹配機制以及root定義資源路徑和alias定義資源路徑的不同,更多的指令和詳細的用法我們再用到的時候可去官方檢視文件,前文回顧請參考https://www.cnblogs.com/qiuhom-1874/p/12374456.html ;今天這篇主要來聊一聊http配置段關於客戶端請求,對客戶端限制,檔案操作優化,訪問控制模組,basic驗證,status模組輸出狀態頁的簡單配置;
1、http配置段關於客戶端請求的一些指令的功能說明
keepalive_timeout timeout [header_timeout]; 設定保持連線的超時時長,0表示禁止長連線;預設是75s;這個值得設定要參考本地伺服器的業務來定,看伺服器的繁忙程度來衡量一個居中的值,不要太長也不易太短,根據業務的需求來恆定吧!通常情況下長連線我們需要參考兩個點,第一個點是時間,第二個點是請求的檔案數量;比如使用者在一定時間內請求的檔案數量達到一定數量就斷開,這種可防止那種一直請求伺服器上的資源不給後續請求機會的連線;另一種就是使用者請求的資源很少,我們對於這種請求應該規定一個時間,不能夠也不應該讓一個空閒請求一直連線著伺服器;通常情況都是結合二者來定義長連線;
[root@www conf.d]# cat test.conf server { listen 80; server_name www.ilinux.io; keepalive_timeout 10; #keepalive_requests 10; location /test/ { alias /data/web/html/; index test.html; allow all; } error_page 404 403 /error.html; location /error.html { root /data/web/html/error; } } [root@www conf.d]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@www conf.d]# nginx -s reload [root@www conf.d]#
提示:以上配置表示開啟長連線,並指定超時時長為10s;它這個時間是這樣計算的,每請求一次就重置一下超時時長,比如使用者在和伺服器建立連線後,在10秒內只訪問了伺服器一次,那麼它和服務端長連線會從請求伺服器資源那一刻重新倒計時,如果在規定的時間內沒有請求服務資源那麼到時間,連線就斷開了,如果在規定的時間請求了伺服器,伺服器會重置長連線的倒計時;
提示:這種方式去限制客戶端請求顯然是不合理的。所以我們通常設定伺服器長連線規則時,還需要考慮在規定的時間內,請求資源的數量;到達設定的數量,及時時間沒到,也得斷開;沒有到達規定的數量,時間到了就必須斷開;
keepalive_requests numbers;在一次長連線上所允許請求的資源的最大數量,預設為100;
[root@www conf.d]# cat test.conf server { listen 80; server_name www.ilinux.io; #keepalive_timeout 10; keepalive_requests 4; location /test/ { alias /data/web/html/; index test.html; allow all; } error_page 404 403 /error.html; location /error.html { root /data/web/html/error; } } [root@www conf.d]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@www conf.d]# nginx -s reload [root@www conf.d]#
提示:以上配置表示,開啟keepalive長連線,只要使用者請求資源數量到達4個就斷開連線,這樣配置就只是去看使用者請求資源的數量,而沒有時間限制,當然我們不設定超時時間,nginx也是有一個預設值的
提示:可以看到我們用telnet模擬使用者訪問web伺服器請求資源,當我們請求資源數量到達我們預先設定的數量時 ,長連線就斷開了,這樣的配置其實也不合理,如果空閒連線太多,那麼後面的訪問請求就進不來,所以設定keepalive_requests這個值的時候,需要考量一個使用者一次請求大概要請求多少資源,設定一個合理的值。
通過上面的配置和演示,其實單獨配置一種策略是不理想狀態,事實上我們需要結合自己的網站業務來配置比較好,如果我們手動指定一個值,那麼另外一個值就是預設值,兩個都不指定,那麼兩個都是預設值;通常情況下都是根據自己業務特性,兩者結合來配置是最妥當的做法;
keepalive_disable [msie6 | safari | none]; ; 限定某些瀏覽器禁止長連線功能,none表示不禁用任何瀏覽器保持活動連線;safari表示禁用與macOS和類似macOS的作業系統上的Safari和類似Safari的瀏覽器保持活動連線。msie6表示將禁用與舊版本MSIE的保持活動連線;
send_timeout time;向客戶端傳送響應報文的超時時長,此處,是指兩次寫操作之間的間隔時長;
client_body_buffer_size size;用於接收客戶端請求報文的body部分的緩衝區大小;預設為16k;超出此大小時,其將被暫存到磁碟上的由client_body_temp_path指令所定義的位置;
client_body_temp_path path [level1 [level2 [level3]]];設定用於儲存客戶端請求報文的body部分的臨時儲存路徑及子目錄結構和數量;通常情況下使用者請求報文是不帶body的,除開使用者往伺服器上提交內容或檔案。
示例:
client_body_temp_path /var/tmp/client_body 2 1 1 ;
1:表示用一位16進位制數字表示一級子目錄;0-f
2:表示用2位16程序數字表示二級子目錄:00-ff
2:表示用2位16程序數字表示三級子目錄:00-ff
2、對客戶端進行限制的相關配置指令
limit_rate rate;限制響應給客戶端的傳輸速率,單位是bytes/second,0表示無限制;
limit_except method ... { ... }限制對指定的請求方法之外的其它方法的使用客戶端;
示例:
[root@www conf.d]# cat test.conf server { listen 80; server_name www.ilinux.io; keepalive_timeout 5; keepalive_requests 4; keepalive_disable none; location /test/ { alias /data/web/html/; index test.html; limit_except HEAD { allow 192.168.0.99; deny all; } } error_page 404 403 /error.html; location /error.html { root /data/web/html/error; } } [root@www conf.d]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@www conf.d]# nginx -s reload [root@www conf.d]#
提示:以上配置表示除了HEAD以外的其他請求方法,允許192.168.0.99使用訪問,其他客戶端全部拒絕,意思就是其他客戶端只能用HEAD方法請求www.ilinux.io/test/這個URL;還有一點需要說明的是GET方法是包含HEAD方法的,HEAD方法不包含GET,所以這樣限制後,其他客戶端只能通過HEAD方法訪問伺服器的。
[root@www conf.d]# ip a s ens33 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:4a:bd:74 brd ff:ff:ff:ff:ff:ff inet 192.168.0.30/24 brd 192.168.0.255 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe4a:bd74/64 scope link valid_lft forever preferred_lft forever [root@www conf.d]# telnet www.ilinux.io 80 Trying 192.168.0.30... Connected to www.ilinux.io. Escape character is '^]'. GET /test/ HTTP/1.1 Host:www.ilinux.io HTTP/1.1 403 Forbidden Server: nginx/1.16.1 Date: Sat, 29 Feb 2020 03:58:48 GMT Content-Type: text/html Content-Length: 11 Connection: keep-alive ETag: "5e580a61-b" error page Connection closed by foreign host. [root@www conf.d]# telnet www.ilinux.io 80 Trying 192.168.0.30... Connected to www.ilinux.io. Escape character is '^]'. HEAD /test/ HTTP/1.1 Host:www.ilinux.io HTTP/1.1 200 OK Server: nginx/1.16.1 Date: Sat, 29 Feb 2020 03:59:53 GMT Content-Type: text/html Content-Length: 30 Last-Modified: Fri, 28 Feb 2020 14:00:16 GMT Connection: keep-alive ETag: "5e591cf0-1e" Accept-Ranges: bytes Connection closed by foreign host. [root@www conf.d]#
提示:我們用其他客戶端用GET方法訪問伺服器時響應碼數403沒有許可權,用HEAD方法訪問伺服器時響應碼數200,說明以上配置是對HEAD以外的其他方法對客戶端起到了限定作用;通常情況下我們會限定除GET HEAD方法以外的其他方法允許特定的主機使用訪問,其他客戶端統統拒絕;
3、檔案操作優化的配置指令
aio on | off | threads[=pool];是否啟用aio(非同步IO)功能
directio size | off;在Linux主機啟用O_DIRECT標記,此處意味檔案大於等於給定的大小時使用,例如directio 4m;通常我們使用預設即可
open_file_cache max=N [inactive=time]|off ;是否啟用檔案快取,預設是open_file_cache off不啟用的;nginx可以快取的資訊有三種:第一是檔案的描述符、大小、和最近一次修改時間,第二種是開啟的目錄結構,第三種是對於沒有找到的或者沒有訪問許可權的相關資訊;max=N 表示啟用檔案快取功能並指定可快取的快取項上限;如果達到上限後會使用LRU(最近最少使用)演算法實現快取管理;inactive=time表示快取項的非活動時長,在此處指定的時長內未被命中的或命中的次數少於open_file_cache_min_uses指令所指定的次數的快取項,我們把這種未命中的或命中次數小於open_file_cache_min_uses指令所指定的次數的快取叫非活動快取項,這種非活動快取項在指定時間內未被命中或命中次數少於指定次數時就會被清理,因為它快取下來未命中,或沒有達到最少命中次數,對於這種快取項我們認為快取下來是沒有意義的。預設是60秒
open_file_cache_min_uses number;指定快取項最小命中次數,如果快取項在一定時間內命中次數小於該值,那麼我們認為該快取項為非活動快取項;反之在一定時間內快取項的命中次數大於該值,就表示該快取項比較活躍,能夠給我們帶來加速的效果,我們把這種快取項歸類為活動快取項;
open_file_cache_valid time;快取項有效性的檢查頻率,預設是60秒;
open_file_cache_errors on|off; 是否快取檢查時發生錯誤的檔案一類資訊
4、ngx_http_access_module模組:實現基於ip的訪問控制功能
allow:指定允許的IP地址或網段,也可以指定unit sock檔案,all表示允許所有主機
deny:指定拒絕的IP地址或網段,也可以指定unit sock檔案,all表示拒絕所有主機
示例:
[root@www conf.d]# cat test.conf server { listen 80; server_name www.ilinux.io; keepalive_timeout 5; keepalive_requests 4; keepalive_disable none; aio on; open_file_cache max=100 inactive=10s; open_file_cache_min_uses 2; open_file_cache_errors on; open_file_cache_valid 10s; location /test/ { alias /data/web/html/; index test.html; limit_except GET { allow 192.168.0.99; deny all; } deny 192.168.0.30; allow 192.168.0.0/24; deny all; } error_page 404 403 /error.html; location /error.html { root /data/web/html/error; } } [root@www conf.d]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@www conf.d]# nginx -s reload [root@www conf.d]# ip a s ens33 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:4a:bd:74 brd ff:ff:ff:ff:ff:ff inet 192.168.0.30/24 brd 192.168.0.255 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe4a:bd74/64 scope link valid_lft forever preferred_lft forever [root@www conf.d]# curl http://www.ilinux.io/test/ error page [root@www conf.d]# curl -I http://www.ilinux.io/test/ HTTP/1.1 403 Forbidden Server: nginx/1.16.1 Date: Sat, 29 Feb 2020 05:50:52 GMT Content-Type: text/html Content-Length: 11 Connection: keep-alive ETag: "5e580a61-b" [root@www conf.d]#
提示:匹配法則是從上到下依次匹配,如果匹配上的就應用匹配到的規則不再繼續往下匹配,所以順序很關鍵。
5、ngx_http_auth_basic_module模組:實現基於使用者的訪問控制,使用basic機制進行使用者認證;
auth_basic string |off :提示使用者的認證說明資訊
auth_basic_user_file file:指定存放使用者名稱和密碼的認證檔案
示例:
[root@www ~]# mkdir /data/web/html/login [root@www ~]# cd /data/web/html/login [root@www login]# echo '<h1>login seccessful</h1>' >index.html [root@www login]# cat index.html <h1>login seccessful</h1> [root@www login]# htpasswd -c -m /etc/nginx/conf.d/.ngxpasswd jerry New password: Re-type new password: Adding password for user jerry [root@www login]# cat /etc/nginx/conf.d/.ngxpasswd jerry:$apr1$PuDyjSZB$9xRiL/GJZErL9Nslzjk1u/ [root@www login]# cat /etc/nginx/conf.d/login.conf server { listen 80; server_name 192.168.0.30; root /data/web/html; location ~* /login { auth_basic "please input you username and passwd login"; auth_basic_user_file /etc/nginx/conf.d/.ngxpasswd; } } [root@www login]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@www login]# nginx -s reload [root@www login]#
提示:存放使用者名稱和密碼的檔案,需要用htpasswd工具來建立,如果沒有這個工具可以安裝httpd-tools包即可,接下來我們用瀏覽器訪問下這個頁面看看效果
提示:狀態碼為401表示認證失敗
6、ngx_http_stub_status_module模組:用於輸出nginx的基本狀態資訊;
示例:
[root@www conf.d]# cat login.conf server { listen 80; server_name 192.168.0.30; root /data/web/html; location ~* /login { auth_basic "please input you username and passwd login"; auth_basic_user_file /etc/nginx/conf.d/.ngxpasswd; } location /basic_status { stub_status; } } [root@www conf.d]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@www conf.d]# nginx -s reload [root@www conf.d]#
提示:以上配置表示,當客戶端訪問/basic_status這個uri時,就會訪問到nginx的狀態頁面
提示:Active connections: 表示活動狀態的連線數;accepts:表示已經接受的客戶端請求的總數;handled:表示已經處理完成的客戶端請求的總數;requests:表示客戶端發來的總的請求數;Reading:表示處於讀取客戶端請求報文首部的連線的連線數;Writing:表示處於向客戶端傳送響應報文過程中的連線數;Waiting:表示處於等待客戶端發出請求的空閒連線數;
當然狀態頁的我們是不需要任何人都可以看到,我們可以選擇上面的basic驗證,只有提供使用者名稱和密碼的使用者才能訪問該狀態頁,如下
[root@www conf.d]# cat login.conf server { listen 80; server_name 192.168.0.30; root /data/web/html; location /basic_status { stub_status; auth_basic "please input you username and passwd login"; auth_basic_user_file /etc/nginx/conf.d/.ngxpasswd; } } [root@www conf.d]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@www conf.d]# nginx -s reload [root@www conf.d]#
提示:其實上面的配置很好理解,就是對訪問/basic_status這個URI時,我們就需要提供使用者名稱和密碼來驗證,如下
ngx_http_gzip_module:使用gzip方式壓縮響應報文大小
gzip on | off;是否開啟gzip壓縮功能,on表示開啟,off表示關閉;可用於http配置段,server配置段,location 配置段和if in location配置段裡;預設off的
gzip_comp_level level;指定壓縮級別,預設是1,級別取值在1-9,數字越大壓縮比就越大,當然cpu佔用的資源就越多;這個值要考慮的點就是網路IO和CPU效能,通常是壓縮級別越高,對網路IO就越小,對cpu就越忙,反之壓縮級別低,對網路IO就越大,CPU就相對要閒一點;
gzip_disable regex ...;禁用對具有匹配任何指定正則表示式的“User_Agent”請求頭的響應進行gzipping。
示例:禁止firefox瀏覽器響應報文壓縮功能
[root@www conf.d]# cat login.conf server { listen 80; server_name 192.168.0.30; root /data/web/html; gzip on; gzip_types text/xml text/plain; gzip_disable "Firefox"; location /basic_status { stub_status; auth_basic "please input you username and passwd login"; auth_basic_user_file /etc/nginx/conf.d/.ngxpasswd; } } [root@www conf.d]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@www conf.d]# nginx -s reload [root@www conf.d]#
提示:以上配置表示啟用gzip 壓縮功能,壓縮mime型別為text/xml text/plain,對請求報文User_Agent包含“Firefox”的客戶端我們不啟用gizp壓縮
提示:可以看到我們用firefox瀏覽器去訪問狀態頁數沒有啟用gzip 壓縮,啟用了gzip壓縮是可以在響應報文裡看到一個Content-Encoding的欄位,很明顯上圖沒有這個欄位;我們在不更改伺服器配置,用其他瀏覽器訪問同樣的頁面,看看是否開啟了gzip壓縮功能呢?
提示:可以看到用谷歌瀏覽器去訪問狀態頁,顯示響應報文是通過gzip壓縮後響應的。
gzip_min_length length;啟用壓縮功能的響應報文大小閾值;意思就是說客戶端請求的資源至少要達到多少才啟用壓縮;預設是20位元組;
gzip_buffers number size;支援實現壓縮功能時為其配置的緩衝區數量及每個快取區的大小;預設是gzip_buffers 32 4k | 16 8K;
gzip_types mime-type ...;壓縮過濾器,僅對此處設定的MIME型別的內容啟用壓縮功能;
gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;nginx作為代理伺服器接收到從被代理伺服器傳送的響應報文後,在何種條件下啟用壓縮功能的;off表示對代理的請求不啟用壓縮;expried表示如果響應報文頭包含“Expires”欄位和一個禁用快取的值,就啟用壓縮;no-cache,no-store,private:表示從被地裡伺服器收到的響應報文首部的Cache-Control的值為這三者中的任何一個就啟用壓縮功能;no_last_modified表示響應報文首部不包含Last-Modifiedz欄位就啟用壓縮功能;no_etag表示響應報文沒有etag欄位就啟用壓縮功能;auth表示如果請求報文頭裡包含“Authorization”欄位就啟用壓縮;any表示為所有代理請求啟用壓縮。預設值是off;
示例:
在不配置gzip功能時,我們在瀏覽器可以看到服務端相應報文沒有Content-Encoding欄位的,如下
提示:除錯控制檯可以按F12調出來。從上面的響應頭裡我們是沒有看到Content-Encoding欄位的,Content-Length的值為115位元組。接下來我們配置伺服器啟用gizp壓縮,然後在看看響應報文會有什麼變化
[root@www conf.d]# cat login.conf server { listen 80; server_name 192.168.0.30; root /data/web/html; gzip on; gzip_types text/xml text/plain; gzip_min_length 64; gzip_comp_level 5; gzip_proxied any; location /basic_status { stub_status; auth_basic "please input you username and passwd login"; auth_basic_user_file /etc/nginx/conf.d/.ngxpasswd; } } [root@www conf.d]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@www conf.d]# nginx -s reload [root@www conf.d]#
提示:上述配置表示啟用gzip壓縮功能;對mime型別為text/xml 和text/plain 的資源進行壓縮,壓縮最小長度為64位元組,壓縮級別為5,為所有代理請求啟用壓縮;過載nginx後我們在來看看服務端的響應報文有什麼變化;
提示:從上面的截圖看,我們在伺服器上啟用gzip壓縮後,響應頭部多了一個Content-Encoding欄位和Transfer-Encoding這兩響應頭部,前者表示使用內容編碼是gizp,後者表示傳輸編碼是chunked,心細的你可能會發現響應報文少了一個欄位Content-Length欄位,這是為什麼呢?就是因為我們啟用了壓縮功能後,標記一個報文是否傳輸完畢不再是依靠Content-Encoding來標識資源是否傳完,是Transfer-Encoding內部傳輸模式會帶一個結束符,告訴瀏覽器請求的資源已經傳完了,不至於讓瀏覽器一直等待服務端響應。心細的你可能還發現了,傳輸的位元組比實際大小還要多,這是為什麼呢?原因很簡單,就是因為我們訪問的資源太小了,而啟用gzip後傳輸模式發生變化,響應頭部不一樣(多了欄位),所以我們去壓縮小檔案時,反而響應報文比原始檔案要大一些;我們訪問較大的頁面就可以看到gzip的效果了;
提示:是不是很大程度上的節省了網路頻寬呢,所以通常情況下我們頁面資源相對較大時,可有考慮啟用壓縮,特別是文字檔案的壓縮效果是最好的;這裡還需要提醒一下圖片是不能再壓縮了,因為圖片本來就是一個被壓縮後儲存的,如果再次進行壓縮,可能效果還沒有不壓縮好;當然啟用了壓縮,讓網路IO減小了,但是對CPU的負擔就重了一些,畢竟壓縮要消耗cup效能的;所以壓縮就是拿CPU效能換網路頻寬;你把資源壓縮得越小,當然使用的頻寬就越小,當然對CPU的消耗也就更多。