Nginx优化、防盗链

目录

Nginx优化

隐藏版本信息

网站缓存

日志切割

超时时间

更改进程数

网页压缩

防盗链


在使用源码软件包安装过Nginx服务,具体步骤看上一篇文章

功能模块位置

在Nginx的解压目录下的auto目录内的options文件可以查看Nginx可以安装的功能模块

[root@localhost ~]# cd nginx-1.12.0
[root@localhost nginx-1.12.0]# cat auto/options

查看在安装Nginx时,即使不指定,也会安装的功能

[root@localhost auto]# cat options | grep YES

Nginx优化

隐藏版本信息

在nginx配置文件的http块的开头加入server_tokens选项,禁用nginx服务器返回的版本号信息

它控制nginx服务器是否在HTTP响应头中包含Server字段,该字段通常用于标识服务器软件及其版本号。

修改完使用nginx命令reload重载服务,然后使用curl -i命令访问nginx服务器,可以看到Server字段的版本信息只有nginx

[root@localhost auto]# vim /usr/local/nginx/conf/nginx.conf
http {include       mime.types;default_type  application/octet-stream;server_tokens off;[root@localhost auto]# nginx -s reload
[root@localhost auto]# curl -i 192.168.10.101
HTTP/1.1 200 OK
Server: nginx

如果想要把此时显示的nginx也隐藏起来或改变,需要修改Nginx源码包解压目录的/root/nginx-1.12.0/src/core目录下的nginx.h文件

在第14行修改NGINX为IIS,把网页服务的信息改为IIS的意义是:因为IIS不能在Linux上运行,可以迷惑攻击者,提高安全性。

IIS:因特网信息服务器(Internet Information Server)是指一群因特网服务器,包括一个使用超文本传输协议的服务器和一个使用文件传输协议的服务器。

由微软公司推出,在Windows系统上运行。

[root@localhost ~]# vim /root/nginx-1.12.0/src/core/nginx.h
在第14行,不用取消注释
#define NGINX_VER          "IIS/" NGINX_VERSION

修改完Nginx的变量,需要重新编译Nginx,cd回到Nginx的解压目录

重新配置后,编译并安装

[root@localhost ~]# cd nginx-1.12.0
[root@localhost nginx-1.12.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module
[root@localhost nginx-1.12.0]# make && make install

然后修改nginx配置文件,将刚刚添加的server_tokens选项注释掉,再重启服务

最后使用curl -i命令测试,可以看到server字段的信息已经变为IIS

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
http {include       mime.types;default_type  application/octet-stream;#server_tokens off;root@localhost ~]# nginx -s stop
[root@localhost ~]# nginx
[root@localhost ~]# curl -i 192.168.10.101
HTTP/1.1 200 OK
Server: IIS/1.12.0

网站缓存

/usr/local/nginx/html/目录下导入一张图片

在索引页引入该文件,保存并退出

[root@localhost ~]# vim /usr/local/nginx/html/index.html
<h1>Test</h1>
<img src="logo.jpg" />

在nginx配置文件中修改

为当前server单元添加一个location单元

如果匹配到用户访问的链接是点结尾且末尾内容是括号内的字符串时,就设置缓存时间1天

  • ~*:不区分大小写
server {listen       80;server_name  www.test.com;charset utf-8;location / {root   html;index  index.html index.htm;}location ~* \.(gif|jpeg|png|jpg|css|ico)$ {root html;expires 1d;}
检测语法正确性,重启nginx
[root@localhost conf]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost conf]# nginx -s stop
[root@localhost conf]# nginx

使用浏览器访问192.168.10.101/logo.jpg

可以看到缓存结束的时间是2024.7.18日(当时是7.17日)


日志切割

在root家目录下创建脚本文件,实现以下效果

  • 检查并创建日志存放目录。
  • 将昨天的 Nginx 访问日志文件重命名并移动到指定目录。
  • 通知 Nginx 重新打开日志文件,实现日志切割。
  • 定期清理超过 30 天的旧日志文件。

执行该脚本,在/var/log/nginx目录下可以看到mv过来的日志文件,而原access日志文件在/usr/local/nginx/logs/access_log(安装目录下)

如果打开原access日志文件,由于该文件是mv后新生成的,生成后没有用户访问它,所以它此时是空的

[root@localhost ~]# vim seg.sh#!/bin/bash
# Filename: seg.sh
# 声明变量,避免硬编码
d=$(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}/test.com-access.log-$d
# 重新打开日志文件
kill -USR1 $(cat $pid_path)
# 删除30天前的日志文件
find $logs_path -mtime +30 |xargs rm -rf[root@localhost ~]# bash seg.sh 
[root@localhost ~]# cd /var/log/nginx/
[root@localhost nginx]# ls
test.com-access.log-20240716

代码

说明

d=$(date -d "-1 day" "+%Y%m%d")

这一行使用 date 命令获取昨天的日期

并将其格式化为 YYYYMMDD 的形式,然后将结果赋给变量 d

YYYYMMDD格式比如:20240324

[ -d $logs_path ] || mkdir -p $logs_path

这行代码检查是否存在 $logs_path 目录,如果不存在则创建该目录。

kill -USR1 $(cat $pid_path)

这行命令发送 USR1 信号给 Nginx 进程,通知它重新打开日志文件,实现日志切割。

find $logs_path -mtime +30 | xargs rm -rf

使用 find 查找 $logs_path 目录下修改时间超过 30 天的文件

并使用 xargs 将文件列表传递给 rm -rf 命令来删除这些文件。

即使我们移动了或删除了旧的日志文件,Nginx仍然会继续往被移动或删除的文件中写入日志信息,而不会写入到新创建的文件中。

为了解决这个问题,需要通知Nginx重新打开日志文件。这是通过向Nginx的主进程发送 USR1 信号来实现的,这个信号告诉Nginx重新打开日志文件句柄,从而开始向新创建的日志文件中写入日志信息。

创建计划任务,每天凌晨1:30执行该脚本

最后为脚本添加执行权

[root@localhost logs]# crontab -e
30 1 * * * /root/seg.sh
[root@localhost ~]# chmod +x seg.sh

超时时间

打开nginx配置文件,修改超时时间

在末行模式搜索:/keepalive_timeout,修改该属性参数

保存并退出,重启nginx

[root@localhost ~]# cd /usr/local/nginx/conf/
[root@localhost conf]# vim nginx.conf
在末行模式下搜索:/keepalive_timeout
keepalive_timeout  65 180;[root@localhost conf]# nginx -s stop
[root@localhost conf]# nginx
  • 65 是指在客户端和服务器之间保持空闲连接的超时时间为 65 秒。
  • 180 是指处理头部信息的超时时间为 180 秒。


更改进程数

打开nginx配置文件

在开头的几行中找到以下要修改的选项

修改nginx进程数为4个,每个进程最大连接数为4096个

保存退出,使用ps命令列出nginx进程信息,可以看到有4个nginx进程

[root@localhost ~]# cd /usr/local/nginx/conf/
[root@localhost conf]# vim nginx.conf
worker_processes  4;
worker_cpu_affinity 0001 0010 0100 1000;events {worker_connections  4096;
}
[root@localhost conf]# ps aux | grep nginx
root       7389  0.0  0.1  45964  2256 ?        Ss   15:27   0:00 nginx: master process nginx
nginx      7390  0.0  0.2  47672  4916 ?        S    15:27   0:00 nginx: worker process
nginx      7391  0.0  0.2  47672  4932 ?        S    15:27   0:00 nginx: worker process
nginx      7392  0.0  0.2  47672  4932 ?        S    15:27   0:00 nginx: worker process
nginx      7393  0.0  0.2  47672  4784 ?        S    15:27   0:00 nginx: worker process
root       7395  0.0  0.1 112840  2208 pts/0    S+   15:27   0:00 grep --color=auto nginx

网页压缩

在nginx配置文件中,找到gzip的选项,设为on,将压缩级别设为5,级别越高压缩比越大。将网页缓存的代码注释掉

  • gzip_buffers 4 64k:表示4个单位为64k的内存作为压缩结果的缓存
  • gzip_types :指定需要gzip压缩的文件类型
[root@localhost ~]# cd /usr/local/nginx/conf/
[root@localhost conf]# vim nginx.conf
gzip  on;
gzip_comp_level 5;
gzip_buffers 4 64k;
gzip_types text/plain text/css text/xml image/jpeg application/json application/javascript application/xml;#location ~ \.(gif|jpeg|png|jpg|css|ico)$ {#   root html;#   expires 1d;#}[root@localhost conf]# nginx -s stop
[root@localhost conf]# nginx

类型

说明

text/plain

普通文本文件,如 .txt 文件等

text/css

CSS样式表文件

text/xml

XML格式的文本文件

image/jpeg

JPEG格式的图像文件

application/json

JSON数据格式文件

application/javascript

 JavaScript脚本文件

application/xml

XML格式的应用程序文件

在浏览器的开发人员工具窗口中的响应标头中就可以看到该网页被设置了gzip压缩的功能


防盗链

再开启一台Linux虚拟机,作为盗图网站(192.168.10.102)

再开启一台windows系统的虚拟机作为测试机,将测试机的hosts文件末尾追加下方的两个网站的解析内容

[root@localhost ~]# vim /etc/hosts
192.168.10.101 www.benet.com
192.168.10.102 www.accp.com

转到101主机(原图网站)

[root@localhost html]# cd /usr/local/nginx/html
[root@localhost html]# vim index.html
<p>原图网站</p>
<img src="logo.jpg" />
保存并退出

在客户端打开浏览器访问:www.benet.com,测试能否正常显示网页内容

转到102主机(盗图网站)

[root@localhost ~]# yum -y install httpd
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# cd /var/www/html/
[root@localhost ~]# vim index.html
<p>盗图网站</p>
<img src="http://www.benet.com/logo.jpg" />
保存并退出

在客户端打开浏览器访问:www.accp.com,测试能否正常显示网页内容

按下F12打开开发人员工具窗口,选中图片信息,查看请求的URL,可以看到盗图网站盗图的URL是www.benet.com

转到101主机(原图网站)

在nginx服务端存放网页文件的目录下导入一个用于重定向的图片(error.png)

[root@localhost html]# rz -E
rz waiting to receive.
[root@localhost html]# ls
error.png  index.html  logo.jpg

修改nginx配置文件,添加location单元,匹配不区分大小写并且以.gif.jpeg.jpg结尾的请求

location ~* \.(gif|jpeg|jpg)$ {valid_referers *.www.benet.com benet.com;if ($invalid_referer) {rewrite ^/ http://www.benet.com/error.png;}}

参数

说明

valid_referers *.www.benet.com benet.com

valid_referers 指令指定了允许访问这些图片资源的 Referer(引荐页)。

*.www.benet.com 表示允许来自该域名的 Referer。

benet.com 则表示允许来自该域名的 Referer。

if ($invalid_referer) {

        rewrite ^/ http://www.benet.com/error.png;

}

if ($invalid_referer) 检查请求的 Referer 是否不在允许的列表中

rewrite ^/ http://www.benet.com/error.png:将请求重定向到error.png

 最后去浏览器访问盗图网站,可以看到被盗用的图片变成了重定向的资源

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

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

相关文章

数据结构初阶-单链表

链表的结构非常多样&#xff0c;以下情况组合起来就有8种&#xff08;2 x 2 x 2&#xff09;链表结构&#xff1a; 而我们主要要熟悉的单链表与双向链表的全称分别为&#xff1a;不带头单向不循环链表&#xff0c;带头双向循环链表&#xff0c;当我们对这两种链表熟悉后&#x…

重生之我们在ES顶端相遇第5章-常用字段类型

思维导图 前置 在第4章&#xff0c;我们提到了 keyword&#xff08;一笔带过&#xff09;。在本章&#xff0c;我们将介绍 ES 的字段类型。全面的带大家了解 ES 各个字段类型的使用场景。 字段类型 ES 支持以下字段类型&#xff08;仅介绍开发中常用&#xff0c;更多内容请自…

AI App Store-AI用户评价-多维度打分对比pk-AI社区

C端用户、创作者、AI达人们在选择众多国内外AI厂商的服务时候往往感到一头雾水&#xff0c;那么多功能接近的AI应用(智能对话类、文档总结类、文生图、AI搜索引擎) 究竟在不同用户需求场景下表现怎么样。大部分人如果有需求都会所有平台都尝试一遍&#xff0c;比如一个博主生成…

C++自定义字典树结构

代码 #include <iostream> using namespace std;class TrieNode { public:char data;TrieNode* children[26];bool isTerminal;TrieNode(char ch){data ch;for (int i 0; i < 26; i){children[i] NULL;}isTerminal false;} }; class Trie { public:TrieNode* ro…

基于区块链技术的中药饮片代煎配送服务与监管平台

业务背景 近年来&#xff0c;随着公众对中医药青睐有加&#xff0c;中药代煎服务作为中医药现代化的重要一环&#xff0c;在全国各地蓬勃兴起。鉴于传统煎煮方式的繁琐耗时&#xff0c;医疗机构纷纷转向与第三方中药饮片企业合作&#xff0c;采用集中代煎模式。这些第三方煎药中…

Proactor模型

文章目录 概述1. 异步I/O操作2. 事件通知3. 事件处理函数4. 事件循环5. 多线程支持6. 非阻塞I/O7. 可扩展性8. 错误处理9. 资源管理10. 编程复杂性11. 应用场景流程图 结论 概述 Proactor模型是一种基于异步I/O操作的事件驱动编程模型&#xff0c;主要用于处理并发的I/O事件&a…

冒泡排序(数组作为函数参数)

什么是冒泡排序&#xff1f; 冒泡排序&#xff08;Bubble Sort&#xff09;也是一种简单直观的排序算法。它重复地走访过要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换&#xff0c;…

docker--容器数据进行持久化存储的三种方式

文章目录 为什么Docker容器需要使用持久化存储1.什么是Docker容器&#xff1f;2.什么是持久化存储&#xff1f;3.为什么Docker容器需要持久化存储&#xff1f;4.Docker如何实现持久化存储&#xff1f;(1)、Docker卷(Volumes)简介适用环境:使用场景:使用案例: (2)、绑定挂载&…

pycharm+pytorch2.3.1安装

成功运行 Anaconda简介 Anaconda 就是可以便捷获取包且对包能够进行管理&#xff0c;同时对环境可以统一管理的发行版本。Anaconda包含了conda、Python在内的超过180个科学包及其依赖项。 Anaconda安装 去官网地址下载 Download Anaconda Distribution | Anaconda​www.ana…

SpringBoot启动原理详解

透彻理解SpringBoot启动原理&#xff08;一&#xff09; 一张Spring启动顺序图我们对Spring启动原理有多少理解呢一起看一下Spring有那些扩展点和启动过程有关通过打印日志学习Spring的执行顺序实例化和初始化的区别Spring重要扩展点的启动顺序1.BeanFactoryPostProcessor2.实例…

python3.10.4——Windows环境安装

python下载官网&#xff1a;https://www.python.org/downloads/ 如果安装在C盘&#xff0c;需要右键→选择“以管理员身份运行” 勾选2个按钮&#xff0c;选择自定义安装 全部选择&#xff0c;点击Next 更改安装路径 命令行检查python是否安装成功&#xff1a; 出现版本号说明…

内存泄漏详解

文章目录 什么是内存泄漏内存泄漏的原因排查及解决内存泄漏避免内存泄漏及时释放资源设置合理的变量作用域及时清理不需要的对象避免无限增长避免内部类持有外部类引用使用弱引用 什么是内存泄漏 内存泄漏是指不使用的对象持续占有内存使得内存得不到释放&#xff0c;从而造成…

【Hot100】LeetCode—416. 分割等和子集

目录 题目1- 思路2- 实现⭐152. 乘积最大子数组——题解思路 3- ACM 实现 题目 原题连接&#xff1a;416. 分割等和子集 1- 思路 理解为背包问题 思路&#xff1a; 能否将均分的子集理解为一个背包&#xff0c;比如对于 [1,5,11,5]&#xff0c;判断能否凑齐背包为 11 的容量…

面试场景题系列--(1)如果系统的 QPS 突然提升 10 倍该怎么设计?--xunznux

1. 如果系统的 QPS 突然提升 10 倍该怎么设计&#xff1f; 1.1 硬件的扩展微服务的拆分 如果所有的业务包括交易系统、会员信息、库存、商品等等都夹杂在一起&#xff0c;当流量一旦起来之后&#xff0c;单体架构的问题就暴露出来了&#xff0c;机器挂了所有的业务就全部无法…

SSCI 二区正刊 绿色金融、财政、经济、债务、成本、创新题目:

1金融科技能提升企业的双元创新能力吗&#xff1f;组织韧性xxxxx 2从财政分权到经济高质量发展&#xff1a;税收征管强度xxxxxxx 3企业智能化转型、债务融资成本与绿色xxxx 绿色金融改革能否促进地方经济高质量发展&#xff1a;基于绿色金融改革创新试验区的准xxxx 4绿色金融改…

MBR60200PT-ASEMI无人机专用MBR60200PT

编辑&#xff1a;ll MBR60200PT-ASEMI无人机专用MBR60200PT 型号&#xff1a;MBR60200PT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-247 批号&#xff1a;最新 恢复时间&#xff1a;35ns 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;60A 最大循环峰值反向…

win11 安装 Gradle

一、win11 安装Gradle(7.5.1)&#xff1a; 1.1、下载二进制包 Gradle下载页面 1.2、配置环境变量 变量名&#xff1a;GRADLE_HOME 变量值&#xff08;二进制包解压路径&#xff09;&#xff1a;D:\develop-tool\gradle-7.5.1 变量名&#xff1a;GRADLE_USER_HOME 变量值&a…

JAVA基础 - 控制语句

目录 一. 简介 二. 分支语句 三. 循环语句 四. 跳转语句 一. 简介 在 Java 中&#xff0c;控制语句用于控制程序的执行流程&#xff0c;根据不同的条件决定执行哪些代码块。常见的控制语句包括&#xff1a; if-else 语句&#xff1a;根据条件的真假执行不同的代码块。 swi…

Spark实时(一):StructuredStreaming 介绍

文章目录 StructuredStreaming 介绍 一、SparkStreaming实时数据处理痛点 1、复杂的编程模式 2、SparkStreaming处理实时数据只支持Processing Time 3、微批处理&#xff0c;延迟高 4、精准消费一次问题 二、StructuredStreaming概述 三、​​​​​​​​​​​​​​…

BGP选路之AS-PATH

原理概述 当一台BGP路由器中存在多条去往同一目标网络的BGP路由时&#xff0c;BGP协议会对这些BGP路由的属性进行比较&#xff0c;以确定去往该目标网络的最优BGP路由。首先要比较的属性是 Preferred Value&#xff0c;然后是Local Preference&#xff0c;再次是路由生成方式&a…