找回密码
 加入怎通
查看: 141|回复: 0

详解Nginx访问控制与参数调优的方法(nginx查看访问记录)

[复制链接]
我来看看 发表于 2023-03-22 06:43:54 | 显示全部楼层 |阅读模式
* J! u8 H" O, p$ U0 i7 B5 E( {

Nginx全局变量Nginx中有很多的全局变量,可以通过$变量名来使用。下面列举一些常用的全局变量:

$ q7 z$ B* C3 @: J& X

Nginx locationlocation作用location指令的作用是根据用户请求的URI来执行不同的应用即根据用户请求的网站地址URL进行匹配,匹配成功就进行相应的操作语**ocation的语法规则:location [=|~|~*|^~] /uri/ { … }。

2 y* e2 d7 P0 V( ]: O

location匹配的变量是$uri关于几种字符的说明

( h% O' f5 r* _

规则优先级= 高于 ^~ 高于 ~* 等于 ~ 高于 /示例1

3 B2 E8 U7 F7 i6 c" b

注意:有些资料上介绍location支持不匹配 !~如: location !~ png{ ... }这是错误的,location不支持 !~如果有这样的需求,可以通过if(location优先级小于if )来实现,如: if ($uri !~ png) { ... }

6 m# o5 \" j) D- B

访问控制web2.0时代,很多网站都是以用户为中心,网站允许用户发布内容到服务器由于为用户开放了上传功能,因此有很大的安全风险,比如黑客上传木马程序等等因此,访问控制就很有必要配置了deny与allow。

$ ~1 v; K8 N7 z8 f- U {: ~. U0 R

字面上很容易理解就是拒绝和允许Nginx的deny和allow指令是由ngx_http_access_module模块提供,Nginx安装默认内置了该模块语法语法:allow/deny address | CIDR | unix: | all。

# s' V7 h( u* @

它表示,允许/拒绝某个ip或者一个ip段访问.如果指定unix:,那将允许socket的访问注意:unix在1.5.1中新加入的功能在nginx中,allow和deny的规则是按顺序执行的示例1:location /% A2 {% @4 ^* I/ z* C0 ` { 8 a6 ^ A8 s$ A4 g allow 192.168.0.0/24; 0 L% A" _. _6 k. E3 b5 T, g+ o+ X' e6 s allow 127.0.0.1; ; J6 w/ t- s7 ?7 j* l8 ^ deny all;) a* u4 j/ j# X R }" A5 h3 i$ a( C4 D! h/ O

r. t7 T# y: M& p

说明:这段配置值允许192.168.0.0/24网段和127.0.0.1的请求,其他来源IP全部拒绝示例2:location ~ "admin"0 w7 I( ]; ~- W0 L4 s- ]. ` {; Q" d7 ~: J' X( z9 H allow 192.168.30.7; ; `, s: T" a, G7 |1 x deny all. Y- E- P) y2 w- s6 S } % [3 Z+ V1 T1 Y# {

6 u: H( p. } {# t/ M0 Y# u. [5 n( J; @

说明:访问的uri中包含admin的请求,只允许192.168.30.7这个IP的请求基于location的访问控制日常上,访问控制基本是配合location来做配置的,直接例子吧示例1:location /blog/ : s( Z# j, s" f4 V8 G! d { u8 s! Y7 p$ t* f3 {% J% v deny all; P. [0 {$ I6 c x# e3 B }$ S2 M# G0 ^; W, B' G3 S4 W

3 ?+ ~! N% ^& ?: L! R

说明:针对/blog/目录,全部禁止访问,这里的deny all;可以改为return 403;.示例2location ~ ".bak|\.ht") S5 o+ Y9 O3 h! a7 @( x# ?* Y3 s Q {( Y$ W; t! y4 F9 q" n+ W3 T return 403; + I+ u: @2 Y5 A7 V+ U' B } 3 Z' G5 ~$ Q$ m5 w5 \) [# _3 k8 v 说明:访问的uri中包含.bak字样的或者包含.ht的直接返回403状态码。

2 ]% f( z) m. W3 o( e8 P

测试链接举例:www.syushin.com/abc.bakwww.syushin.com/blog/123/.htalskdjf如果用户输入的URL是上面其中之一都会返回403示例3location ~ (data|cache|tmp|image|attachment).*\.php$7 ?- E5 W* ?' t/ l { 5 ~3 o K, [) R1 T8 M deny all; * O, T, C6 u6 P/ j' d8 | } : q7 C9 B6 S( g v

+ {9 B' O u. D' Q6 V5 Z2 }$ X! D6 f3 N

说明:请求的uri中包含data、cache、tmp、image、attachment并且以.php结尾的,全部禁止访问测试链接举例:www.xxxxxx.com/aming/cache/1.phpwww.xxxxxxx.com/image/123.phps

6 c* n( M2 y8 M9 T' q

www.xxxxxx.com/aming/datas/1.php基于$document_uri的访问控制前面介绍了内置变量$document_uri含义是当前请求中不包含指令的URI如www.123.com/1.php?a=1&b=2的$document_uri就是1.php,不包含后面的参数。

: K+ ]0 U* t+ B; P9 u

我们可以针对这个变量做访问控制示例1if ($document_uri ~ "/admin/") 9 \" D; ]( E! f' e( ?# k; {+ b) @ { . ^5 r8 @+ c) S& {; s return 403;* f) q' G. Y- O8 x* A }$ M0 `% E% Y `: m7 o9 B( _ 说明:当请求的uri中包含/admin/时,直接返回403.注意:if结构中不支持使用allow和deny。

0 |( Z( e [# g( H+ B" n

测试链接:1. www.xxxxx.com/123/admin/1.html 匹配2. www.xxxxx.com/admin123/1.html 不匹配3. www.xxxxx.com/admin.php 不匹配

: X6 }: }/ y4 E' _6 x

示例2if ($document_uri = /admin.php) , I8 g. P0 p* F% _# o9 n8 ~ { z% ^4 A, L2 B9 k, U) Y return 403; 0 I6 Y! o/ Z" z4 s8 e" k }5 Z& j# y2 f. E& i6 z0 w, A; C 说明:请求的uri为/admin.php时返回403状态码测试链接:1. www.xxxxx.com/admin.php # 匹配。

9 G/ k& ]$ s, r) e

2. www.xxxxx.com/123/admin.php # 不匹配示例3if ($document_uri ~ /data/|/cache/.*\.php$)3 l4 Y4 }- H1 w, A { / r( c9 @) t p+ H8 S return 403; ' l. L/ x+ G) w3 n1 L } 6 O1 X: [; p& o3 N8 p/ c 说明:请求的uri包含data或者cache目录,并且是php时,返回403状态码。

1 P: w5 F7 U) n4 w. T. q6 Y

测试链接:1. www.xxxxx.com/data/123.php # 匹配2. www.xxxxx.com/cache1/123.php # 不匹配基于$request_uri访问控制$request_uri比$docuemnt_uri多了请求的参数。

8 |8 a' I6 i; h# S [0 q- z0 k

主要是针对请求的uri中的参数进行控制示例if ($request_uri ~ "gid=\d{9,12}")( P) T3 {. M! U; B# R& |, Z { & |9 ?( S3 v% d; a% ?/ ~ return 403; 8 ~' a" `3 C0 T }. q/ X }- D5 l9 e" ^8 m, `& b 说明:\d{9,12}是正则表达式,表示9到12个数字,例如gid=1234567890就符号要求。

- W/ p" b- b4 ]9 t5 m" ~5 m6 [

测试链接:1. www.xxxxx.com/index.php?gid=1234567890&pid=111 匹配2. www.xxxxx.com/gid=123 不匹配背景知识:曾经有一个客户的网站cc攻击,对方发起太多类似这样的请求:/read-123405150-1-1.html

* L1 {. X! l) t* }

实际上,这样的请求并不是正常的请求,网站会抛出一个页面,提示帖子不存在所以,可以直接针对这样的请求,return 403状态码基于$http_user_agent的访问控制(反爬虫)user_agent可以简单理解成浏览器标识,包括一些蜘蛛爬虫都可以通过user_agent来辨识。

) X @) c$ ~0 d" E

假如观察访问日志,发现一些搜索引擎的蜘蛛对网站访问特别频繁,它们并不友好为了减少服务器的压力,其实可以把除主流搜索引擎蜘蛛外的其他蜘蛛爬虫全部封掉示例if ($user_agent ~ YisouSpider|MJ12bot/v1.4.2|YoudaoBot|Tomato)% ]4 K% N3 u( F3 ? {- n2 L9 E( e- ~$ L return 403;1 @1 n( W. B3 V) {, W }1 \/ _3 D0 w7 N) {1 y0 I1 ~; I5 x

U! k+ n* ~9 v K: h; q2 c4 ~

说明:user_agent包含以上关键词的请求,全部返回403状态码测试:1. curl -A "123YisouSpider1.0"2. curl -A "MJ12bot/v1.4.1"基于$http_referer的访问控制。

2 t/ }- x0 |4 \- n( I; A# Y' b

$http_referer除了可以实现防盗链的功能外,还可以做一些特殊的需求比如:网站被黑挂马,搜索引擎收录的网页是有问题的,当通过搜索引擎点击到网站时,却显示一个BC网站由于查找木马需要时间,不能马上解决,为了不影响用户体验,可以针对此类请求做一个特殊操作。

4 z- s: V2 i8 K, {1 Z

比如,可以把从百度访问的链接直接返回404状态码,或者返回一段html代码示例if ($http_referer ~ baidu.com)9 r1 A% ]9 h& V; L { % o& ~/ s, T) {( E m3 b6 O return 404; 4 |; c9 P& l6 u' E } & [* G0 a: h9 l2 o 或者if ($http_referer ~ baidu.com)6 q) c: b2 }2 ~0 i { + K f5 u/ ~: c$ A+ p0 m& ` return 200 "window.location.href=//$host$request_uri;";. x# q9 S: p/ d! q } , V n7 B, _) x, e) ~8 S

5 |4 p s7 |& z4 @

Nginx参数优化Nginx作为高性能web服务器,即使不特意调整配置参数也可以处理大量的并发请求当然,配置调优会使Nginx性能更加强悍,配置参数需要结合服务器硬件性能等做参考worker进程优化worker_processes num;

1 x. M2 Q; L. u9 ?

该参数表示启动几个工作进程,建议和本机CPU核数保持一致,每一核CPU处理一个进程,num表示数字worker_rlimit_nofile它表示Nginx最大可用的文件描述符个数,需要配合系统的最大描述符,建议设置为102400。

* t) \" u8 {7 ?0 u/ z& g! {

还需要在系统里执行ulimit -n 102400才可以也可以直接修改配置文件/etc/security/limits.conf修改增加:#* soft nofile 655350 (去掉前面的#)#* hard nofile 655350 (去掉前面的#)

- E" f$ y$ ]+ R# H9 c

worker_connections该参数用来配置每个Nginx worker进程最大处理的连接数,这个参数也决定了该Nginx服务器最多能处理多少客户端请求(worker_processes * worker_connections)

1 w/ W. Y1 F5 |

建议把该参数设置为10240,不建议太大http/tcp连接数优化use epoll使用epoll模式的事件驱动模型,该模型为Linux系统下最优方式multi_accept on使每个worker进程可以同时处理多个客户端请求。

Y6 K$ r/ I" U2 ` f# _. z

sendfile on使用内核的FD文件传输功能,可以减少user mode和kernel mode的切换,从而提升服务器性能tcp_nopush on当tcp_nopush设置为on时,会调用tcp_cork方法进行数据传输。

" d1 F5 ^4 ^! l" w

使用该方法会产生这样的效果:当应用程序产生数据时,内核不会立马封装包,而是当数据量积累到一定量时才会封装,然后传输tcp_nodelay on不缓存data-sends(关闭 Nagle 算法),这个能够提高高频发送小数据报文的实时性。

. y7 z3 ], f! N n8 C

(关于Nagle算法)【假如需要频繁的发送一些小包数据,比如说1个字节,以IPv4为例的话,则每个包都要附带40字节的头,也就是说,总计41个字节的数据里,其中只有1个字节是我们需要的数据为了解决这个问题,出现了Nagle算法。

d! O3 d, }8 g4 L: u

它规定:如果包的大小满足MSS,那么可以立即发送,否则数据会被放到缓冲区,等到已经发送的包被确认了之后才能继续发送通过这样的规定,可以降低网络里小包的数量,从而提升网络性能keepalive_timeout。

. T! c" H# R3 ?, P" [& ^! b

定义长连接的超时时间,建议30s,太短或者太长都不一定合适,当然,最好是根据业务自身的情况来动态地调整该参数keepalive_requests定义当客户端和服务端处于长连接的情况下,每个客户端最多可以请求多少次,可以设置很大,比如50000.。

/ R& S7 I4 `7 O& }* \" J

reset_timeout_connection on设置为on的话,当客户端不再向服务端发送请求时,允许服务端关闭该连接client_body_timeout客户端如果在该指定时间内没有加载完body数据,则断开连接,单位是秒,默认60,可以设置为10。

% y+ l, i5 t+ V1 C

send_timeout这个超时时间是发送响应的超时时间,即Nginx服务器向客户端发送了数据包,但客户端一直没有去接收这个数据包如果某个连接超过send_timeout定义的超时时间,那么Nginx将会关闭这个连接。

9 k( ^" X, k( Y8 b% p8 {

单位是秒,可以设置为3压缩对于纯文本的内容,Nginx是可以使用gzip压缩的使用压缩技术可以减少对带宽的消耗由ngx_http_gzip_module模块支持配置如下:gzip on; //开启gzip功能 ! U. Q/ `$ L$ s- d0 { gzip_min_length 1024; //设置请求资源超过该数值才进行压缩,单位字节$ Z' ^) V+ T3 P) O( g) D- x" L8 Q gzip_buffers 16 8k; //设置压缩使用的buffer大小,第一个数字为数量,第二个为每个buffer的大小" ?8 V2 Q/ E1 _) V6 n gzip_comp_level 6; //设置压缩级别,范围1-9,9压缩级别最高,也最耗费CPU资源 $ t; m f3 a& e" N1 F3 J gzip_types text/plain application/x-javascript text/css application/xml image/jpeg image/gif image/png; //指定哪些类型的文件需要压缩 " ~* s$ X7 p/ H gzip_disable "MSIE 6\."; //IE6浏览器不启用压缩 . x, v9 r; s$ T# ^7 l) C; v0 w

; y+ L- L" R8 }! @9 Y/ K" g& T }

测试:curl -I -H "Accept-Encoding: gzip, deflate" http://www.xxxxx.com/1.css ' S# C; Z2 I4 u6 {6 g* {4 t 日志错误日志级别调高,比如crit级别,尽量少记录无关紧要的日志。

1 d/ b+ h$ K: R( {% H9 c

对于访问日志,如果不要求记录日志,可以关闭,静态资源的访问日志关闭静态文件过期对于静态文件,需要设置一个过期时间,这样可以让这些资源缓存到客户端浏览器,在缓存未失效前,客户端不再向服务期请求相同的资源,从而节省带宽和资源消耗。

9 Y0 M6 _& `3 j) g% g5 p2 R

配置示例如下:location ~* ^.+\.(gif|jpg|png|css|js)$/ b, f6 f( s7 ~5 A7 B {8 M% d/ V4 Q* o3 z" \ Z expires 1d; //1d表示1天,也可以用24h表示一天 K4 R4 }3 g; X4 b: J' C l } " I2 s; a; x: T. J# _$ z 访问控制和参数调优只记录其中一些部分,有些可能会在工作中用到,SSL的配置后续再作笔记吧。

}6 @, e7 o- b7 {* _/ ~. l

后面小编会分享更多运维方面的干货,感兴趣的朋友走一波关注哩~

" a% g7 `2 L& p- w 4 M" D4 l0 ^9 W3 a8 P$ h# c, `& T* u6 H: t0 T A0 K( t) U' G ! [: b5 o0 A# {. `
回复

使用道具 举报

    您需要登录后才可以回帖 登录 | 加入怎通

    本版积分规则

    QQ|手机版|小黑屋|网站地图|真牛社区 ( 苏ICP备2023040716号-2 )

    GMT+8, 2026-4-4 03:35 , Processed in 0.284525 second(s), 22 queries , Gzip On.

    免责声明:本站信息来自互联网,本站不对其内容真实性负责,如有侵权等情况请联系420897364#qq.com(把#换成@)删除。

    Powered by Discuz! X3.5

    快速回复 返回顶部 返回列表