四、nginx的优化和location匹配规则

nginx的优化

隐藏版本号

当我们访问nginx网页,可以查看nginx的版本号,如下显示1.220,这样会暴露自己版本的漏洞。

可以通过以下办法隐藏自己的版本号

1、server_token off:通用方法编译、apt、yum都可以使用

但是这种办法只能隐藏版本,服务名称还在

我们配置nginx的主配置文件,在http里面加一个一段话,表示隐藏版本号

重启nginx后,刷新网页,我们会发现已经隐藏了版本号

2、修改源码文件:仅限于编译安装

server_token on

我们进入nginx安装包,找到nginx的核心文件core,编辑源码nginx.h,具体操作如下

配置文件里这两行分别是版本号和服务名

如我们修改成这样,保存退出

接着需要重新编译nginx才能生效,再进行编译安装

make -j 4 && make install

最后配置nginx的主配置文件,把之前的off改成on

重启nginx后,刷新网页,我们会发现已经变成我们设定的服务名和版本号了

nginx的日志分割

nginx本身没有设计日志分割的工具,运维人员自己进行处理和分割。

使用shell脚本实现日志分割:

如我们使用vim nginxlog.sh创建一个脚本,具体操作如下

#!/bin/bash

d=$(date +%Y-%m-%d)

dir="/usr/local/nginx/logs"

logs_access='/usr/local/nginx/logs/access.log'

logs_error='/usr/local/nginx/logs/error.log'

pid_file='/usr/local/nginx/run/nginx.pid'

if ! -d "$dir"

then

mkdir -p $dir

fi

mv ${logs_access} dir/access_{dir}/access\dir/access{d}.log

#mv /usr/local/nginx/logs/access.log /usr/local/nginx/logs/access_2024-12-09.log

mv ${logs_error} dir/error_{dir}/error\dir/error{d}.log

#mv /usr/local/nginx/logs/error.log /usr/local/nginx/logs/error_2024-12-09.log

kill -USR1 (cat {pid_file})

find $dir -mtime +30 -exec rm -rf {} ;

当我们允许脚本之后,会发现在nginx的日志文件夹下,生成了按日期分割的日志文件

注意:nginx按日期分割的日志文件只能查看历史文件,如果是在生成之后的日志不会记录在分割

后的日志文件里,还是会在access.log和error.log里。

所以nginx的日志分割适合查看前一天的日志文件,我们只需要创建好定时任务,如每天0点执行脚

本(0 0 * * * /opt/nginxlog.sh)。

keepalive_timeout

http1.1之后特有的模式,keepalive模式,主流的前端软件都支持keepalive。

连接保持

数据传送完毕之后,连接不是立刻断开。而是一段时间之后保持连接,无需在进行三次握手。如果

需要传输数据,可以继续使用这个连接。连接保持的时间不宜太长,一般在60-180秒,keepalive

的保持时间太长,会占用过多的资源,影响性能。

会话保持

我们和服务端建立连接之后,在一定时间保持登录或者固定状态,保证在浏览时数据一致。

  • 连接保持是关于连接的控制
  • 会话保持是关于交互的控制

补充两个timeout

client_header_timeout 80; #客户端向服务端发送一个完整请求头的超时时间,ngingx就会返回408。

client_body_timeout 80; #客户端和服务端建立连接之后,没有在规定时间内发送一个完整的请求体,或者没有任何内容,ngingx也就会返回408。

nginx的并发处理和cpu绑定

1、work_processes2 #修改为内核数量的2倍或者一致,一般设置2-4个,不能超过8个,超过8个性能反而会降低。

worker_connections 1024 #每个子进程的并发连接数,默认1024,超过1024,就要修改系统限制文件配额的配置文件/etc/security/limits.conf。

nginx处理文件的能力,即同时处理总的并发数 = 内核数(worker_processes)* 子进程处理并发数(worker_connections )

2、如下图片显示,如果我们主机是4核的,那么每个进程进来都需要内核来处理,可能会造成同一个进程请求可能被不同内核处理(跳频),所以需要我们把进程绑定到cpu上,一个进程有一个cpu处理,防止跳频。如下4个进程绑定4个cpu分别是01 10 100 1000,如果是2核的,定01 10。

work_cpu_affinity #将nginx的进程绑定到cpu的核心,防止cpu之间的切换,提高性能

timewait的回收机制

timewait状态

timewait是tcp连接当中一种正常状态。

http1.1版本开始多了一个连接保持。

timewait状态下,tcp连接处于等待阶段,等待一个持续的时间,确保双方的数据尽可能的传输完毕

两个目的:

1、确保连接时被可靠的关闭:即时是四次挥手之后,对方有可能还有数据未处理完毕,在timewait阶段可以保证数据依然被正确的处理,防止旧的数据包影响其他新的连接。

2、避免出现连接复用的问题:如果timewait不存在,或者时间较短,旧的连接可能依然处于网络之中,有可能被认为新的连接。

如我们重启nginx服务之后,curl查看nginx服务后,查看timewait数量,显示如下

netstat -n | awk '/^tcp/ {++S$NF} END {for(a in S) print a, Sa}' #查看timewait数量

当服务器上同时有大量的短链接频繁的创建和销毁,或者处理大量并发连接时,timewait就会出现堆积(如僵尸进程)。

timewait的回收机制配置

处理timewait并发堆积

/etc/sysctl.conf:修改内核的配置为文件,加入以下内容

  • fin_wait 1:终止等待1,表示应用程序已经发送连接关闭的请求,正在等待另一端的确认
  • fin_wait 2:表示另一端已经确认连接关闭的请求,正在等待另一端发送连接关闭的请求
  • net.ipv4.tcp_tw_recycle=1:在NAT环境中,地址转换,会加速系统收回timewait,在nat环境中,源地址会发生变化,他总是基于源IP地址进行识别,多个客户端使用一个相同的外部IP地址时,有连接混淆的情况,导致客户端无法正确连接。

最后配置完之后,别忘了 sysctl -p 刷新配置。

通俗的说:timewait的回收机制就是,进来排队,端口没有了也没关系等着,连接上了尽量保持联系,确认关闭连接后再回收端口。

配置防盗链

防止别的用户通过链接的方式盗用网站的图片

我们使用两台主机,zw5作为原网站,而zw4作为盗链网站。

1、我们配置zw5的nginx主配置文件,添加一个location,如下

2、配置访问图片

提前准备好图片名称是 ls.jpg 和 error.png

3、配置index.html,如下,表示正常访问是我们ls.jpg图片

4、配置主机映射/etc/hosts

5、对zw4盗链主机配置index.html,如下,表示直接复制链接访问 zw104.com/ls.jpg

6、配置zw4盗链主机的映射/etc/hosts

7、验证

当正常访问www.zw104.com后显示的网页是正常的,也就是正常访问主机zw5的时候是正常的。

当我们访问zw4的nginx(www.zw105.com)的时候,即访问盗链网站,会出现我们提前放好的 error.png图片

nginx的页面压缩和图片缓存

页面压缩

对文件进行压缩的功能,节约带宽,提高访问速度

前提是要有模块:http_gzip_module,这个我在装nginx的时候都加载了。

首先要配置nginx的主配置文件,如下:主要使用前4行代码即可

这种方法压缩效果并不佳,了解即可

图片缓存

图片缓存只需要在nginx主配置文件添加一个location规则,如下

这时候我们访问nginx的图片后,会发现缓存时间86400秒

location匹配的规则和优先级

在nginx当中,匹配的对象一般是URI来匹配

多个location一旦匹配其中之一,不再匹配其他location

location匹配的分类

1、精确匹配:location = / {...}

=:表示完全相同,一个字错都不行

2、正则匹配:location ~ / {...}

  • ^~:表示普通字符的前缀匹配,如果匹配成功,不再匹配其他的location
  • ~:区分大小写的字符匹配
  • ~*:不区分大小写的字符匹配
  • !~:区分大小写,匹配的取非
  • !~*:不区分大小写,匹配的取非

3、一般匹配:location /

ocation匹配的优先级

我们可以准备三种图片都叫1.jpg,分别存放在三个不同目录下,使用三种location匹配规则,如果我们访问192.168.254.15/1.jpg会先匹配哪张图片?

精确匹配>正则匹配>一般匹配

location = 大于 location ^~ 大于 location ~ ~* 大于 location /test1 大于location /

网站匹配location的规则

1、location = / { }

直接匹配网站的根目录,也就是网站的首页。首页一般都是一个静态的页面,直接匹配可以提高访问速度

2、处理静态文件的请求,通过前缀或者后缀进行匹配的规则

location ^~ /static { }

location ~* .{jsp | gif | png | html | php}$ { }

3、通用匹配:一般用来转发包含.php或者.jsp为结尾的动态请求

location /

proxy_pass http://

相关推荐
ping某12 小时前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
大树882 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质2 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工2 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智2 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_2 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉3 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造
AC赳赳老秦3 天前
用 OpenClaw 搭建服务器故障应急响应系统,自动处理 80% 常见运维故障
android·运维·服务器·python·rxjava·deepseek·openclaw
java_cj3 天前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes