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

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

  • 11
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值