找回密码
 加入怎通
查看: 163|回复: 4

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

[复制链接]
我来看看 发表于 2023-03-22 06:43:54 | 显示全部楼层 |阅读模式
+ Z( @) Z U( Q5 m

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

1 U" w0 a( L9 z7 h- T

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

4 q- {5 Z$ i( v% R" N9 a

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

5 ]( j9 M/ E$ o8 @* e, X( n

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

9 ]& G, k' M6 c& J- ]2 q

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

! F4 b) ?! d2 b5 U

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

: V C R' o0 A) s; \4 \9 o. E

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

% k, p5 g4 P- y+ i) r+ t5 u0 E

它表示,允许/拒绝某个ip或者一个ip段访问.如果指定unix:,那将允许socket的访问注意:unix在1.5.1中新加入的功能在nginx中,allow和deny的规则是按顺序执行的示例1:location /7 a, M- G/ [# u$ n7 H0 E* s4 d { ; M; F# |1 T7 S& z allow 192.168.0.0/24;6 i3 s# c& h/ ~. ` allow 127.0.0.1;- G% V, V; [! ~, A deny all;1 u% H4 C6 O! _. @" m }* k5 s, T( m' A5 m4 q" N! g

: p+ C" r- X+ N# e" D: Z0 D3 F

说明:这段配置值允许192.168.0.0/24网段和127.0.0.1的请求,其他来源IP全部拒绝示例2:location ~ "admin" ) b5 ^( p! k R; W {* E& m1 c# }9 L( U, t) q% ]. d3 G% s allow 192.168.30.7; # ~$ E- W6 ]% |) b9 P$ v6 F deny all" |# S0 l) V2 V! d$ N1 [) ] }4 J" K. w+ G+ X( E% ^; Q& q

! j2 e- _' i! I3 R* W' l

说明:访问的uri中包含admin的请求,只允许192.168.30.7这个IP的请求基于location的访问控制日常上,访问控制基本是配合location来做配置的,直接例子吧示例1:location /blog/* f" O9 M; K- ^& V; E F {+ W6 g9 I- {% O* ? deny all;, P/ ]8 x& T2 D" V: {( W } 4 r5 c% C9 X9 \$ d3 q; n# A

2 d+ E, Q4 R+ L$ T

说明:针对/blog/目录,全部禁止访问,这里的deny all;可以改为return 403;.示例2location ~ ".bak|\.ht"2 v2 z! O4 m3 C { 3 J- y8 T m) x9 O8 Y return 403;6 \: o; p: C1 n& F M' u } 2 J. Y, U: o9 M- H# G 说明:访问的uri中包含.bak字样的或者包含.ht的直接返回403状态码。

( {+ C$ \9 V! e3 \2 A( S

测试链接举例:www.syushin.com/abc.bakwww.syushin.com/blog/123/.htalskdjf如果用户输入的URL是上面其中之一都会返回403示例3location ~ (data|cache|tmp|image|attachment).*\.php$0 Z5 X0 \0 t7 I+ D/ i( | t {8 B6 Z) O4 r7 r& A( o- E' x deny all;& l. w1 K! z6 t+ j2 k+ F: J- V$ R } # J. f" j( h: Y$ k0 d u

, O7 [- @4 m; n+ q- w" F

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

0 k* j1 q4 e+ w

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,不包含后面的参数。

' R1 H( r+ c9 v

我们可以针对这个变量做访问控制示例1if ($document_uri ~ "/admin/") & r' e5 }3 ~: f, f. A; P* p { 4 [. n& v! F+ u' \( O @ return 403;1 J3 o" F2 W2 t9 E% K: t" Y/ T+ K }% Y0 ]. t- I$ d# o+ V i9 y% I0 G 说明:当请求的uri中包含/admin/时,直接返回403.注意:if结构中不支持使用allow和deny。

% J) ]3 H- V, ^

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

5 i8 e# d' r( G0 U. _

示例2if ($document_uri = /admin.php)' o* a: j; }" q5 z3 ^ { + s; f. Y: ^' E, Y4 K return 403; u3 b4 o! |& c/ d9 w }4 F6 b3 ?% Q( I8 D9 x 说明:请求的uri为/admin.php时返回403状态码测试链接:1. www.xxxxx.com/admin.php # 匹配。

; W7 D1 i3 o+ L$ v

2. www.xxxxx.com/123/admin.php # 不匹配示例3if ($document_uri ~ /data/|/cache/.*\.php$)9 j0 l. C! f# r0 }7 u$ o, ]. S { , n5 G' H# y( V, u& ?2 J return 403;* r& L5 h+ q+ O1 G5 e' f& B } , T8 P, B ?7 Q$ Q+ t2 D6 Z 说明:请求的uri包含data或者cache目录,并且是php时,返回403状态码。

+ l$ d% f2 O/ Q J

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

. m% F* i. ?# l% W7 n# _4 j5 _5 o

主要是针对请求的uri中的参数进行控制示例if ($request_uri ~ "gid=\d{9,12}") " s# F" z$ b# w* g { - r, f5 `7 Z5 O, n* H* `5 G return 403; % t _3 W/ E5 R1 B+ M } $ t: h7 }7 K. t" t# a( U 说明:\d{9,12}是正则表达式,表示9到12个数字,例如gid=1234567890就符号要求。

' r- M) n7 S, A& x

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

* j; M+ E+ V# \

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

b; Y4 o6 L/ h, S3 K, D2 m

假如观察访问日志,发现一些搜索引擎的蜘蛛对网站访问特别频繁,它们并不友好为了减少服务器的压力,其实可以把除主流搜索引擎蜘蛛外的其他蜘蛛爬虫全部封掉示例if ($user_agent ~ YisouSpider|MJ12bot/v1.4.2|YoudaoBot|Tomato) 0 e8 u) T- A+ y& r# O {8 f/ ]4 |+ N3 [+ m return 403;8 n. u4 g" N6 X( d. {) k) C } 2 \: S! H1 D8 R2 \+ B

3 ~0 D$ C# }& x/ I" c+ ]

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

' B3 j h' Z# L. V8 A

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

# L8 H/ d$ c6 A# \# V' J9 E

比如,可以把从百度访问的链接直接返回404状态码,或者返回一段html代码示例if ($http_referer ~ baidu.com) # G. `$ Q. u+ L' y0 `/ N) p6 R9 d( G {" x! J7 m! [' s c" V return 404;: Q8 y& s. {6 H2 |# E } # N/ C: F( P7 T: v7 y$ K 或者if ($http_referer ~ baidu.com) ) C! X4 B$ I2 S: H: h/ j& T {) |2 G+ N/ f1 S% C# ?8 ]( ` return 200 "window.location.href=//$host$request_uri;"; V3 P: [% i, t# N; | } 6 k8 B% j- Q) M) E

7 W8 S1 u" J U4 f

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

* @/ l: ~- a# @& }( f: F7 I

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

- [% r+ W2 Z4 N) c; W5 h9 C7 U

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

0 q$ n7 J5 {) ^( U! ~6 N8 s' R0 q

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

' p/ w7 b5 Q5 ]4 H/ b

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

. c2 T# \: o4 o2 x/ M+ z W* C6 X& z

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

& B _$ F' s- m7 T" R) m+ A& J

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

3 r4 m$ n' p) x7 P

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

; k4 S! d; G+ T& H+ N3 @) @

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

; R: Q. r; P A3 U+ a/ \! c- l

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

* @5 y$ O/ q: F5 f- D* B' p

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

9 _1 r6 G f2 W/ ^

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

+ V( X$ G7 W3 q; G% W( L3 K

单位是秒,可以设置为3压缩对于纯文本的内容,Nginx是可以使用gzip压缩的使用压缩技术可以减少对带宽的消耗由ngx_http_gzip_module模块支持配置如下:gzip on; //开启gzip功能8 F- H6 o5 A0 b' L gzip_min_length 1024; //设置请求资源超过该数值才进行压缩,单位字节 B0 S- A5 ?( ]9 D gzip_buffers 16 8k; //设置压缩使用的buffer大小,第一个数字为数量,第二个为每个buffer的大小 9 y: G" R; r8 k+ ?( S$ U gzip_comp_level 6; //设置压缩级别,范围1-9,9压缩级别最高,也最耗费CPU资源 3 m( e! m; E8 n9 O gzip_types text/plain application/x-javascript text/css application/xml image/jpeg image/gif image/png; //指定哪些类型的文件需要压缩" B* l3 y! x8 ~1 ] gzip_disable "MSIE 6\."; //IE6浏览器不启用压缩! F! x Q3 Z% |; o5 w$ F

' c# C, Y: @" Z; o# G& a& W3 f

测试:curl -I -H "Accept-Encoding: gzip, deflate" http://www.xxxxx.com/1.css ' U$ U' ^7 J' O' l4 A 日志错误日志级别调高,比如crit级别,尽量少记录无关紧要的日志。

) f+ B: P6 y; L2 ?, \) g5 j) t

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

8 {9 W& n- o' X( ~. G* u

配置示例如下:location ~* ^.+\.(gif|jpg|png|css|js)$* g) q1 `# L% o {' `# \2 v6 G& ~8 X expires 1d; //1d表示1天,也可以用24h表示一天 ! F+ s1 S/ x5 z) v# @3 m# S1 a }1 q" V/ @0 ? c3 C- O 访问控制和参数调优只记录其中一些部分,有些可能会在工作中用到,SSL的配置后续再作笔记吧。

( j7 u8 N2 u/ D

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

4 Y( ]( w: x2 k5 t1 c$ Y- i) V/ [- m# y5 S& G m; X( s4 C # J7 N3 V- E% S: s, l2 } $ {7 o( V3 j8 n4 L1 { . ?+ U5 \3 X5 ]) X% }/ Z3 e$ O. f

暂时无法加载帖子列表

回复

使用道具 举报

≮_龍/kuk域_≯ 发表于 2026-08-22 07:33:37 | 显示全部楼层
蹲了这么久,终于看到有价值的讨论,支持一下!
回复

使用道具 举报

米聊 发表于 2026-08-25 00:58:52 | 显示全部楼层
学习到了,之前一直没注意过这个点,受教了
回复

使用道具 举报

中团加盟梁树心 发表于 2026-08-26 05:11:26 | 显示全部楼层
内容很干货,没有多余的废话,值得反复看
回复

使用道具 举报

shenlian5 发表于 2026-09-10 19:50:12 | 显示全部楼层
分析得很透彻,很多细节都说到点子上了~
回复

使用道具 举报

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

    本版积分规则

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

    GMT+8, 2026-9-11 05:00 , Processed in 0.036870 second(s), 25 queries , Gzip On.

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

    Powered by Discuz! X3.5

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