深入解析:Nginx优化与防盗链

news/2025/12/6 18:35:22/文章来源:https://www.cnblogs.com/tlnshuju/p/19316367

深入解析:Nginx优化与防盗链

2025-12-06 18:31  tlnshuju  阅读(0)  评论(0)    收藏  举报

Nginx服务优化

一、隐藏Nginx版本号,避免安全漏洞泄漏

Nginx的版本号可能会暴露服务器的一些信息,因此有时我们需要隐藏它以提高安全性。

方法一:通过修改配置文件

1,编辑Nginx配置文件
使用vim或其他文本编辑器打开Nginx的配置文件:

vim /usr/local/nginx/conf/nginx.conf

2,关闭版本号显示

http {include       mime.types;default_type  application/octet-stream;server_tokens off;		 					#添加,关闭版本号......
}

3,重启Nginx服务
保存并退出编辑器后,重启Nginx服务以使更改生效:

systemctl restart nginx

4,验证更改
使用curl命令检查响应头是否已不再包含版本信息:

curl -I http://192.168.37.133
方法二:通过修改源码并重新编译安装

这种方法更为深入,适用于需要自定义版本号或服务器标识的情况。

1,编辑源码文件
打开Nginx的源码文件nginx.h:

vim /opt/nginx-1.12.0/src/core/nginx.h

修改以下两行以更改版本号和服务器类型:

#define NGINX_VERSION "1.1.1" // 修改为你想要的版本号
#define NGINX_VER "IIS/" NGINX_VERSION // 修改服务器类型,例如"IIS"

2,重新编译和安装Nginx
在源码目录中运行以下命令以重新配置、编译和安装Nginx:

cd /opt/nginx-1.12.0/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
make && make install

3,启用版本号显示(可选)

如果你想在配置文件中再次启用版本号显示,可以在nginx.conf中设置:

server_tokens on;

4,重启Nginx服务
保存所有更改并重启Nginx服务:

systemctl restart nginx

5,测试
再次使用curl命令检查响应头:

curl -I http://192.168.37.133

注意:修改源码并重新编译安装是一个更为复杂的过程,通常只在需要深度定制Nginx时采用。对于大多数情况,简单地修改配置文件就足够了。

二、修改用户与组

为了提高[Nginx服务器的安全性,通常建议将Nginx运行在非root用户下。

vim /usr/local/nginx/conf/nginx.conf
user nginx nginx; 								#取消注释,修改用户为 nginx ,组为 nginx
systemctl restart nginx   #重启Nginx服务以使更改生效
ps aux | grep nginx       #使用以下命令查看Nginx进程的用户与组
#主进程由root创建,子进程由指定的用户(这里是nginx)创建

三、缓存时间

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

vim /usr/local/nginx/conf/nginx.conf
http {
......
server {
......
location / {
root html;
index index.html index.htm;
}
location ~ \.(gif|jpg|jepg|png|bmp|ico)$ { 		#加入新的 location,以图片作为缓存对象
root html;
expires 1d;							#指定缓存时间,1天
}
......
}
}
#重启服务
systemctl restart nginx
#测试访问  在浏览器中访问一个设置了缓存的静态资源 例如:http://192.168.37.133/game.jpg然后查看响应头信息。你应该能看到类似以下的缓存控制指令:
Cache-Control: max-age=86400
#这表示资源已被缓存,且在接下来的86400秒(即1天)内,浏览器会直接从缓存中加载该资源,而不会重新向Nginx服务器发送请求,减少了服务器的使用带宽。
#通过以上步骤,你可以轻松地修改Nginx的用户与组,并为静态资源设置合适的缓存时间,从而提高服务器的安全性和性能。

四、配置Nginx日志切割

为了管理Nginx日志文件的大小并防止日志文件过大,我们可以使用日志切割脚本定期将旧的日志文件移动到其他位置,并创建新的日志文件。以下是一个简单的日志切割脚本示例:

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
# 移动并重命名前一天的访问日志文件
mv /usr/local/nginx/logs/access.log ${logs_path}/kgc.com-access.log-$day
# 发送USR1信号给Nginx主进程,通知它重新打开日志文件
kill -USR1 $(cat $pid_path)
#删除30天之前的日志文件
#find $logs_path -mtime +30 | xargs rm -rf 
find $logs_path -mtime +30 -exec rm -rf {} \;
#赋予脚本执行权限
chmod +x /opt/fenge.sh
#手动运行脚本测试
/opt/fenge.sh
#检查日志文件是否已正确切割和重命名
ls /var/log/nginx
ls /usr/local/nginx/logs/access.log
#设置定时任务,每天凌晨1点自动运行日志切割脚本
crontab -e
0 1 * * * /opt/fenge.sh

Linux文件时间参数小知识

在Linux操作系统中,每个文件都有三个重要的时间参数:ctime、atime和mtime。

ctime (status time)
当文件的权限或属性被修改时,ctime会更新。它并不表示文件的创建时间,而是表示文件状态的最后更改时间。仅当文件的属性或权限发生变化时,ctime才会更新,而文件内容的更改不会影响ctime。

atime (access time)
每次访问文件(例如读取文件内容)时,atime都会更新。这有助于跟踪文件的访问频率和最近的使用情况。

mtime (modification time)
当文件的内容被修改时,mtime会更新。这是文件内容最后一次被更改的时间戳。与ctime不同,更改文件的权限或属性不会影响mtime。

五、配置Nginx连接保持的超时时间

HTTP有一个KeepAlive模式,它告诉web服务器在处理完一个请求后保持这个TCP连接的打开状态。若接收到来自同一客户端的其它请求,服务端会利用这个未被关闭的连接,而不需要再建立一个连接。
KeepAlive 在一段时间内保持打开状态,它们会在这段时间内占用资源。占用过多就会影响性能。

vim /usr/local/nginx/conf/nginx.conf
#设置KeepAlive超时
http {
......
keepalive_timeout 65 180;      三次握手的超时时间
client_header_timeout 80;       等待客户端发送请求头的超时时间会送408 错误
client_body_timeout 80;          设置客户端发送请求体的超时时间
......
}
systemctl restart nginx
------------------------------------------------------------------------------------------
#keepalive_timeout
指定KeepAlive的超时时间(timeout)。指定每个TCP连接最多可以保持多长时间,服务器将会在这个时间后关闭连接。 Nginx的默认值是65秒,有些浏览器最多只保持 60 秒,所以可以设定为 60 秒。若将它设置为0,就禁止了keepalive 连接。
第二个参数(可选的)180秒指定了在响应头Keep-Alive:timeout=time中的time值。这个头能够让一些浏览器在达到指定时间后主动关闭连接.没有这个参数,Nginx 不会发送 Keep-Alive 响应头。
##client_header_timeout
客户端向服务端发送一个完整的 request header 的超时时间。如果客户端在指定时间内(80)没有发送一个完整的请求头,Nginx 返回 HTTP 408(Request Timed Out)。
###client_body_timeout
指定客户端与服务端建立连接后发送 request body 的超时时间。如果客户端在指定时间内没有发送任何请求体内容,Nginx 返回 HTTP 408(Request Timed Out)。

六、更改Nginx进程数以优化高并发性能

在高并发场景下,为了保证服务器能够快速响应用户请求并避免阻塞,可能需要启动更多的Nginx工作进程。合理配置Nginx的工作进程数和CPU亲和性可以显著提升服务器的性能。

cat /proc/cpuinfo | grep -c "physical id"	#查看cpu物理核心数量
ps aux | grep nginx						#查看当前Nginx主进程中包含的子进程数量
#根据服务器的CPU核数调整worker_processes参数
vim /usr/local/nginx/conf/nginx.conf
worker_processes  2;			 #修改为CPU核数相同或者2倍
worker_cpu_affinity 01 10  ;
#设置每个进程由不同cpu处理,这样可以减少进程在不同核心间的切换,提高缓存命中率,从而提升性能。进程数配为4时0001 0010 0100 1000
#保存并退出编辑器后,重启Nginx服务以使更改生效
systemctl restart nginx

七、配置网页压缩

Nginx的ngx_http_gzip_module压缩模块提供对文件内容压缩的功能
允许Nginx服务器将输出内容在发送客户端之前进行压缩,以节约网站带宽,提升用户的访问体验,默认已经安装
可在配置文件中加入相应的压缩功能参数对压缩性能进行优化

vim /usr/local/nginx/conf/nginx.conf
#在http块中添加或修改以下配置
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_disable "MSIE [1-6]\.";       # 禁用IE6及以下版本的gzip压缩
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;		#压缩类型,表示哪些网页文档启用压缩功能
......
}
cd /usr/local/nginx/html
先将game.jpg文件传到/usr/local/nginx/html目录下
vim index.html
......
<img src="game.jpg"/>				#网页中插入图片</body></html>#保存并退出编辑器后,重启Nginx服务以应用更改systemctl restart nginx

网页图片大小压缩

Nginx通过http_image_filter_module模块提供了图片处理功能,可以实时缩放图片等。

步骤:

1,安装依赖

安装gd-devel库,这是http_image_filter_module模块所依赖的:

yum install -y gd-devel
2,重新编译Nginx

进入Nginx源码目录,并添加http_image_filter_module模块,然后重新编译安装:

cd /opt/nginx-1.12.0/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_image_filter_module
make && make install
3,配置图片压缩

在Nginx配置文件的server块中添加图片压缩规则:

location ~* \.(jpg|gif|png)$ {image_filter resize 200 200;  # 按等比例缩小图像至指定大小
}
4,测试配置
cd /usr/local/nginx/html
#先将game.jpg文件传到/usr/local/nginx/html目录下
vim index.html
......
<img src="game.jpg"/>#网页中插入图片</body></html>
5,重启Nginx服务
systemctl restart nginx

在Linux系统中,打开火狐浏览器,右击点查看元素
选择 网络 —> 选择 HTML、WS、其他

访问 http://192.168.37.133 ,双击200响应消息查看响应头中包含 Content-Encoding: gzip

注意:
Nginx的Gzip压缩功能虽然好用,但是下面两类文件资源不太建议启用此压缩功能。

  • 图片/视频类型资源 原因:图片如jpg、png文件本身就会有压缩,所以就算开启gzip后,压缩前和压缩后大小没有多大区别,所以开启了反而会白白的浪费资源。
  • 大文件资源 原因:会消耗大量的cpu资源,且不一定有明显的效果。

八、配置防盗链

vim /usr/local/nginx/conf/nginx.conf
#添加防盗链规则,在server块中针对图片文件类型(如jpg, gif, swf)添加配置
http {
......
server {
......
location ~* \.(jpg|gif|swf)$ {
valid_referers none blocked *.cat.com;
if ( $invalid_referer ) {
rewrite ^/ http://www.cat.com/error.png;
rewrite 跳转
#return 403;
}
}
......
}
}
----------------------------------------------------------------------------------------------------------
~* \.(jpg|gif|swf)$ :这段正则表达式表示匹配不区分大小写,以.jpg 或.gif 或.swf 结尾的文件;
valid_referers :设置信任的网站,可以正常使用图片;
none:允许没有http_refer的请求访问资源
blocked:允许不是http://开头的,不带协议的请求访问资源;
*.cat.com:只允许来自指定域名的请求访问资源,如 http://www.cat.com
if语句:如果链接的来源域名不在valid_referers所列出的列表中,$invalid_referer为true,则执行后面的操作,即进行重写或返回 403 页面。
----------------------------------------------------------------------------------------------------------
网页准备:
Web源主机(192.168.37.133)配置:
cd /usr/local/nginx/html
#将game.jpg、error.png文件传到/usr/local/nginx/html目录下
vim index.html
<body><html><img src="game.jpg"/></body></html>#更新/etc/hosts文件,添加域名映射echo "192.168.37.133 www.cat.com" >> /etc/hosts盗链网站主机(192.168.37.134):cd /usr/local/nginx/htmlvim index.html<html><body><img src="http://www.cat.com/game.jpg"/></body></html>#更新/etc/hosts文件,添加域名映射echo "192.168.37.134 www.dog.com" >> /etc/hosts#在盗图网站主机上进行浏览器验证#访问http://www.dog.com,应该能看到原本应该显示的图片被替换成了error.png,这表明防盗链配置成功。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/990449.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[GESP202312 三级] 小猫分鱼

[GESP202312 三级] 小猫分鱼B3925 [GESP202312 三级] 小猫分鱼 题目描述 海滩上有一堆鱼,N 只小猫来分。第一只小猫把这堆鱼平均分为 N 份,多了 i<N 个,这只小猫把多的 i 个扔入海中,拿走了一份。第二只小猫接着…

实用指南:微软加速在亚洲扩展云基础设施,推动区域数字化跨越式发展

实用指南:微软加速在亚洲扩展云基础设施,推动区域数字化跨越式发展pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &qu…

markdown文档格式分析,再使用python对md文件进行结构化拆解

一、markdown文档 Markdown 文档本质上是:一个树状结构(Block 级) + 行内结构(Inline 级) Block 级元素(结构):heading_open → inline → heading_closeparagraph_open → inline → paragraph_closelist_ope…

CMake Uninstall

CMake does not provide a built-in uninstall command, but you can implement an uninstall process manually using the install_manifest.txt file generated during installation. Below are the steps to add an…

实用指南:通过约束编程优化医疗智能系统的伦理风险降低(下)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【Java 开发日记】大家来说一下 Mybatis 的缓存机制

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Day12-20251206

本文介绍了Java中的运算符使用和优先级规则。主要内容包括:1) IDEA快捷键Shift+Enter换行和Shift+Ctrl+Enter自动补全;2) 自增自减运算符++/--的前置和后置区别;3) 逻辑运算符&&、||、!的用法;4) 位运算符…

悬架设计计算工具:开启悬架设计学习与实践的钥匙

悬架设计计算工具:开启悬架设计学习与实践的钥匙pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas",…

Solon AI 开发学习17 - generate - 使用复杂提示语

本文介绍了两种使用GeneratePrompt接口的方法:快速方法和定制提示语结构体。快速方法通过键值对直接构建请求,适用于简单场景;定制方法通过定义结构体类实现更规范的参数管理。两种方法都演示了如何调用阿里百炼API…

别再发愁!对比多款后锁定这6个型号,挑选高中学习机,不花冤枉钱

高中阶段的学习节奏快、知识点密集,不少家长希望通过学习机为孩子提供辅助,但面对市场上琳琅满目的产品,很容易陷入“选贵的就是好的”误区。事实上,适合高中学习的核心在于知识点覆盖的精准度、错题体系的实用性、…

[UVA1316 Supermarket]

UVA1316 Supermarket题目大意给一些物品,有过期时间和收益,让你安排卖出的顺序,使得最后的收益最大。对于每件物品,我们考虑贪心思路,每个物品我们尽量让其在接近过期的时候将其卖掉,这样的话,我们在排序的时候…

使用typora来写md文件时配置文件存放图片的路径

前言 当前typora写md文件,存放文件,如果是windows系统则默认存放在c盘的默认绝对路径中,这个时候如果想发送md文件给其他人,很容易造成图片的遗漏。 所以我们需要设置,让文件所处位置相对简单,然后提升发送md文件…

靠谱厂房拆迁法律机构排行榜 2026:专业解析与高性价比解决方案

在城市更新与产业升级的浪潮中,企业厂房拆迁纠纷日益频发,涉及土地补偿、停产损失、安置重建等多重复杂权益,一旦处理不当将给企业带来致命打击。北京作为法治资源集中地,汇聚了众多律师、律师事务所及在线律师咨询…

滥用ESC10:通过注册表配置不当实现权限提升的ADCS攻击分析

本文深入分析了Active Directory证书服务(ADCS)中的ESC10漏洞。该漏洞源于两项注册表键值(StrongCertificateBindingEnforcement和CertificateMappingMethods)的错误配置,攻击者可借此滥用Kerberos或Schannel映射…

[NOI2015 程序自动分析]

题目大意给定一些简单的约束关系,即相等和不等关系,让你判断是否合理。简单来说,我们对于 \(x_i = x_j\),说明 \(x_i\) 和 \(x_j\) 属于一个集合,将其合并即可,对于不等关系时,我们只需要判断其是否在一个集合里…

【基础】Unity着色器网格和计算对象介绍

Mesh网格定义与核心概念 顶点(Vertex)的本质与特性 顶点是构成3D模型的基本几何单元,每个顶点在三维空间中具有明确的坐标位置(x,y,z)。在Unity中,顶点不仅包含位置信息,还承载着模型【Unity Shader Graph 使用…

【基础】Unity着色器网格和计算对象介绍

Mesh网格定义与核心概念 顶点(Vertex)的本质与特性 顶点是构成3D模型的基本几何单元,每个顶点在三维空间中具有明确的坐标位置(x,y,z)。在Unity中,顶点不仅包含位置信息,还承载着模型【Unity Shader Graph 使用…

基于大内容的保险数据管理与可视化分析平台

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

深入解析:C++ 闭散式和开散式的模拟实现

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

基于先验地图的无人机路径规划

基于先验地图的无人机路径规划 任务1.先验地图数据处理 任务2.路径规划算法实现(A*) 参考已有工作1.基础知识学习 快速补充一些基础知识,后续边做边学:C++基础语法,点云地图处理 C++语法学习主要参考黑马程序员C+…