目录
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 |
最后去浏览器访问盗图网站,可以看到被盗用的图片变成了重定向的资源