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,一经查实,立即删除!

相关文章

关于InnoDB行锁和4种锁是怎么实现的?

InnoDB 的行锁实现主要基于索引&#xff0c;并通过多种类型的锁来确保数据的一致性和并发控制。以下是InnoDB行锁实现的几个关键点&#xff1a; 记录锁&#xff08;Record Locks&#xff09;&#xff1a;这种锁直接锁定某行记录的索引记录。它通常用于唯一索引或主键索引上&…

ubuntu20.04安装终端终结者并设置为默认终端

1、安装 terminator sudo apt-get install terminator 2、Ctrl Alt T 试一下打开什么终端&#xff0c;我的默认启动的是terminator;如果想换换默认的终端&#xff0c;还需以下一步 3、安装dconf-tools&#xff0c;这个是设置默认终端的必须 sudo apt-get install dconf-tools…

数据结构初阶-单链表

链表的结构非常多样&#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;更多内容请自…

大模型之RAG-关键字检索的认识与实战(混合检索进阶储备)

前言 按照我们之前的分享&#xff08;大模型应用RAG系列3-1从0搭建一个RAG&#xff1a;做好文档切分&#xff09;&#xff1a; RAG系统搭建的基本流程 准备对应的垂域资料文档的读取解析&#xff0c;进行文档切分将分割好的文本灌入检索引擎&#xff08;向量数据库&#xff…

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

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

Linux内网离线用rsync和inotify-tools实现文件夹文件单向同步和双向同步

lsyncd实现方式可参考&#xff1a;https://www.jianshu.com/p/c075ccf89516 安装文件下载&#xff1a;相关文件下载 rsync默认都有&#xff0c;所以没有提供。 服务端和客户端均操作 服务端&#xff1a;双向同步其实都是服务端&#xff0c;只是单向同步时稍有区别 客户端&am…

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…

Android、Java反编译工具JADX

目录 介绍 主要特点: jadx-gui特性: 下载地址 使用 介绍 jadx - Dex to Java反编译器 用于从Android Dex和Apk文件生成Java源代码的命令行和GUI工具 请注意,在大多数情况下,jadx不能100%反编译所有的代码,所以会出现错误。 有关变通方法,请参阅故障排除指南。 目前…

返回倒数第 k 个节点 - 力扣(LeetCode)

面试题 02.02. 返回倒数第 k 个节点 - 力扣&#xff08;LeetCode&#xff09; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/int kthToLast(struct ListNode* head, int k) {struct ListNode* fastnode head…

git面面观,面试题,常见问题

1. 简述什么是Git &#xff1f; Git是一款分布式源代码管理工具(版本控制工具) 。 Git得其数据更像是一系列微型文件系统的快照。使用Git&#xff0c;每次提交或保存项目状态时&#xff0c;Git基本上都会记录当时所有文件的外观&#xff0c;并存储对该快照的引用。为了提高效…

Prompt工程:与AI聊天机器人更好地交流

Prompt工程:与AI聊天机器人更好地交流 1. 清楚地说明你想要什么2. 告诉AI它现在是谁3. 一步一步来4. 给AI一些例子5. 让AI检查自己的回答6. 把AI当作你的小助手7. 让AI帮你想主意8. 让AI告诉你它需要知道什么9. 教AI一步一步思考结语 大家好!今天我们来聊聊如何跟AI聊天机器人更…

互三群危害?如何才能正确上热榜。

前言 攀登热门榜单之巅&#xff0c;历来是才华与智慧较量的舞台&#xff0c;策略与努力的结晶。然而&#xff0c;在这片看似光鲜的网络世界里&#xff0c;也潜藏着不为人知的暗流——“互三群”的歪风邪气。揭露其真面目&#xff0c;以正网络风气&#xff0c;是每一位网络创作…

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

业务背景 近年来&#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;…

【Unity】RPG2D龙城纷争(十五)特殊加成型要诀

更新日期:2024年7月22日。 项目源码:第五章发布(正式开始游戏逻辑的章节) 索引 简介一、特殊加成型要诀基类二、扩充要诀数据集三、移动寻路时,应用特殊加成效果四、攻击寻路时,应用特殊加成效果五、攻击别人时,应用特殊加成效果六、被别人攻击时,应用特殊加成效果七、…

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…

PHP常量

PHP 常量是在脚本执行期间其值不会改变的量。它们通常用于存储不经常改变的值&#xff0c;如配置选项、数据库连接信息等。在 PHP 中&#xff0c;常量与变量不同&#xff0c;一旦定义就不能被重新定义或取消定义&#xff08;直到脚本执行结束&#xff09;。下面是关于 PHP 常量…