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

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

[复制链接]
我来看看 发表于 2023-03-22 06:43:54 | 显示全部楼层 |阅读模式
" [% y& a( T% ^2 T- @

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

0 |& S! @ Z. u) X* M

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

" K7 Q2 a3 l7 ?$ D# P5 Z2 K! U) @) \ G

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

7 N2 j8 `* u% w7 W

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

) u# n( \8 h" ~% I0 L

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

2 [5 R% g% K# g

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

* Z% C/ Z8 ^6 {& h k, |$ L3 W4 [

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

1 D" B+ X2 X3 T$ c9 T

它表示,允许/拒绝某个ip或者一个ip段访问.如果指定unix:,那将允许socket的访问注意:unix在1.5.1中新加入的功能在nginx中,allow和deny的规则是按顺序执行的示例1:location /! V t( f2 [) k* J% j { / e& e9 L& g# F- ]; e- B' a( J allow 192.168.0.0/24; . d6 y: B0 V" `* k allow 127.0.0.1;: b) b. l3 }1 S; ~" s deny all;0 W5 m* p; ^& m8 k! j# [0 p } , @. Y7 Z0 a! A/ S! h: r5 ^

: M$ H6 u% w- p$ t7 i+ k3 M+ F

说明:这段配置值允许192.168.0.0/24网段和127.0.0.1的请求,其他来源IP全部拒绝示例2:location ~ "admin"/ p* ?$ O* w8 R {' M! i! \! h$ ~& R# `1 ^ allow 192.168.30.7; e. B2 W0 `+ p- W deny all. Y7 y# v2 `1 h' u# X' k; o }; z2 ?2 S3 N9 H' q3 E' ~$ I( n

3 N7 o1 z1 \6 u# B- ?, R9 s

说明:访问的uri中包含admin的请求,只允许192.168.30.7这个IP的请求基于location的访问控制日常上,访问控制基本是配合location来做配置的,直接例子吧示例1:location /blog/ / G( w7 Y2 s# b) V { 9 \* M/ D4 N9 C. x0 u& {. Q& `7 W deny all;! F r" f/ b0 _8 i. {- C' ?! w } 8 `% u! M1 r: {7 {2 L

3 |' T1 U4 T4 }' j8 E

说明:针对/blog/目录,全部禁止访问,这里的deny all;可以改为return 403;.示例2location ~ ".bak|\.ht" ( @' C5 Q E; Z, h { 3 H8 L: Q! I+ @. t4 v- h; F return 403;. Q3 U. y S K1 O, ^( W }+ V; o4 r$ A7 R' p ?+ T+ \ 说明:访问的uri中包含.bak字样的或者包含.ht的直接返回403状态码。

& v! ~$ C+ A0 O0 N6 {

测试链接举例:www.syushin.com/abc.bakwww.syushin.com/blog/123/.htalskdjf如果用户输入的URL是上面其中之一都会返回403示例3location ~ (data|cache|tmp|image|attachment).*\.php$6 J* z& a8 y+ v; i+ U% h) x { x$ K X) e8 U/ k2 I7 E6 c deny all;1 M/ W& {! c" c1 q6 M5 ~ } * U9 Z5 a9 ^: T6 O+ i# N* S

5 c# {/ D$ I' F4 G0 f4 y& a5 p

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

; e- A9 ~) r) \, N

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

$ @1 k) ]1 q" D8 R

我们可以针对这个变量做访问控制示例1if ($document_uri ~ "/admin/") - W& F/ ]: K& }" | {# U4 ~' g( a9 |6 w return 403;3 {5 `. r- J1 h8 e; a# n8 }$ y }2 Q% t g9 h4 m2 }9 @! j' {8 R 说明:当请求的uri中包含/admin/时,直接返回403.注意:if结构中不支持使用allow和deny。

& {5 g, p2 E$ x8 U7 `

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

2 K7 ]2 Q& R* K9 `% j

示例2if ($document_uri = /admin.php) 9 Y- H- {9 S2 f8 c6 T2 {9 I" H {4 m4 S2 b8 j. N; @ return 403; 6 [5 k9 i7 l2 {- D; C! d1 @* z# e } & n+ W) z* |) X. L2 c 说明:请求的uri为/admin.php时返回403状态码测试链接:1. www.xxxxx.com/admin.php # 匹配。

3 Z/ |* F# C6 l* u# ?8 X+ I

2. www.xxxxx.com/123/admin.php # 不匹配示例3if ($document_uri ~ /data/|/cache/.*\.php$) , {8 R; Q. m, d" P: x {. g0 b( u C9 ]* U6 M$ K4 n return 403;, T0 _: I) w% i8 A }3 S6 k+ b" {" d- H 说明:请求的uri包含data或者cache目录,并且是php时,返回403状态码。

6 L% E; v; e( m

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

4 \0 r7 c' H( ~; h ]

主要是针对请求的uri中的参数进行控制示例if ($request_uri ~ "gid=\d{9,12}") + D, j! A7 ]/ w9 F+ v& x: e& v { 0 r8 ?9 s0 j/ q1 i( E5 D W return 403;$ e5 Q" K! ^: C7 u# K! a( N } - w& s. [" t Q9 N7 ]/ ?( H1 @ 说明:\d{9,12}是正则表达式,表示9到12个数字,例如gid=1234567890就符号要求。

. K, A( |0 l7 J2 g; j2 I

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

0 ~5 s8 F. e4 Q6 G4 r- w

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

. B7 g! ^8 f# K+ l9 j. m& ?

假如观察访问日志,发现一些搜索引擎的蜘蛛对网站访问特别频繁,它们并不友好为了减少服务器的压力,其实可以把除主流搜索引擎蜘蛛外的其他蜘蛛爬虫全部封掉示例if ($user_agent ~ YisouSpider|MJ12bot/v1.4.2|YoudaoBot|Tomato) : z! t8 p) I8 w9 d1 L4 w {0 P9 @; l' [! W d return 403; ( m1 D) }4 l9 q5 b' c, i6 V3 {& g }% P% {$ b- B# o1 ~, j# ?& {6 \

+ M# C$ X) j* e# ?" Y* H& ?: J# ?

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

( F- G; s- s0 o! |/ n3 U

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

4 E5 B& }+ ^$ X5 s# o, ]/ ?& d

比如,可以把从百度访问的链接直接返回404状态码,或者返回一段html代码示例if ($http_referer ~ baidu.com) 4 Q8 e7 l% `8 H8 b# C' w- ~ {* c, f! S! h, {: e- U4 C return 404;: P" v ~: p) {8 _& e8 t- @5 l } ) D4 W8 Z4 v* S! S8 A. ^+ v" t 或者if ($http_referer ~ baidu.com) 3 G4 K5 s; Q3 d. s1 O: Q# i, k { . X; {& S4 z" f' \4 Q8 H! x- \ return 200 "window.location.href=//$host$request_uri;"; * v! U) q1 W2 G( V9 d } 1 B. y5 j0 h$ {: Q0 \& B

+ D5 O n3 t E6 J# c( a$ P6 a

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

& Y0 Y, C5 k, f

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

4 a) R5 h Q# P$ d1 W% U" M$ C

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

' K0 h" M+ S9 V k4 l9 c

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

8 B! D; m @" q& i6 c

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

2 q- p6 m& J* \6 q+ k2 a ^: X

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

5 O _3 v* c5 ^/ w6 W/ e

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

. D# B1 g0 f# F$ J* S: H

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

7 l$ S2 ~* H) R& E" P5 |" q8 @

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

/ ]" d# ]3 f4 f, e- T0 V& `9 l" r

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

9 s, [. z5 J' ^& v7 @2 @# e1 w' j

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

' W+ V$ a) r3 c2 ]/ g

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

4 Z+ D- z% X! w, F$ ?: l

单位是秒,可以设置为3压缩对于纯文本的内容,Nginx是可以使用gzip压缩的使用压缩技术可以减少对带宽的消耗由ngx_http_gzip_module模块支持配置如下:gzip on; //开启gzip功能 & K& d( {( H h gzip_min_length 1024; //设置请求资源超过该数值才进行压缩,单位字节, J, q8 S1 j2 C n gzip_buffers 16 8k; //设置压缩使用的buffer大小,第一个数字为数量,第二个为每个buffer的大小( ]& }$ A1 k* C' n1 \ gzip_comp_level 6; //设置压缩级别,范围1-9,9压缩级别最高,也最耗费CPU资源 ) |( _7 I6 P- D. G9 {; L1 Q* }$ j gzip_types text/plain application/x-javascript text/css application/xml image/jpeg image/gif image/png; //指定哪些类型的文件需要压缩 & W. u- d4 v, M gzip_disable "MSIE 6\."; //IE6浏览器不启用压缩 : ~* E. ?: z& S. C* v* l2 r# O

% j w. |3 Q6 t+ @; R. E4 q

测试:curl -I -H "Accept-Encoding: gzip, deflate" http://www.xxxxx.com/1.css 3 ?: G. F1 f& ]) E& |5 R1 V: y( t 日志错误日志级别调高,比如crit级别,尽量少记录无关紧要的日志。

& e5 Z8 A1 [1 y" n. I

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

/ Z5 ^, d3 D- c6 D* `

配置示例如下:location ~* ^.+\.(gif|jpg|png|css|js)$3 J* d( ]4 v3 q) W$ \3 C9 [6 c {/ w- _( T/ z- G$ w7 X( Q expires 1d; //1d表示1天,也可以用24h表示一天+ g% l5 }& `5 b2 Q }, p8 {4 ]3 Y' d; t% O. r- i4 t 访问控制和参数调优只记录其中一些部分,有些可能会在工作中用到,SSL的配置后续再作笔记吧。

. j a' j" _1 ?8 f& l0 o! O0 _: V" [

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

0 Z P v, k) T& F g3 c$ D* g0 D+ I: M" _" M; R/ o F& W) q! g$ f5 R. W& M" W * g) P, C4 D) B( _. | . f9 p; d A9 P6 t1 C& x/ m
回复

使用道具 举报

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

    本版积分规则

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

    GMT+8, 2026-7-7 12:13 , Processed in 0.051886 second(s), 24 queries , Gzip On.

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

    Powered by Discuz! X3.5

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