上一篇咱們把nginx的主配置文件結構大概介紹了下,全局配置段比較經常使用的指令說了一下,http配置段關於http服務器配置指令介紹了下,以及有幾個調優的指令,server_name的匹配機制,錯誤頁面自定義,location匹配機制以及root定義資源路徑和alias定義資源路徑的不一樣,更多的指令和詳細的用法咱們再用到的時候可去官方查看文檔,前文回顧請參考http://www.javashuo.com/article/p-cjicbytu-db.html ;今天這篇主要來聊一聊http配置段關於客戶端請求,對客戶端限制,文件操做優化,訪問控制模塊,basic驗證,status模塊輸出狀態頁的簡單配置;html
一、http配置段關於客戶端請求的一些指令的功能說明linux
keepalive_timeout timeout [header_timeout]; 設定保持鏈接的超時時長,0表示禁止長鏈接;默認是75s;這個值得設定要參考本地服務器的業務來定,看服務器的繁忙程度來衡量一個居中的值,不要太長也不易過短,根據業務的需求來恆定吧!一般狀況下長鏈接咱們須要參考兩個點,第一個點是時間,第二個點是請求的文件數量;好比用戶在必定時間內請求的文件數量達到必定數量就斷開,這種可防止那種一直請求服務器上的資源不給後續請求機會的鏈接;另外一種就是用戶請求的資源不多,咱們對於這種請求應該規定一個時間,不可以也不該該讓一個空閒請求一直鏈接着服務器;一般狀況都是結合兩者來定義長鏈接;nginx
[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秒內只訪問了服務器一次,那麼它和服務端長鏈接會從請求服務器資源那一刻從新倒計時,若是在規定的時間內沒有請求服務資源那麼到時間,鏈接就斷開了,若是在規定的時間請求了服務器,服務器會重置長鏈接的倒計時;web
提示:這種方式去限制客戶端請求顯然是不合理的。因此咱們一般設定服務器長鏈接規則時,還須要考慮在規定的時間內,請求資源的數量;到達設定的數量,及時時間沒到,也得斷開;沒有到達規定的數量,時間到了就必須斷開;正則表達式
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這個值的時候,須要考量一個用戶一次請求大概要請求多少資源,設定一個合理的值。緩存
經過上面的配置和演示,其實單獨配置一種策略是不理想狀態,事實上咱們須要結合本身的網站業務來配置比較好,若是咱們手動指定一個值,那麼另一個值就是默認值,兩個都不指定,那麼兩個都是默認值;一般狀況下都是根據本身業務特性,二者結合來配置是最穩當的作法;bash
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
二、對客戶端進行限制的相關配置指令
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方法之外的其餘方法容許特定的主機使用訪問,其餘客戶端通通拒絕;
三、文件操做優化的配置指令
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; 是否緩存檢查時發生錯誤的文件一類信息
四、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]#
提示:匹配法則是從上到下依次匹配,若是匹配上的就應用匹配到的規則再也不繼續往下匹配,因此順序很關鍵。
五、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表示認證失敗
六、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的消耗也就更多。