找回密码
 加入怎通
查看: 184|回复: 5

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

[复制链接]
我来看看 发表于 2023-03-22 06:43:54 | 显示全部楼层 |阅读模式
0 o) d9 ?0 r6 r5 o( Z. d

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

! r, |* }8 H$ f9 l+ F

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

+ Z% O/ D3 D, z$ K

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

. g2 d- v* h8 O% k u/ @7 s

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

. X, b9 ]6 R- `6 B

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

: y* X9 S3 J' W

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

; ?5 v t4 A4 Y8 h

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

3 x. L1 N5 _. J, j6 e" F: L

它表示,允许/拒绝某个ip或者一个ip段访问.如果指定unix:,那将允许socket的访问注意:unix在1.5.1中新加入的功能在nginx中,allow和deny的规则是按顺序执行的示例1:location / 1 n) Z1 [% O7 T2 Q& ]0 y9 u {* q& x" @' c/ g: `! g, z' U! Z allow 192.168.0.0/24; $ p" V. Y+ d) K+ {) U( Q0 l* O0 B allow 127.0.0.1; : J, `, M0 S! N" B# a' o deny all;, u* X3 o j3 S1 _- z, h }' P* \ b' f7 L1 y

' I$ |5 l: b5 F1 c3 b# o4 h% k" E

说明:这段配置值允许192.168.0.0/24网段和127.0.0.1的请求,其他来源IP全部拒绝示例2:location ~ "admin" 5 u- G+ v( w+ {, o: l { . P4 [- u8 F# _7 R' q& S: t, L allow 192.168.30.7; - O( @9 a Y+ h0 C6 A# B# u deny all 8 m" c8 l+ X, i+ F- i0 U }" M5 X. ]+ G0 c, ?) ~ 。

( m# i! h+ n, T

说明:访问的uri中包含admin的请求,只允许192.168.30.7这个IP的请求基于location的访问控制日常上,访问控制基本是配合location来做配置的,直接例子吧示例1:location /blog/. [. R* f8 Q( t: d& m/ ^ {2 `: W" t6 l" h6 _" P+ Z deny all;6 ^) k& r' I3 n0 a/ |/ L } 6 |4 W! n* ], B0 k: X 。

8 D0 r9 \. f. W( X+ l1 @

说明:针对/blog/目录,全部禁止访问,这里的deny all;可以改为return 403;.示例2location ~ ".bak|\.ht" q" h1 S+ g# _; S7 r {' | m8 W3 |7 u4 ? return 403; " |8 H( b+ c- S! M+ s5 E } G9 j1 j" v& ], p 说明:访问的uri中包含.bak字样的或者包含.ht的直接返回403状态码。

% i6 j* Y z: a7 G

测试链接举例:www.syushin.com/abc.bakwww.syushin.com/blog/123/.htalskdjf如果用户输入的URL是上面其中之一都会返回403示例3location ~ (data|cache|tmp|image|attachment).*\.php$ 2 I) u0 t- o: e$ h3 s5 q5 l { / u( i1 u8 I5 q" @! X) W+ E4 T* ? deny all; 6 r& f, P. \8 \# b }& h+ U& K0 I0 J$ `; [3 t 。

) Z1 I( Q2 l3 y) r0 A

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

$ V9 h+ I7 ?% s: d

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

: c j$ M3 k$ b0 _7 [ h3 K: `

我们可以针对这个变量做访问控制示例1if ($document_uri ~ "/admin/"), N1 \! U" i1 \/ I { $ e Z' z) @. z* n2 e return 403; ; d- H- w# o7 \ }' d) P2 V4 j( T" q6 [. z 说明:当请求的uri中包含/admin/时,直接返回403.注意:if结构中不支持使用allow和deny。

+ p7 z e1 a; \' h

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

+ W& P) i2 q" k% o, L' v

示例2if ($document_uri = /admin.php)( e& l0 R! s, N+ }8 \2 `8 | { ' H, C& F' Z+ F: f! m return 403; 8 t2 `4 p* o4 t' o# W, e" D }7 C, [1 j, V. ~5 B 说明:请求的uri为/admin.php时返回403状态码测试链接:1. www.xxxxx.com/admin.php # 匹配。

* t2 W3 S& Y1 y3 t

2. www.xxxxx.com/123/admin.php # 不匹配示例3if ($document_uri ~ /data/|/cache/.*\.php$). |; L1 D8 T# v { . `' _0 X6 j- Q return 403; 3 Y3 b8 a0 F' v# m5 A: P7 m6 Z. x } 0 X: u3 X2 q6 V9 r6 d- J 说明:请求的uri包含data或者cache目录,并且是php时,返回403状态码。

- _# k3 y6 r# f; M1 n s

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

; L5 y% i9 `/ V, O5 X1 l7 @+ C

主要是针对请求的uri中的参数进行控制示例if ($request_uri ~ "gid=\d{9,12}") * v5 T5 t2 o& [2 k0 Q' h& R1 w { 4 N! u; G( T; P2 I9 N7 A. e return 403;6 C5 c# c. `& W' c# P2 h }& l* S5 x6 a6 k8 s% {' e$ N 说明:\d{9,12}是正则表达式,表示9到12个数字,例如gid=1234567890就符号要求。

! G" U% M* W/ Y: O3 g* H

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

3 m. \/ V) [1 _- _9 K+ r0 ^% {

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

/ Q4 T; q" s& p# J! o7 a

假如观察访问日志,发现一些搜索引擎的蜘蛛对网站访问特别频繁,它们并不友好为了减少服务器的压力,其实可以把除主流搜索引擎蜘蛛外的其他蜘蛛爬虫全部封掉示例if ($user_agent ~ YisouSpider|MJ12bot/v1.4.2|YoudaoBot|Tomato) 0 k4 G: R" H' E+ E% I7 } V {3 Z# @8 i, F* G3 { return 403;- k0 }4 M" a L4 C& t! ]! q } , R2 W1 _1 X, c3 B* R5 ^* q9 Z

* |) B6 G& K F) \' S/ ^

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

1 m! k2 k3 n1 `# U3 b! @( l

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

9 I* R1 ^6 R4 Z, A

比如,可以把从百度访问的链接直接返回404状态码,或者返回一段html代码示例if ($http_referer ~ baidu.com) 9 @7 c# e9 k( Y1 R+ v { . G1 _0 ]. {# ?+ b return 404;; T1 i$ u7 }7 U- |5 U } \; ?0 M; ]' U4 { 或者if ($http_referer ~ baidu.com)# M' u. |5 w0 ~+ |& n { 2 l! |0 [* k+ C( b* O0 t4 U return 200 "window.location.href=//$host$request_uri;"; 8 p7 Y$ [8 l# ^, k; J } 8 g% z+ P# O$ N. K, [* e 。

4 U0 ]+ O9 d3 h

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

( E9 J, b9 X0 }! |

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

) p. }& O6 c+ U: F; K, J3 u+ p

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

7 o7 k+ C6 ]# j+ P/ j) ^5 b# \

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

6 F/ g: S, O9 r5 K, U

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

, x0 E6 y: |" g

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

4 ~; t' C4 w* a4 `, \

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

* a1 h4 u' W9 ]$ i: \

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

4 N, ?+ b9 G. M/ E, x; e

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

2 F9 x* T* n( L7 F

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

, X# y, U: B) A6 n9 G4 ]' W* r! D& `

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

0 z, r3 I' z- q9 A2 w

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

]: e' p3 V8 d: w+ Q- a, ^

单位是秒,可以设置为3压缩对于纯文本的内容,Nginx是可以使用gzip压缩的使用压缩技术可以减少对带宽的消耗由ngx_http_gzip_module模块支持配置如下:gzip on; //开启gzip功能& A7 M8 B2 h' y gzip_min_length 1024; //设置请求资源超过该数值才进行压缩,单位字节, W: _" S- r* C gzip_buffers 16 8k; //设置压缩使用的buffer大小,第一个数字为数量,第二个为每个buffer的大小2 _) z E+ V7 T: a9 e d gzip_comp_level 6; //设置压缩级别,范围1-9,9压缩级别最高,也最耗费CPU资源 " M$ ^! Y- i( x C/ e gzip_types text/plain application/x-javascript text/css application/xml image/jpeg image/gif image/png; //指定哪些类型的文件需要压缩 / R* G- E# }) Q, U. h4 ]- S7 l gzip_disable "MSIE 6\."; //IE6浏览器不启用压缩 . X& P) k% g H 。

$ ^8 u) y) H! W v1 f& @

测试:curl -I -H "Accept-Encoding: gzip, deflate" http://www.xxxxx.com/1.css* z' y3 B9 ]# j1 n& B6 C 日志错误日志级别调高,比如crit级别,尽量少记录无关紧要的日志。

* x; T8 i+ H1 V- @6 i" r. F

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

5 H" T- b% D3 X) |4 M

配置示例如下:location ~* ^.+\.(gif|jpg|png|css|js)$( Q1 N2 `" I, l {. P% m( }2 ~8 n) }( L% k/ @ expires 1d; //1d表示1天,也可以用24h表示一天 % M9 U% [6 ?' t } 9 i. V2 L7 f) D) w" f. X- ` 访问控制和参数调优只记录其中一些部分,有些可能会在工作中用到,SSL的配置后续再作笔记吧。

2 f* e# _& |( O6 e

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

0 N# m2 ] h- y; H. V7 b1 K; i ( V6 k/ M+ A9 z 4 E! w) G8 |& p T0 k4 c: Q9 @ ) ` @* [, |( |) {$ } , }3 U% u. t4 z. }. z7 L6 ?

暂时无法加载帖子列表

回复

使用道具 举报

≮_龍/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 | 显示全部楼层
分析得很透彻,很多细节都说到点子上了~
回复

使用道具 举报

罪有英德 发表于 2026-10-16 02:36:20 | 显示全部楼层
楼主太厉害了,整理得这么详细,必须支持
回复

使用道具 举报

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

    本版积分规则

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

    GMT+8, 2026-11-1 08:44 , Processed in 0.075838 second(s), 24 queries , Gzip On.

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

    Powered by Discuz! X3.5

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