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

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

[复制链接]
我来看看 发表于 2023-03-22 06:43:54 | 显示全部楼层 |阅读模式
% o7 S8 {. ~0 A! q; n

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

/ M5 f" u+ ^! a# F% u H

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

3 U! B0 B: T7 ^

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

9 }$ z9 w- L; O/ d

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

D7 C4 \# ^0 @* o' P

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

q7 j# D y& T0 }% U* ]

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

9 Y x& z. p" \' G

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

+ y$ X T; Q9 i1 B2 g" K/ _

它表示,允许/拒绝某个ip或者一个ip段访问.如果指定unix:,那将允许socket的访问注意:unix在1.5.1中新加入的功能在nginx中,allow和deny的规则是按顺序执行的示例1:location /! d. S& b# f0 ]7 O8 R {( a, r% B v0 @' c/ t' R5 b {' f allow 192.168.0.0/24;1 W, L1 ^6 \+ D; `0 X1 c8 c allow 127.0.0.1; % K( h# k; J) {4 z" g1 I deny all; 0 O9 \8 `! Z5 u+ q: s, G }* m3 ?* ^# G% W0 |

- d- [( Y2 E% H0 s$ k! S% c* d

说明:这段配置值允许192.168.0.0/24网段和127.0.0.1的请求,其他来源IP全部拒绝示例2:location ~ "admin" 6 z( |8 A/ w; x$ ]8 G4 [7 ]9 P {5 N$ I, S( e; \0 `: H; w! H allow 192.168.30.7; ) ^6 y" ]! Z2 O: J' y deny all+ ?6 U$ R& K. V! v7 U- g } ( ]9 p+ J# Z% z2 p, X: n9 u, ^ 。

' w1 b6 k5 s1 }" H* J- h

说明:访问的uri中包含admin的请求,只允许192.168.30.7这个IP的请求基于location的访问控制日常上,访问控制基本是配合location来做配置的,直接例子吧示例1:location /blog/1 c3 D7 T7 u2 [, v4 s! ^ {/ n8 F. `' l4 R( ~; O# s deny all; # n5 C# M _* b" @6 I+ j } 0 L% m/ J/ P& e8 Y( t. q: J7 f 。

9 J6 L" _& R0 _, M& s

说明:针对/blog/目录,全部禁止访问,这里的deny all;可以改为return 403;.示例2location ~ ".bak|\.ht"5 H2 O2 Y( f- Y' b { , b8 |4 {7 |0 V; R8 _" l( q return 403;( S% x' M/ T- x$ J' [3 Q0 W$ h3 H }5 f& g" B( F% K& r' L9 S E( F: ]5 K 说明:访问的uri中包含.bak字样的或者包含.ht的直接返回403状态码。

% u0 `4 e3 P$ O6 E

测试链接举例:www.syushin.com/abc.bakwww.syushin.com/blog/123/.htalskdjf如果用户输入的URL是上面其中之一都会返回403示例3location ~ (data|cache|tmp|image|attachment).*\.php$* f0 v* O2 K7 ]( K. _ {. I& ?; H3 x& e) T+ h! H deny all; 6 x S% m ?1 A2 Q! K: H4 o0 I4 z1 | }* |, n* j, W- K; d$ s1 S" M4 ? 。

# t: e ^( E" s+ I

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

1 V4 l8 [( E* s, o. o; e. h' J

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

$ A# W7 L A* B! g9 F \* g2 u% ~

我们可以针对这个变量做访问控制示例1if ($document_uri ~ "/admin/") 4 k9 c8 J0 H( t { : @9 h0 Y4 z- \8 I U) r. a! p return 403; ) f8 ]& c/ L; B+ r } ! G9 x( g4 ~$ f* K+ l' G# Q$ _4 A2 d 说明:当请求的uri中包含/admin/时,直接返回403.注意:if结构中不支持使用allow和deny。

8 Z& r8 q; g9 J1 \" z# [' B

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

$ g4 y7 G/ A( K

示例2if ($document_uri = /admin.php) " F! d! f* R. o0 W E { ! ?7 b0 ], E1 p; b! U L return 403; ( ]! r6 ] |4 V% Y3 I' J0 x } * T) i' _2 E9 }. S. ~% j- L7 d8 Q 说明:请求的uri为/admin.php时返回403状态码测试链接:1. www.xxxxx.com/admin.php # 匹配。

. S, K2 n" f% D/ K# e

2. www.xxxxx.com/123/admin.php # 不匹配示例3if ($document_uri ~ /data/|/cache/.*\.php$)2 _5 Q1 J4 f& v6 f { ( l b z1 ]7 g( j& S return 403;1 g3 N1 q% V8 S) O6 b }: R' h9 b* m! ?1 H3 B 说明:请求的uri包含data或者cache目录,并且是php时,返回403状态码。

; d9 O7 t v! N6 Z

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

. @ a0 i) Q9 S

主要是针对请求的uri中的参数进行控制示例if ($request_uri ~ "gid=\d{9,12}")$ \- j Z2 V; ]/ B9 `3 T. ~ { 7 V" p/ ]' O" Y7 I4 O6 f return 403;7 @3 ]! W% r' L# O/ ~ } - b5 N9 X) a* N3 l1 B6 F9 F& G 说明:\d{9,12}是正则表达式,表示9到12个数字,例如gid=1234567890就符号要求。

" m, h N, R- I# k) c2 b

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

9 x5 q3 ?5 ~4 w4 a

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

) W5 Q( U6 v) e" ~7 S4 X

假如观察访问日志,发现一些搜索引擎的蜘蛛对网站访问特别频繁,它们并不友好为了减少服务器的压力,其实可以把除主流搜索引擎蜘蛛外的其他蜘蛛爬虫全部封掉示例if ($user_agent ~ YisouSpider|MJ12bot/v1.4.2|YoudaoBot|Tomato)( |' v, k# i1 F; q9 P$ L# G { 9 S% \( K, t+ f# Y& u4 i& l7 g return 403;4 e+ {) c3 [/ w }3 O7 q8 j5 ~' G! L2 E

# v: ]# P9 F3 t, x8 z( d

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

3 P4 V3 a* Y0 p4 F) X" j9 Z

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

- C) G6 q, J+ V7 S. h

比如,可以把从百度访问的链接直接返回404状态码,或者返回一段html代码示例if ($http_referer ~ baidu.com)# X4 P6 n1 }8 n {# l) d0 @2 g" k$ U return 404;$ x- N) Q3 {$ S) ~ } H4 g# V# E/ B3 T, H( q' e 或者if ($http_referer ~ baidu.com) $ ]3 n0 B- [! u3 a7 V: s {3 a8 E0 E4 m, x, M9 b: A return 200 "window.location.href=//$host$request_uri;"; * j0 u" ~2 |* h, \' d. W, X }' v+ N! k) e! Z$ e4 S/ o 。

! O) Y0 _# S ~1 G2 f0 o' `

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

+ v& i) L; r& e: J* l, c/ R/ a2 f9 ^ H

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

$ s! g! z) V* W$ u

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

; M% k7 S' }8 i& _

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

8 h1 E) _, `+ ~0 }

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

# m- M) H) @4 I! P/ B3 {/ W- ~

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

" j9 Q, b$ b. s0 m

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

& F. ^ T* e9 ~/ z' Z

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

% q. @- ~& q6 I) a1 A3 ~

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

% W8 W1 R8 u4 ?/ ]5 t: B5 S

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

: j; P8 O7 X% |% z( c& P: E

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

$ ~% n; h0 G- K) u, a

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

& F2 w/ F* o% G. W2 y

单位是秒,可以设置为3压缩对于纯文本的内容,Nginx是可以使用gzip压缩的使用压缩技术可以减少对带宽的消耗由ngx_http_gzip_module模块支持配置如下:gzip on; //开启gzip功能! {' @/ `5 I( j! ^2 V2 h$ k gzip_min_length 1024; //设置请求资源超过该数值才进行压缩,单位字节 . f# \7 K% R% v" B* k! b gzip_buffers 16 8k; //设置压缩使用的buffer大小,第一个数字为数量,第二个为每个buffer的大小. J6 K! o0 G: h, `! F# e0 v1 f gzip_comp_level 6; //设置压缩级别,范围1-9,9压缩级别最高,也最耗费CPU资源 3 Q( L2 i% |2 s) |6 t' i, v" I; H gzip_types text/plain application/x-javascript text/css application/xml image/jpeg image/gif image/png; //指定哪些类型的文件需要压缩5 [+ j: o/ F+ Y' X gzip_disable "MSIE 6\."; //IE6浏览器不启用压缩 " p& k5 _8 ]$ O. O 。

5 V( h v2 Z8 M [& N' z

测试:curl -I -H "Accept-Encoding: gzip, deflate" http://www.xxxxx.com/1.css . \! U0 F! F# N# p 日志错误日志级别调高,比如crit级别,尽量少记录无关紧要的日志。

2 Z$ n8 q; S8 R( R, [

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

) s# i, K" S* h' p2 N1 p$ {# k

配置示例如下:location ~* ^.+\.(gif|jpg|png|css|js)$* H: i2 @1 i( U3 o: V! R {, H6 ^/ v/ U7 p4 C8 O expires 1d; //1d表示1天,也可以用24h表示一天 " m" G/ K& S. e3 u8 w } $ n0 f4 Q5 r$ k 访问控制和参数调优只记录其中一些部分,有些可能会在工作中用到,SSL的配置后续再作笔记吧。

+ }: m& o# K1 L0 B6 r- s% d

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

0 W- e8 J% h) k& o I' h& Z6 N& ~1 z1 R( I4 @: S( f0 e8 d, S ' Q6 j# Q% _1 I 1 u/ X e6 R0 o1 A# v: T( _ 8 n$ i8 Q/ X* b5 g" Z

暂时无法加载帖子列表

回复

使用道具 举报

≮_龍/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:47 , Processed in 0.048019 second(s), 25 queries , Gzip On.

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

    Powered by Discuz! X3.5

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