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的消耗也就更多。