nginx的优化和防盗链 重要!!!

实验一、隐藏版本号

 要把nginx的版本号隐藏起来,防止恶意攻击

方法一:修改配置文件

在http模块中加入一个命令

server_token off;

过程:

 备份,改配置文件一定要备份

 修改配置文件

 在http模块中添加   server_tokens off;

重启一下服务 ,再回到网页查看版本号是否被隐藏

 这时发现已经被隐藏了

方法二:在源码包里修改

在nginx源码包里src/core/ 中nginx.h的文件中

修改源码包

 

 

在源码包里进行修改要想生效,需要在源码包的主目录重新编译一下

 

 

 在配置文件中把server_tokens打开

重启服务 

 回到浏览器刷新一下,修改成功

总结:两个方法会一个即可,

实验二:nginx日志分割

nginx不自带日志分割工具,需要手动以脚本的形式进行日志分割

 访问成功记载access.log

访问失败记录在error.log

先看一下日志的时间格式怎么写 

 写一个脚本

 

#!/bin/bash

# 获取日期
d=$(date +%Y-%m-%d)

# 定义存储目录
dir="/usr/local/nginx/logs"

# 定义需要分割的源日志
logs_file='/usr/local/nginx/logs/access.log'
logs_error='/usr/local/nginx/logs/error.log'

# 定义nginx的pid文件
pid_file='/usr/local/nginx/run/nginx.pid'

if [ ! -d "$dir" ]
then
    mkdir $dir
fi

# 移动日志并重命名文件
mv ${logs_file} ${dir}/access_${d}.log
mv ${logs_error} ${dir}/error_${d}.log

# 发送kill -USR1信号给Nginx的主进程号,让Nginx重新生成一个新的日志文件
kill -USR1 $(cat ${pid_file})

#日志文件清理,将30天前的日志进行清除
find $logs_path -mtime +30 -exec rm -rf {} \;

 

赋权执行

查看一下log里面有两个新的日志文件 

 里面记录了8月5日的日志

实验三:nginx的页面压缩

页面压缩可以节约带宽,提高用户的访问速度

压缩的功能是默认自带的,可以不取消注释

但是需要添加压缩细节,需要把gzip打开后进行配置

修改配置文件

 

 取消注释,开启gzip的压缩功能

 接着添加代码

   gzip_min_length 1k;        

   #最小压缩文件的大小      
   gzip_buffers 4 64k;      

   #压缩缓冲区,大小为4个64K缓冲区,Nginx 会使用 4 个 64KB 大小的缓冲区来存储压缩后的数据。
   gzip_http_version 1.1;    

   #压缩版本,默认为1.1
   gzip_comp_level 6;        

   #压缩比率(压缩等级为1-9,6是中等等级,也是常用等级)Gzip 压缩级别的范围是 1 到 9,
   其中 1 表示压缩速度最快,但压缩比最低,9 表示压缩速度最慢,但压缩比最高。默认值为 1。
   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;
#压缩的类型,哪些文档启用压缩功能
                            

重启服务使配置生效 

 刷新一下浏览器,看gzip压缩功能是否打开

实验四:图片缓存

 拖一个图片到html中

可以在网页看到拖入的图片,f12查看一下,Cache-Control:max-age=0 表示图片没有缓存,下次查看图片还需要把图片再下载一次,下面设一个缓存

在location块下面直接添加 

~*:正则匹配

\.:就是点

(gif|jpg|jepg|bmp|ico):里面不能用png格式的,会陷入死循环

获取图片的根目录为  root  html

expires 1d;    #设置缓存时间为一天;         

重启一下让配置生效 

 在浏览器里刷新一下并查看,缓存时间已经改为1天

连接超时:

连接超时在配置文件中的位置

 

http1.1会有一个keepalive模式,主要作用是告诉web服务器,他在处理完一个请求之后保持当前连接的tcp状态为打开状态,也就是在请求完之后不会立刻关闭,而是保持一个打开的状态。

如果当前连接有新的请求,服务端就会利用这个没有关闭的连接,继续给客户端响应,不需要再建立一个新的连接。大大节约了资源。

keepalive在一段时间之内保持打开状态,在这段时间内还是会占用资源,占用过多会影响性能

图中的keepalive_timeout  65;  意思是tcp连接最多可以保持65秒

设置为0,就是禁用了keepalive功能。只要请求完成立刻关闭tcp连接

实验五:nginx的并发设置

nginx的并发设置:在高并发场景中,需要启动更多的nginx进程以保证响应速度,可以更快的处理用户的请求,避免堵塞。

1、cpu的核心数来进行设置

 cat /proc/cpuinfo |grep processor|wc -l        查看cpu核心数

2、设置worker进程绑定到指定的cpu的命令,减少cpu切换带来的开销。

确保worker进程在一个独立的cpu核心上运行(在工作中也用得到)

 修改配置文件

 把1改成4

重启服务 

 查看一下进程,worker进程变为4个

 每个work进程可以处理1024个文件数,总共可以处理的文件数为4*1024=4096个

但是还需要使用ulimit  -n解除限制

面试会问

设置worker进程绑定到指定的cpu的命令,减少cpu切换带来的开销。

确保worker进程在一个独立的cpu核心上运行(在工作中也用得到)

01表示cpu1  10表示cpu2  100表示cpu3  这个是按二进制转10进制算的

在生产中worker一般设置为4,访问量不大时1也足够了,如果要扩展,最多8或16个

8个以上的worker进程就不会再提高性能了,反而会使性能降低,8个足够了

worker_cpu_affinity  单个worker进程可以不绑定cpu

TIME_WAIT:不是一个报错信息,是tcp连接状态中的一种状态,出现在tcp连接的四次挥手中

处于FIN=1和ack=1之间

当连接的乙方发送FIN报文,而且收到了对方的ack报文之后,就会进入TIME_WAIT  tcp处理等待的状态,是有一个持续时间,65秒,确保网络中的所有数据包都被完全处理完毕。

TIME_OUT有两个作用:1、确保可靠的关闭连接,如果立刻关闭连接,旧的数据包也会被处理,从而会干扰新的连接

2、避免连接复用,TIME_WAIT的时间太短,可能会导致旧的连接仍然在网络中,误认为是新的连接,导致连接复用,数据传输紊乱。

而且在连接的生命周期中,TIME_WAIT占有的资源是非常小的,而且对服务器整体性能的影响也很有限。大量的短链接频繁的创建的销毁,或者大并发连接时(负载均衡),TIME_WAIT连接会积累,服务器会出现大量的TIME_WAIT状态的连接,在这种情况下需要优化处理。

内核设置,进行优化

查看系统的所有tcp连接的状态:(必背,面试题)

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

tcp的连接状态:

CLOSED(关闭):表示该连接处于未活动状态,或者连接已经关闭。

LISTEN(监听):表示服务器正在等待来自客户端的连接请求,处于监听状态。

SYN_RECV(SYN 接收):表示服务器已经接收到来自客户端的 SYN 请求(连接请求),正在等待确认。

SYN_SENT(SYN 发送):表示应用程序已经向服务器发送了 SYN 请求,正在等待服务器确认。

ESTABLISHED(已建立):表示连接已经建立,正常的数据传输阶段。

FIN_WAIT1(终止等待1):表示应用程序已经发送了连接关闭请求(FIN),正在等待另一端的确认。

FIN_WAIT2(终止等待2):表示另一端已经确认连接关闭请求,正在等待另一端发送连接关闭请求。

CLOSE_WAIT(关闭等待):表示另一端已经关闭连接,但本地应用程序还未关闭连接。

CLOSING(正在关闭):表示双方同时尝试关闭连接。

TIME_WAIT(时间等待):表示连接已经关闭,但仍在等待一段时间,以确保网络中所有的数据包都已经被正确处理。

LAST_ACK(最后确认):表示应用程序已经发送了最后的确认,等待另一端的确认后进入 CLOSED 状态。

如何清理time_wait?   修改内核文件

内核文件位置

 

net.ipv4.tcp_syncookies = 1       
#表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理请求。

net.ipv4.tcp_tw_reuse=1
#让TIME_WAIT状态可以重用,这样即使TIME_WAIT占满了所有端口,也不会拒绝新的请求造成障碍 默认是0。

net.ipv4.tcp_tw_recycle=1         
#让TIME_WAIT尽快回收 默认0。

net.ipv4.tcp_fin_timeout=65        
#表示如果端口由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。

实验六:配置防盗链

valid_referers :设置信任的网站,可以正常使用图片;
none:允许没有http_refer的请求访问资源(根据Referer的定义,它的作用是指示一个请求是从哪里链接过来的,如果直接在浏览器的地址栏中输入一个资源的URL地址,那么这种请求是不会包含 Referer 字段的),如 http://www.kgc.com/game.jpg
我们使用 http://www.kgc.com 访问显示的图片,可以理解成 http://www.kgc.com/game.jpg 这个请求是从 http://www.kgc.com 这个链接过来的。
blocked:允许不是http://开头的,不带协议的请求访问资源; 
*.kgc.com:只允许来自指定域名的请求访问资源,如 http://www.kgc.com

$invalid_referer:只要不是valid_referers设置现任的网站,都为true

vim /usr/local/nginx/conf/nginx.conf
http {
......
    server {
    ......
        location ~* \.(jpg|gif|swf)$ {
            valid_referers none blocked *.kgc.com kgc.com;
            if ( $invalid_referer ) {
                rewrite ^/ http://www.kgc.com/error.png;
                #return 403;
            }
        }
    ......
    }
}

 

网页准备:
Web源主机(192.168.146.20)配置:
cd /usr/local/nginx/html
将game.jpg、error.png文件传到/usr/local/nginx/html目录下
vim index.html
...... 
<img src="game.jpg"/>
</body>
</html>

echo "192.168.146.20 www.kgc.com" >> /etc/hosts

echo "192.168.146.30 www.benet.com" >> /etc/hosts

盗链网站主机(192.168.146.30):
cd /usr/local/nginx/html
vim index.html
...... 
<img src="http://www.kgc.com/game.jpg"/>
</body>
</html>

echo "192.168.146.20 www.kgc.com" >> /etc/hosts

echo "192.168.146.30 www.benet.com" >> /etc/hosts

 
 

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

http://www.benet.com

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式开发学习(STC51-6-独立按键)

内容 通过开发板上的独立按键K1控制D1指示灯亮灭 按键简介 按键是一种电子开关&#xff0c;使用时轻轻按开关按钮就可使开关接通&#xff0c;当松开手时&#xff0c;开关断开&#xff1b; 通常的按键所用开关为机械弹性开关&#xff0c;当机械触点断开、闭合时&#xff0c;…

非阻塞IO

非阻塞IO fcntl 一个文件描述符, 默认都是阻塞IO。fcntl可以将某个文件描述符设置为非阻塞IO&#xff0c;先看一下文档介绍。 传入的cmd的值不同&#xff0c;后面追加的参数也不相同。 fcntl函数有5种功能: 复制一个现有的描述符&#xff08;cmd F_DUPFD&#xff09;。获得…

Unity面板究极优化

首先对于大项目来说UI首选一定的UGUI&#xff0c;目前没有啥可选的余地。多一点都是对性能的负担&#xff0c;UGUI底层基于多线程技术&#xff0c;可以有效分担压力&#xff0c;对于一些不是那么重的面板几乎无感。 无论其他面板只是在此基础上修改的&#xff0c;但每多一层&am…

图解架构 | SaaS、PaaS、IaaS/aPaaS平台是什么?aPaaS与PaaS有什么区别?

参考 图解架构 | SaaS、PaaS、IaaS:https://www.51cto.com/article/717315.html aPaaS平台是什么&#xff1f;aPaaS与PaaS有什么区别&#xff1f;&#xff1a;https://developer.aliyun.com/article/718714 aPaaS和PaaS的区别是什么&#xff1f; aPaaS和PaaS都可以完成软件的…

Redis 双写一致性实践及案例

面试问题&#xff1a; 你只要用缓存&#xff0c;就可能会涉及到redis缓存与数据库双存储双写&#xff0c;你只要是双写&#xff0c;就一定会有数据一致性的问题&#xff0c;那么你如何解决一致性问题&#xff1f;双写一致性&#xff0c;你先动缓存redis还是数据库mysql哪一个&…

Linux从安装到实战 常用命令 Bash常用功能 用户和组管理

1.0初识Linux 1.1虚拟机介绍 1.2VMware Workstation虚拟化软件 下载CentOS; 1.3远程链接Linux系统 &FinalShell 链接finalshell半天没连接进去 他说ip adress 看IP地址是在虚拟机上 win11主机是 终端输入&#xff1a; ifconfig VMware虚拟机的设置 & ssh连接_snge…

Word中如何断开表格中线段

Word中如何断开表格中线段_word表格断线怎么弄_仰望星空_LiDAR的博客-CSDN博客有时候为了美观&#xff0c;需要实现如下的效果&#xff0c;即第2条线段被断开成3段步骤如下&#xff1a;选中需要断开的格网&#xff0c;如下&#xff0c;再选择段落、针对下框标即可。_word表格断…

组件(lvs,keeplive,orm,mysql,分布式事务)

lvs LVS 已经集成到Linux内核系统中&#xff0c;ipvsadm 是 LVS 的命令行管理工具。 目前有三种 IP 负载均衡技术&#xff08; VS/NAT 网络地址转换 、VS/TUN IP 隧道技术实现虚拟服务器 和 VS/DR 直接路由&#xff09;&#xff1b; 八种调度算法&#xff1a;轮询 …

IntelliJ IDEA 如何优雅的添加文档注释(附详细图解)

IntelliJ IDEA 如何优雅的添加文档注释&#xff08;附详细图解&#xff09; &#x1f4cc;提要✍✍类注释✍✍方法注释 &#x1f4cc;提要 在开发过程中&#xff0c;最常用的注释有两种&#xff1a;类注释和方法注释&#xff0c;分别是为类和方法添加作者、日期、版本号、描述等…

ensp-GVRP服务

ensp-GVRP服务 日期&#xff1a;6-26 &#x1f4ce;GVRP实验.zip&#x1f4ce;GVRP服务.docx

【云原生|Docker系列第3篇】Docker镜像的入门实践

欢迎来到Docker入门系列的第三篇博客&#xff01;在前两篇博客中&#xff0c;我们已经了解了什么是Docker以及如何安装和配置它。本篇博客将重点介绍Docker镜像的概念&#xff0c;以及它们之间的关系。我们还将学习如何拉取、创建、管理和分享Docker镜像&#xff0c;这是使用Do…

从8个新 NFT AMM,聊聊能如何为 NFT 提供流动性

DeFi 的出现&#xff0c;开启了数字金融民主化的革命。其中&#xff0c;通过 AMM 自由创建流动性池极大地增加了 ERC-20 Token 的流动性&#xff0c;并为一些长尾 Token 解锁了价值的发现&#xff0c;因而今天在链上可以看到各种丰富的交易、借贷和杠杆等活动。 而另一方面&am…

angular-mat-select 多选 实现按选择顺序排序

mat-select 正常情况下,多选后,已选项是按列表顺序进行排序,如果我想实现按照点击项目的顺序进行排序,我该如何做呢? [参考网址](Angular order of selected option in multiple mat-select - Stack Overflow) sortComparator是Angular Material中mat-select组件的一个属…

无涯教程-Lua - 垃圾回收

Lua使用自动内存管理&#xff0c;该管理使用基于Lua内置的某些算法的垃圾回收。 垃圾收集器暂停 垃圾收集器暂停用于控制垃圾收集器之前需要等待多长时间&#xff1b; Lua的自动内存管理再次调用它。值小于100意味着Lua将不等待下一个周期。同样&#xff0c;此值的较高值将导…

Golang之路---04 并发编程——信道/通道

信道/通道 如果说 goroutine 是 Go语言程序的并发体的话&#xff0c;那么 channel&#xff08;信道&#xff09; 就是 它们之间的通信机制。channel&#xff0c;是一个可以让一个 goroutine 与另一个 goroutine 传输信息的通道&#xff0c;我把他叫做信道&#xff0c;也有人将…

.Net6 Web Core API --- Autofac -- AOP

目录 一、AOP 封装 二、类拦截 案例 三、接口拦截器 案例 AOP拦截器 可开启 类拦截器 和 接口拦截器 类拦截器 --- 只有方法标注 virtual 标识才会启动 接口拦截器 --- 所有实现接口的方法都会启动 一、AOP 封装 // 在 Program.cs 配置 builder.AddAOPExt();//自定义 A…

java使用openOffice将excel转换pdf时,将所有列显示在一页

1.接上文&#xff0c;格式转换的基础问题已解决&#xff0c;但还有些细节问题需要单独处理&#xff0c;如excel转换至pdf时&#xff0c;如何将所有列显示在一页的问题&#xff0c;此问题大家都有遇到&#xff0c;解决方案也比较多&#xff0c;我也尝试过重写某类&#xff0c;来…

从excel中提取嵌入式图片的解决方法

1 发现问题 我的excel中有浮动图片和嵌入式图片&#xff0c;但是openpyxl的_image对象只提取到了浮动图片&#xff0c;通过阅读其源码发现&#xff0c;这是因为openpyxl只解析了drawing文件导致的&#xff0c;所以确定需要自己解析 2 解决思路 1、解析出media资源 2、解析…

eclipse Java Editor Templates

​ Window - Preferences - Java - Editor - Templates ​ date ${currentDate:date(yyyy.MM.dd)}

W6100-EVB-PICO做DNS Client进行域名解析(四)

前言 在上一章节中我们用W6100-EVB-PICO通过dhcp获取ip地址&#xff08;网关&#xff0c;子网掩码&#xff0c;dns服务器&#xff09;等信息&#xff0c;给我们的开发板配置网络信息&#xff0c;成功的接入网络中&#xff0c;那么本章将教大家如何让我们的开发板进行DNS域名解…