Nginx 实战系列(六)—— Nginx 性能优化与防盗链配置指南

文章目录

前言

Nginx 作为一款高性能的 Web 服务器和反向代理服务器,广泛应用于各类互联网业务中。良好的配置实践不仅可以显著提升服务性能与访问体验,还能有效增强服务的安全性。

本文系统梳理了 Nginx 常见的性能优化方法与防盗链配置步骤,涵盖隐藏版本号调整用户与组设置缓存时间日志切割超时设置进程调优网页压缩 以及防盗链策略等多个方面,适用于生产环境中的 Nginx 服务调优与安全加固。


一、隐藏版本号

1.1 查看当前版本号

可使用 Fiddler 工具抓包查看 Nginx 版本,或在 CentOS 中使用以下命令查看响应报文首部信息:

bash 复制代码
curl -I http://192.168.10.123

1.2 方法一:修改配置文件

编辑 Nginx 配置文件:

bash 复制代码
vim /usr/local/nginx/conf/nginx.conf

在 http 块中添加以下配置:

nginx 复制代码
http {
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens off;   # 关闭版本号显示
    ...
}

重启 Nginx 服务并验证:

bash 复制代码
systemctl restart nginx
curl -I http://192.168.10.123

1.3 方法二:修改源码并重编译

修改 Nginx 源码文件:

bash 复制代码
vim /opt/nginx-1.20.2/src/core/nginx.h

更改以下定义:

c 复制代码
#define NGINX_VERSION "1.1.1"                  # 自定义版本号
#define NGINX_VER "IIS" NGINX_VERSION           # 自定义服务器类型

重新配置并编译:

bash 复制代码
cd /opt/nginx-1.20.2/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module \
--with-http_ssl_module
make

手动替换二进制文件:

bash 复制代码
systemctl stop nginx  #关闭服务
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.backup    # 备份旧版本
cp /opt/nginx-1.20.2/objs/nginx /usr/local/nginx/sbin/nginx              # 替换为新编译的二进制文件
systemctl start nginx #重启服务

编辑配置文件,将 server_tokens 设置为 on,并重启服务:

bash 复制代码
vim /usr/local/nginx/conf/nginx.conf
http {
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens on;
	......
}
# 重启服务并测试
systemctl restart nginx
curl -I http://192.168.10.110

二、修改用户与组

2.1 配置用户与组

编辑 Nginx 配置文件,修改用户和组为 nginx:

nginx 复制代码
user nginx nginx;   # 取消注释并修改

重启服务并验证进程所属用户:

bash 复制代码
systemctl restart nginx
ps -aux | grep nginx

应显示主进程由 root 创建,子进程由 nginx 创建。


三、缓存时间设置

3.1 配置缓存时间

当Nginx将网页数据返回给客户端后,可设置缓存时间 ,以方便在日后进行相同内容的请求时直接返回,避免重复请求,加快了访问速度。一般针对静态网页设置,对动态网页不设置缓存时间。

Nginx服务器处理请求并配置缓存的完整流程。核心流程和关键配置如下

1、用户请求​​:浏览器发起对图片资源(如JPG/PNG)的HTTP请求。

2、​​Nginx接收请求​​:通过80端口监听请求,匹配配置中的location规则(例如正则表达式location ~ .(jpg|png))。

3、资源处理​​:Nginx根据root配置找到磁盘上的文件,并读取数据。

4、响应与缓存控制​​:

  • 返回资源时,Nginx 根据 expires 1d的配置,在响应头中设置 Cache-Control: max-age=86400和 Expires字段,从而强制浏览器缓存资源1天。
  • 浏览器接收后会将资源存入本地缓存,并在后续请求中优先使用缓存(避免重复请求)。

5、​​客户端行为​​:浏览器遵循缓存策略,在有效期内(86400秒)直接使用本地缓存,提升页面加载效率。

为静态资源设置缓存时间,提升静态资源访问效率并降低服务器负载。在 server 块中添加以下 location 配置:

nginx 复制代码
location / {
			root html;
			index index.html index.htm;
		}

location ~ \.(gif|jpg|jepg|png|bmp|ico)$ {
    root html;
    expires 1d;   # 设置缓存时间为1天
}

重启服务并测试访问

bash 复制代码
#重启服务
systemctl restart nginx
#测试访问
http://192.168.10.110/game.jpg
  1. 打开浏览器(推荐使用Chrome),按下F12
  2. 切换到Network(网络)选项卡
  3. 访问URL:http://192.168.10.110/game.jpg
  4. 在响应列表中找到200状态码的请求,双击查看详情
  5. 在响应头中确认存在Cache-Control:max-age=86400字段

该设置表示资源缓存有效期为86400秒(24小时)。在此期间,浏览器会直接使用本地缓存数据,无需向Nginx服务器重复请求,有效降低服务器带宽消耗。


四、日志切割

优化日志分割策略,便于日常分析和文件大小管理,防止日志文件过大。

4.1 日志切割脚本

创建日志切割脚本 /opt/fenge.sh,内容如下:

bash 复制代码
vim /opt/fenge.sh
#!/bin/bash
# Filename: fenge.sh
#显示前一天的时间
day=$(date -d "-1 day" "+%Y%m%d")       
logs_path="/var/log/nginx"
pid_path="/usr/local/nginx/logs/nginx.pid"
#创建日志文件目录
[ -d $logs_path ] || mkdir -p $logs_path#移动并重命名日志文件(需通知Nginx重建)
mv /usr/local/nginx/logs/www.simoncwh.access.log ${logs_path}/www.simoncwh.access.log-$day
#重建新日志文件
kill -USR1 $(cat $pid_path)
#删除30天之前的日志文件
find $logs_path -mtime +30 -exec rm -rf {} \;
#find $logs_path -mtime +30 | xargs rm -rf 

添加执行权限并设置定时任务:

bash 复制代码
chmod +x /opt/fenge.sh
crontab -e
# 添加以下行,每天凌晨1点执行日志切割
0 1 * * * /usr/bin/sh /opt/fenge.sh



五、连接超时设置

HTTP有一个KeepAlive模式,它告诉web服务器在处理完一个请求后保持这个TCP连接的打开状态。若接收到来自同一客户端的其它请求,服务端会利用这个未被关闭的连接,而不需要再建立一个连接。

KeepAlive 在一段时间内保持打开状态,它们会在这段时间内占用资源。占用过多就会影响性能。

5.1 配置连接超时参数

在 http 块中设置以下参数,优化连接管理:

nginx 复制代码
http {
...... 
keepalive_timeout 65 180;     # 保持连接的超时时间,空闲连接65秒后关闭,建议客户端超时180秒
client_header_timeout 80;      # 客户端发送请求头超时时间
client_body_timeout 80;        # 客户端发送请求体超时时间
}

参数说明:

  • keepalive_timeout:指定 TCP 连接保持时间。
    • Nginx的默认值是65秒,有些浏览器最多只保持 60 秒,所以可以设定为 60 秒。若将它设置为0,就禁止了keepalive 连接。
  • client_header_timeout:客户端发送完整请求头的超时时间,超时返回 408(Request Timed Out)。
  • client_body_timeout:客户端发送请求体的超时时间,超时返回 408。

重启 Nginx 使配置生效。

bash 复制代码
systemctl restart nginx

六、更改进程数

高并发场景,需要启动更多的Nginx进程以保证快速响应,以处理用户的请求,避免造成阻塞

6.1 优化进程数与 CPU 亲和性

查看 CPU 核数并调整 Nginx 工作进程数:

bash 复制代码
cat /proc/cpuinfo | grep "processor" |sort -u |wc -l  #查看cpu逻辑核数
ps -aux | grep nginx			#查看nginx主进程中包含几个子进程

编辑配置文件,设置工作进程数和 CPU 亲和性:

nginx 复制代码
vim /usr/local/nginx/conf/nginx.conf
worker_processes 2;                # 建议与 CPU 核数相同或为其2倍
worker_cpu_affinity 01 10;         # 设置进程与 CPU 绑定(示例为2核配置),进程数配为4时0001 0010 0100 1000

最优雅和自动化的方式是直接使用 auto 参数,Nginx 会自动检测并设置为逻辑核心数。

bash 复制代码
worker_processes auto; # 推荐:自动设置为逻辑CPU核心数

重启 Nginx 服务。

bash 复制代码
systemctl restart nginx

使用场景

1、高并发

2、CPU压力不均衡的时候


七、配置网页压缩

Nginx的ngx_http_gzip_module模块提供了内容压缩功能。

该模块默认已安装,能够在向客户端发送数据前对输出内容进行压缩,有效节省带宽并提升用户体验。

可以通过修改配置文件中的相关参数来优化压缩性能。

7.1 启用 Gzip 压缩

在 http 块中启用压缩功能,优化传输效率:

nginx 复制代码
vim /usr/local/nginx/conf/nginx.conf
http {
...... 
   gzip on;							#取消注释,开启gzip压缩功能
   gzip_min_length 1k;      		#最小压缩文件大小
   gzip_buffers 4 64k;      		#压缩缓冲区,大小为4个64k缓冲区
   gzip_http_version 1.1;   		#压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
   gzip_comp_level 6;       		#压缩比率      1:压缩比最小,速度最快;9:压缩比最大,传输速度最快,但处理也最慢,也比较的消耗CPU资源 
   gzip_vary on;					#支持前端缓存服务器存储压缩页面
   gzip_types text/plain text/javascript application/x-javascript text/css text/xml application/xml application/xml+rss image/jpg image/jpeg image/png image/gif application/x-httpd-php application/javascript application/json;		#压缩类型,表示哪些网页文档启用压缩功能
...... 
}

在 HTML 中引用图片资源,重启 Nginx 后通过浏览器验证响应头是否包含 Content-Encoding: gzip

bash 复制代码
cd /usr/local/nginx/html
先将game.jpg文件传到/usr/local/nginx/html目录下
vim index.html
...... 
<html>
<body>
<img src="game.jpg"/>				#网页中插入图片
</body>
</html>

重启nginx服务

bash 复制代码
systemctl restart nginx
  1. 打开浏览器(推荐使用Chrome),按下F12
  2. 切换到Network(网络)选项卡
  3. 访问URL:http://192.168.10.110
  4. 在响应列表中找到200状态码的请求,双击查看详情
  5. 在响应头中确认存在Content-Encoding: gzip字段

八、配置防盗链

环境规划

8.1 防盗链配置示例

在 Nginx 源主机nginx.conf中的server 块中添加以下 location 配置,防止非法网站盗用资源:

bash 复制代码
vim /usr/local/nginx/conf/nginx.conf
http {
......
	server {
	......
		location ~* \.(jpg|gif|swf)$ {
			valid_referers none blocked *.yjs.com yjs.com;
			if ( $invalid_referer ) {
				# 将请求路径为 ^/(^/会匹配 ​所有请求路径​​)的URL重定向到 http://www.yjs.com/error.png
				rewrite ^/ http://www.yjs.com/error.png;
				#return 403;
            }
        } 
	......
	}
}

参数说明:

  1. ~* \.(jpg|gif|swf)$:匹配不区分大小写,以.jpg、.gif或.swf结尾的文件
  2. valid_referers:配置可信来源网站,允许其正常访问图片资源
  3. 访问控制规则:
    • none:允许不带Referer字段的请求(如直接在地址栏输入URL,这种请求是不会包含 Referer 字段的)
    • blocked:允许非http://开头的,不带协议的请求访问资源
    • *.yjs.com:仅允许来自该域及其子域的请求

访问示例:通过http://www.yjs.com访问game.jpg时,请求被视为来自http://www.yjs.com

判断逻辑(if):当请求来源不在valid_referers列表中时,$invalid_referer为true,将执行重定向或返回403禁止访问

8.2 测试准备

在 Web 源主机和盗链网站主机分别配置 hosts 和 HTML 页面,测试防盗链是否生效。

网页准备:

Web源主机(192.168.10.110)配置:

bash 复制代码
cd /usr/local/nginx/html
将game.jpg、error.png文件传到/usr/local/nginx/html目录下
vim index.html
<html>
<body>
<img src="game.jpg"/>
</body>
</html>

echo "192.168.10.110 www.yjs.com" >> /etc/hosts 
echo "192.168.10.123 www.simoncwh.com" >> /etc/hosts 

盗链网站主机(192.168.10.123):

bash 复制代码
cd /usr/local/nginx/html
vim index.html
...... 
<html>
<body>
<img src="http://www.yjs.com/game.jpg"/>
</body>
</html>

echo "192.168.10.110 www.yjs.com" >> /etc/hosts 
echo "192.168.10.123 www.simoncwh.com" >> /etc/hosts 

在盗图网站主机上进行浏览器验证

http://www.simoncwh.com

8.3 防盗链验证

  • 正常访问www.yjs.com
  • 不设置防盗链时访问http://www.simoncwh.com
  • 设置防盗链时访问http://www.simoncwh.com

8.4 完整流程

  1. DNS 解析

    • 在浏览器中访问 http://www.simoncwh.com
    • 客户端检查 /etc/hosts 文件,发现 www.simoncwh.com 映射到 192.168.10.123
    • 浏览器向 192.168.10.123 发送 HTTP 请求获取 index.html
  2. 获取 HTML 内容

    • 192.168.10.123 的 Nginx 服务器返回 index.html 内容。

    • HTML 内容如下:

      html 复制代码
      <html>
      <body>
      <img src="http://www.yjs.com/game.jpg"/>
      </body>
      </html>
  3. 加载图片资源

    • 浏览器解析 HTML 后,发现需要加载图片 http://www.yjs.com/game.jpg
    • 客户端再次检查 /etc/hosts 文件,发现 www.yjs.com 映射到 192.168.10.110
    • 浏览器向 192.168.10.110 发送请求获取 game.jpg,并在请求头中设置 Refererhttp://www.simoncwh.com/(因为图片是从 www.simoncwh.com 页面引用的)。
  4. 防盗链检查

    • 请求到达 192.168.10.110 的 Nginx 服务器。
    • Nginx 匹配防盗链规则 location ~* \.(jpg|gif|swf)$,因为请求的是 game.jpg
    • Nginx 检查 Referer 头(值为 http://www.simoncwh.com/)是否在 valid_referers 列表中(none blocked *.yjs.com yjs.com)。
    • Referer 来自 www.simoncwh.com,不在允许列表中,因此 $invalid_referer 变量值为 1,触发防盗链操作。
    • Nginx 执行 rewrite ^/ http://www.yjs.com/error.png;,这返回一个 302 重定向 响应, Response Header 中的 Location 头为 http://www.yjs.com/error.png
  5. 重定向处理

    • 浏览器收到 302 重定向响应,自动向新 URL http://www.yjs.com/error.png 发送请求。
    • 浏览器在这次请求中可能还会设置 Referer 头为 http://www.simoncwh.com/(因为重定向发生在同源环境下,浏览器通常保留原始 Referer)。
  6. 获取 error.png

    • 请求 error.png 到达 192.168.10.110 的 Nginx 服务器。
    • 防盗链规则只针对 .jpg.gif.swf 文件,因此 error.png 不匹配防盗链 location 块。
    • Nginx 直接返回 error.png 图片内容(假设该文件存在于服务器上)。
  7. 最终显示

    • 浏览器接收到 error.png 图片,并显示在 www.simoncwh.com 的页面上,代替原本的 game.jpg
    • 用户看到的是错误图片(error.png),而不是预期的 game.jpg。

总结

通过以上几个方面的配置优化,不仅可以提升 Nginx 服务器的处理能力和响应速度,还能有效加强服务的安全性。

在实际生产环境中,应根据具体业务需求和服务器资源情况灵活调整各项参数。定期审查和更新配置,结合监控日志,可确保服务持续稳定运行。

建议在修改配置前备份原文件,并在测试环境验证无误后再部署至生产环境。

相关推荐
二进制coder1 分钟前
Linux RTC 驱动子系统详细实现方案
linux·运维·实时音视频
淮北49411 分钟前
linux系统学习(10.shell基础)
linux·运维·服务器·学习
视觉震撼26 分钟前
RDP登录事件详细溯源分析脚本(兼容Windows PowerShell版本)
运维·网络·windows·网络安全·网络攻击模型·安全威胁分析·安全架构
zhojiew39 分钟前
使用cline集成aws的mcp服务和搜索功能
云计算·aws
noravinsc1 小时前
两台 centos 7.9 部署 pbs version 18.1.4 集群
linux·运维·centos
你的微笑,乱了夏天1 小时前
linux centos常用命令整理
linux·运维·centos
云心雨禅1 小时前
AI训练成本优化,腾讯云GPU实例选型
人工智能·云计算·腾讯云
鼓掌MVP1 小时前
基于腾讯云EdgeOne边缘安全加速平台和CodeBuddy MCP构建的高性能分布式计算资源共享平台
安全·云计算·腾讯云
网硕互联的小客服1 小时前
Windows2008 如何禁用FSO?
运维·服务器·网络·windows·安全
塔能物联运维2 小时前
物联网运维中的多模态数据融合与智能决策优化技术
运维·物联网