Nginx优化、防盗链

news2024/9/21 10:32:20

目录

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.coloradmin.cn/o/1936859.html

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

相关文章

复旦微核心板:基于复旦微FMQL45T900 全国产化核心板

近期开发的一款搭载复旦微FMQL45T900的全国产核心板。FMQL45T900这款是一款高度集成的国产化芯片&#xff0c;它在一个单芯片中融合了多种功能&#xff0c;特别强调的是它的国产化特性&#xff0c;即其设计、制造和知识产权完全属于中国。 处理器性能&#xff1a; 处理器架构&a…

jenkins 插件版本冲突

一、Jenkins安装git parameter 插件重启后报错与临时解决方案 cd /root/.jenkins cp config.xml config.xml.bak vim config.xml <authorizationStrategy class"hudson.security.FullControlOnceLoggedInAuthorizationStrategy"><denyAnonymousReadAcces…

鸿蒙OS开发工具 DevEco Studio(4.0)安装教程

1.旧版本下载地址【HarmonyOS】HUAWEI DevEco Studio 下载地址汇总_deveco studio历史版本-CSDN博客 2.解压安装包&#xff0c;双击安装程序 3.打开后点击Next 4.点击“Browse...”选择路径&#xff0c;然后点击“Next” 5.勾选&#xff0c;点击“Next” 6.默认&#xff0c;直…

【JavaEE进阶】——Spring AOP

目录 &#x1f6a9;Spring AOP概述 &#x1f6a9;Spring AOP快速⼊⻔ &#x1f393;引入AOP依赖 &#x1f393;编写AOP程序 &#x1f6a9;Spring AOP 详解 &#x1f393;Spring AOP核⼼概念 &#x1f393;通知类型 &#x1f393;PointCut &#x1f393;切⾯优先级 Ord…

【生成式AI的发展方向,是Chat还是Agent?】Chat与Agent的并驱前行

目录 前言一、整体介绍&#xff08;一&#xff09;生成式AI在对话系统(Chat)领域&#xff08;二&#xff09;生成式AI在自主代理(Agent)领域 二、技术对比&#xff08;一&#xff09;技术差异&#xff08;二&#xff09;优势和劣势&#xff08;三&#xff09;技术挑战 三、未来…

Java后端开发(十五)-- Ubuntu 开启activemq开机自启动功能

目录 1. 修改Wrapper.conf文件配置内容 2. 在/etc/systemd/system目录下创建activemq.service文件 3. 重启服务器,验证是否生效 4. 系统启动目标问题 操作环境: 1、Ubuntu 22.04.4 LTS (GNU/Linux 6.5.0-28-generic x86_64) 2、jdk17.0.11 3、apache-activemq-6.0.1 1. 修…

ranger审计日志对接CDH solr

作者&#xff1a;耀灵 一、准备条件 1、已安装完毕ranger-admin 2、已在CDH上部署solr&#xff08;注意在安装solr时更改下solr在zk上的节点信息&#xff09; 二、更改相关配置 1、修改ranger-2.1.0-admin/contrib/solr_for_audit_setup/install.properties SOLR_USERsolr …

AIGC代码学习记录

本文主要记录不同的SD模型代码中实现的一些细节&#xff0c;如text2img,img2img,inpaint等等 1. 文生图 第一步&#xff1a;生成随机的latent feature (n,4,64,64)&#xff1b;n为生成的图片个数&#xff1b; 第二步&#xff1a;对于prompt用clip生成特征&#xff0c;正向提示…

python---使用celery分布式系统异步发送短信(云通讯)来验证登录

环境 requests2.32.3 Django2.1.15 celery5.4.0 redis3.4.1 django-redis4.11.0 djangorestframework3.11.0 djangorestframework-jwt1.11.0 eventlet0.36.1注&#xff1a;使用redis作为缓存&#xff0c;restframework框架&#xff0c;jwt token 2.celery异步配置 1.在项目的…

在LabVIEW中实现图像矫正

在LabVIEW中实现图像矫正&#xff0c;特别是将倾斜的笔记本图像&#xff08;如左图&#xff09;校正为正视图像&#xff08;如右图&#xff09;&#xff0c;通常需要以下几个步骤&#xff1a; 1. 获取图像 使用图像采集设备或加载图像文件来获取图像数据。 2. 图像预处理 对…

2024-07-19 Unity插件 Odin Inspector10 —— Misc Attributes

文章目录 1 说明2 其他特性2.1 CustomContextMenu2.2 DisableContextMenu2.3 DrawWithUnity2.4 HideDuplicateReferenceBox2.5 Indent2.6 InfoBox2.7 InlineProperty2.8 LabelText2.9 LabelWidth2.10 OnCollectionChanged2.11 OnInspectorDispose2.12 OnInspectorGUI2.13 OnIns…

TeamViewer手机端APP提示:请先验证账户

当你在手机端下载安装了TeamViewerAPP后&#xff0c;需要你先登录个人账号&#xff0c;然后还会要求你验证账户&#xff0c;同时跳转到一个网址中&#xff0c;但是这个网址并没有自动跳转到验证账户的位置。 解决办法&#xff1a; 在手机浏览器中进入下面这个网址&#xff1a;…

时序数据库如何选型?详细指标总结!

工业物联网场景&#xff0c;如何判断什么才是好的时序数据库&#xff1f; 工业物联网将机器设备、控制系统与信息系统、业务过程连接起来&#xff0c;利用海量数据进行分析决策&#xff0c;是智能制造的基础设施&#xff0c;并影响整个工业价值链。工业物联网机器设备感知形成了…

ubuntu 24 PXE Server (bios+uefi) 批量部署系统

pxe server 前言 PXE&#xff08;Preboot eXecution Environment&#xff0c;预启动执行环境&#xff09;是一种网络启动协议&#xff0c;允许计算机通过网络启动而不是使用本地硬盘。PXE服务器是实现这一功能的服务器&#xff0c;它提供了启动镜像和引导加载程序&#xff0c;…

以Zookeeper为例 浅谈脑裂与奇数节点问题

一、脑裂现象的定义与影响 脑裂&#xff08;split-brain&#xff09;是指在分布式系统中&#xff0c;因网络分区或其他故障导致系统被切割成两个或多个相互独立的子系统&#xff0c;每个子系统可能独立选举出自己的领导节点。这一现象在依赖中心领导节点&#xff08;如Elastic…

MVC架构在Web开发中的实现

MVC架构在Web开发中的实现 1、MVC架构概述2、MVC架构的实现 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Web开发领域&#xff0c;MVC&#xff08;Model-View-Controller&#xff09;架构模式是一种广泛使用的软件设计模式&#xff0c…

数据可视化配色新工具,颜色盘多达2500+类

好看的配色,不仅能让图表突出主要信息,更能吸引读者,之前分享过很多配色工具,例如, 👉可视化配色工具:颜色盘多达3000+类,数万种颜色! 本次再分享一个配色工具pypalettes,颜色盘多达2500+类。 安装pypalettes pip install pypalettes pypalettes使用 第1步,挑选…

在VS Code上搭建Vue项目教程(Vue-cli 脚手架)

1.前期环境准备 搭建Vue项目使用的是Vue-cli 脚手架。前期环境需要准备Node.js环境&#xff0c;就像Java开发要依赖JDK环境一样。 1.1 Node.js环境配置 1&#xff09;具体安装步骤操作即可&#xff1a; npm 安装教程_如何安装npm-CSDN博客文章浏览阅读836次。本文主要在Win…

哪种SSL证书可以快速签发保护http安全访问?

用户访问网站&#xff0c;经常会遇到访问http网页时&#xff0c;提示网站不安全或者不是私密连接的提示&#xff0c;因为http是使用明文传输&#xff0c;数据传输中可能被篡改&#xff0c;数据不被保护&#xff0c;通常需要SSL证书来给数据加密。 SSL证书的签发速度&#xff0…

Selenium之execute_script()方法执行js脚本

目录 场景应用和使用 页面滚动 获取返回值 返回JavaScript定位的元素对象 修改元素属性 弹出提示框 场景应用和使用 在自动化测试中&#xff0c;部分场景无法使用自动化Selenium原生方法来进行测试&#xff1a; 滚动到某个元素&#xff08;位置&#xff09; 修改…