Nginx优化(重点)与防盗链(新版)

Nginx优化(重点)与防盗链

一、隐藏Nginx版本号

避免安全漏洞泄漏

1、修改配置文件

bash 复制代码
cd /usr/local/nginx/conf
vim nginx.conf

http {
 server_tokens off;//关闭版本号
}

#检查语法
nginx -t 
#重启服务
systemctl restart nginx

使用curl -I命令检测
curl -I 192.168.210.101



2、修改源代码

bash 复制代码
Nginx源码文件/opt/nginx-1.24.0/src/core/nginx.h包含版本信息,可以随意设置,重新编译安装,隐藏版本信息
vim /opt/nginx-1.24.0/src/core/nginx.h
#define NGINX_VERSION "2.36.0",修改版本号为2.36.0
#define NGINX_VER "llS/",修改软件类型为llS

再回到/opt/nginx-1.24.0目录中重新编译安装
#查看编译参数选项
ngnix -V 
#重新生成二进制文件
./configure --prefix
#编译安装
make && make install

#重启nginx服务,使用curl -I命令检测,查看版本信息
systemctl restart nginx
curl -I 192.168.210.101



二、修改Nginx用户与组

Nginx运行时进程需要有用户与组的支持,以实现对网站文件读取时进行访问控制

Nginx默认使用nobody用户账号与组账号

1、编译安装时指定用户与组

bash 复制代码
编译安装时--user与--group指定Nginx服务的运行用户与组账号
./config \
--prefix=/usr/local/nginx  \
--user=nginx  \
--group=nginx  \
...

2、修改配置文件指定用户与组

bash 复制代码
vim nginx.conf
user nginx nginx;//第一个nginx代表用户名,第二个代表组名

#重启nginx
systemctl restart nginx
#查看nginx进程的用户
ps aux | grep nginx



三、配置Nginx网页的缓存时间

当Nginx将网页数据返回给客户端后,可设置缓存的时间,以方便再以后进行相同内容的请求时直接返回,避免重复请求,加快了访问速度。

一般针对静态网页设置,对动态网页不设置缓存时间

设置方法:修改配置文件,在http段、或者server段或者location段加入特定内容的过期参数

bash 复制代码
修改Nginx的配置文件,在location段加入expires参数,expires参数用于设置nginx网页缓存时间
server {
   location ~ \.(png|jpg|jpeg|gif|txt|mp3|mp4)$ {
       root html/static;
       expires 1d;//一天
   }
}
只要访问以png|jpg|jpeg|gif|txt|mp3|mp4格式结尾的路径,就可以被location匹配到,会从html/static目录中获取静态资源,并且让浏览器可以在本地缓存资源一天。

nginx -t
systemctl restart nginx

在html目录中创建一个static静态资源目录,并在这个目录中存放一些图片内容
error.png 和 game.jpg
cd /usr/local/nginx/html
mkdir static
cd static/


bash 复制代码
在浏览器测试
http://192.168.210.101/game.jpg
http://192.168.210.101/error.png


四、实现Nginx的日志切割

随着Nginx运行时间增加,日志也会增加。为了方便掌握Nginx运行状态,需要时刻关注Nginx日志文件

太大的日志文件对监控是一个大灾难,要定期进行日志文件的切割

Nginx自身不具备日志分割处理的功能,但可以通过Nginx信号控制功能的脚本实现日志的自动切割

通过Linux的计划任务周期性地进行日志切割

1、data的用法

bash 复制代码
date --help
#命令帮助
bash 复制代码
date +%F
#完整日期格式
date +%Y%m%d
#年月日
date +%Y/%m/%d
#年/月/日
date +%Y%m01
#当月第一天
date -d "+1 day" +%Y%m%d
#显示明天
date -d "-1 day" +%Y%m%d
date -d "1 day ago" +%Y%m%d
#显示前一天
date -d "$(date +%Y%m01) -3 day" +%Y%m%d
#当月第一天的前三天
date -d "$(date +%Y%m01) -1 day" +%Y%m%d
#上个月的最后一天
date -d "$(date -d "1 mouth" +%Y%m01) -1 day" +%Y%m%d
#当月的最后一天
date -d "-1 day" +%Y%m01
#这个月第一天
date -d "1 mouth" +%Y%m01
#下个月第一天

2、编写脚本进行日志切割的思路

bash 复制代码
①判断保存日志分割的目录,如果目录不存在就创建目录,如果目录存在就跳过执行下一条命令
②用mv命令将nginx的访问日志移到专门保存日志分割的目录,并且改名添加时间标识
③使用kill -USR1指定nginx的pid号重新生成日志文件
④通过find -mtime+30去找到30天之前修改过的日志文件并删除
bash 复制代码
#日志切割脚本
vim nginx_log.sh
#!/bin/bash
#this is used for cutting nginx logs

LASTDAY=$(date -d "-1 day" +%Y%m%d)
LOGPATH=/var/log/nginx
NGINX_HOME=/usr/local/nginx
PID_PATH=$NGINX_HOME/logs/nginx.pid

#判断保存日志的目录是否存在,如果不存在则创建该目录,如果存在则执行下一条命令
[ -d $LOGPAHT ] || mkdir -p $LOGPATH

#使用mv命令进行日志分割移动日志文件到保存日志的目录里,并修改文件名添加时间标识
mv $NGINX_HOME/logs/access.log $LOGPATH/access.log-$LASTDAY
mv $NGINX_HOME/logs/error.log $LOGPATH/error.log-$LASTDAY

#重新生成新的日志文件,以便nginx写入后续日志
kill -USR1 $(cat $PID_PATH)

#查找出30天以前的日志文件并删除,释放磁盘空间
find $LOGPATH -mtime +30 -delete

chomd +x nginx_log.sh
ll

crontab -e
0 0 * * * /root/nginx_log.sh
crontab -l

./nginx_log.sh
cd /var/log/
ls //生成nginx目录
cd nginx/
ls

cd /usr/local/nginx/logs/
ls
是空的,后续再有日志写入就会写到空的里面
bash 复制代码
#每个月的最后一天
vim latestday.sh

#!/bin/bash
a=2
for i in {02..12}
do
  echo $(date -d "$(date +2023${i}01) -1 day" +%Y%m%d)
done
echo $(date -d "$(date +20240101) -1 day" +%Y%m%d)

sh latestday.sh

#不管在哪一年,都能获取到当年月份的最后一天
vim latestday.sh

#!/bin/bash
a=2
for i in {02..12}
do
  echo $(date -d "$(date +%Y${i}01) -1 day" +%Y%m%d)
done
echo $(date -d "$(date -d "1 year" +%Y0101) -1 day" +%Y%m%d)

sh latestday.sh

五、连接超时

HTTP有一个KeepAlive模式,它告诉web服务器在处理完一个请求后保持这个TCP连接的打开状态。若接收到来自同一客户端的其它请求,服务端会利用这个未被关闭的连接,而不需要再建立一个连接。

KeepAlive 在一段时间内保持打开状态,它们会在这段时间内占用资源。占用过多就会影响性能。

什么情况下用长连接,什么情况下不用长连接?

并发少的情况下不用长连接,并发多用长连接

bash 复制代码
keepalive_timeout
指定KeepAlive的超时时间(timeout)。指定一个长连接最多可以保持多长时间,服务器将会在这个时间后关闭连接。 Nginx的默认值是65秒,有些浏览器最多只保持 60 秒,所以可以设定为 60 秒。若将它设置为0,就禁止了keepalive 连接。
第二个参数(可选的)指定了在响应头Keep-Alive:timeout=time中的time值。这个头能够让一些浏览器主动关闭连接,这样服务器就不必去关闭连接了。没有这个参数,Nginx 不会发送 Keep-Alive 响应头。

client_header_timeout
客户端向服务端发送一个完整的 request header 的超时时间。如果客户端在指定时间内没有发送一个完整的 request header,Nginx 返回 HTTP 408(Request Timed Out)。

client_body_timeout
指定客户端与服务端建立连接后发送 request body 的超时时间。如果客户端在指定时间内没有发送任何内容,Nginx 返回 HTTP 408(Request Timed Out)。
bash 复制代码
vim /usr/local/nginx/conf/nginx.conf
http {
...... 
    keepalive_timeout 60 60;//客户端的时间要小于服务端的连接时间,尽量让客户端主动关闭
	keepalive_requests 100;//长连接最多允许的请求数
    client_header_timeout 40;//请求头的超时时间
    client_body_timeout 40;//请求体的超时时间
...... 
}
nginx -t
systemctl restart nginx

在浏览器测试
http://192.168.210.101/error.jpg


六、更改Nginx运行进程数

在高并发场景,需要启动更多的Nginx进程以保证快速响应,以处理用户的请求,避免造成阻塞。

1、修改配置文件

修改配置文件的worker_processes参数

  • 一般设为CPU的个数或者核数
  • 在高并发情况下可设置为CPU个数或者核数的2倍

增加进程数,可减少系统的开销,提升服务速度

bash 复制代码
cat /proc/cpuinfo | grep -c "physical id"	#查看cpu核数
也可以把worker_processes设为auto,让nginx自动去识别
bash 复制代码
vim /usr/local/nginx/conf/nginx.conf

worker_processes auto;//设置为auto,让nginx自动去识别

systemctl restart nginx

使用ps aux查看运行进程数的变化情况
ps aux | grep nginx
#查看nginx主进程中包含几个子进程


2、修改进程配置参数

默认情况下,Nginx的多个进程可能跑在一个CPU上,可以分配不同的进程给不同的CPU处理,充分利用硬件多核CPU

bash 复制代码
vim /usr/local/nginx/conf/nginx.conf

worker_processes  4;				#修改为核数相同或者2倍
worker_cpu_affinity 01 10 100 1000;			#设置每个进程由不同cpu处理,
worker_rlimit_nofile 65535;         #提升并发量

events {
   use epoll;  #使用epoll io模型
   worker_connections 65535;   #连接数也为65535
}

systemctl restart nginx

进程数配为4时0001 0010 0100 1000
#将每个worker子进程与特定CPU物理核心绑定,提升cpu利用率,进而提升性能。避免同一个worker子进程在不同的CPU核心上切换或者多个进程跑在一个CPU上,缓存失效,降低性能。


七、配置Nginx实现网页压缩功能

Nginx的nginx_http_gzip_module压缩模块提供对文件内容压缩的功能

允许Nginx服务器将输出内容在发送客户端之前进行压缩,以节约网站带宽,提升用户的访问体验,默认已经安装

可在配置文件中加入相应的压缩功能参数对压缩性能进行优化

1、配置参数

bash 复制代码
vim /usr/local/nginx/conf/nginx.conf
http {
...... 
   gzip on;							#取消注释,开启gzip压缩功能
   gzip_min_length 1k;      		#最小压缩文件大小
   gzip_buffers 4 64k;      		#压缩缓冲区,大小为4个64k缓冲区
   gzip_http_version 1.1;   		#压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
   gzip_comp_level 6;       		#压缩比率
   gzip_vary on;					#支持前端缓存服务器存储压缩页面
   gzip_types text/plain text/javascript application/x-javascript text/css text/xml application/xml application/xml+rss image/jpg image/jpeg image/png image/gif application/x-httpd-php application/javascript application/json;		#压缩类型,表示哪些网页文档启用压缩功能
...... 
}

2、实现网页图片的大小压缩

将以上的压缩功能参数加入到主配置文件httpd配置中段

重启服务,查看网页压缩功能开启结果

bash 复制代码
#实现网页图片的大小压缩
http_image_filter_module是Nginx提供的集成图片处理模块,可以用于实时缩取图片,旋转图片,验证图片有效性以及获取图片宽高以及图片类型信息

yum install -y gd-devel
#yum在线源安装gd-devel,http_image_filter_module模块需要依赖gd-devel的支持

cd /opt/nginx-1.24.0/

nginx -V

./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_image_filter_module

make && make install
bash 复制代码
vim /usr/local/nginx/conf/nginx.conf
http {
 ...
 gzip on; 
 gzip_types text/plain text/javascript application/x-javascript text/css text/xml application/xml application/xml+rss image/jpg image/jpeg image/png image/gif application/x-httpd-php application/javascript application/json;
 #将图片类型文件压缩加入gzip
 ....
 server {
  ....
      location ~* \.(jpg|gif|png)$ {
      image_filter resize 200 200; //设置照片大小
      }
   }
}
#按等比例缩小图像的宽或高至指定大小。如果只想设置一个维度,另一维可以指定为:"-"
#(如果长>宽就以长为标准,宽为比例,如果长<宽就以宽为标准,长为比例)
bash 复制代码
cd /usr/local/nginx/html
先将game.jpg文件传到/usr/local/nginx/html目录下
vim test.html
<img src="game.jpg"/>   #网页中插入图片
</body>
</html>

systemctl restart nginx

在浏览器测试http://192.168.210.101/test.html




八、配置Nginx实现防盗链

在企业网站服务中,一般都要配置防盗链功能,以避免网站内容被非法盗用,造成经济损失。

1、模拟盗链

bash 复制代码
192.168.210.101 www.accp.com 源主机
192.168.210.102 www.benet.com 盗链主机

在盗链主机编译安装apache服务并开启httpd服务
systemctl start httpd
netstat -lntp | grep httpd

用域名去访问图片,在电脑的Windows/System32/drivers/etc路径去修改hosts文件
192.168.210.101 www.accp.com
192.168.210.102 www.benet.com  

#修改配置文件
vim /usr/local/httpd/conf/httpd.conf
ServerName www.benet.com:80
bash 复制代码
cd /usr/local/httpd/htdocs/
vim index.html
<html>
<body><h1>It is daolian web!</h1>
<img src="http://www.accp.com/game.jpg">
</body></html>

systemctl restart httpd

在浏览器中测试
http://www.benet.com/index.html


2、配置防盗链

bash 复制代码
~* \.(jpg|gif|swf)$ :这段正则表达式表示匹配不区分大小写,以.jpg 或.gif 或.swf 结尾的文件;
valid_referers :设置信任的网站,可以正常使用图片;
none:允许没有http_refer的请求访问资源(根据Referer的定义,它的作用是指示一个请求是从哪里链接过来的,如果直接在浏览器的地址栏中输入一个资源的URL地址,那么这种请求是不会包含 Referer 字段的),如 http://www.accp.com/game.jpg
我们使用 http://www.accp.com 访问显示的图片,可以理解成 http://www.accp.com/game.jpg 这个请求是从 http://www.accp.com 这个链接过来的。
blocked:允许不是http://开头的,不带协议的请求访问资源; 
*.accp.com:只允许来自指定域名的请求访问资源,如 http://www.accp.com

if语句:如果链接的来源域名不在valid_referers所列出的列表中,$invalid_referer为true,则执行后面的操作,即进行重写或返回 403 页面。
bash 复制代码
把/usr/local/nginx/html/static目录下的error.png移到/usr/local/nginx/html目录下

vim /usr/local/nginx/conf/nginx.conf
http {
......
	server {
	......
		location ~* \.(jpg|gif|jepg)$ {
			valid_referers none blocked *.accp.com accp.com;#*.accp.com accp.com只要不是从这个路径来的请求都认为是盗链
			if ( $invalid_referer ) {
				rewrite ^/ http://www.accp.com/error.png;#盗链请求就用rewrite对整个路径进行重写,让盗链请求访问我的http://www.accp.com/error.png这个路径,由于png在正则表达式里面没有匹配,这样的话就会匹配到根路径html目录下,就会读取html下的error.png
            }
        }
	}
}
nginx -t
systemctl restart httpd

在浏览器测试http://www.accp.com/index.html

九、fpm参数优化

Nginx的PHP解析功能实现如果是交由FPM处理的,为了提高PHP的处理速度,可对FPM模块进行参数的调整

根据服务器的内存与服务负载,调整FPM模块参数

bash 复制代码
vim /usr/local/php/etc/php-fpm.conf 
--17行--取消注释
pid = run/php-fpm.pid
bash 复制代码
vim /usr/local/php/etc/php-fpm.d/www.conf
--96行--
pm = dynamic				#fpm进程启动方式,动态的
--107行--
pm.max_children=20			#fpm进程启动的最大进程数
--112行--
pm.start_servers = 5		#动态方式下启动时默认开启的进程数,在最小和最大之间
--117行--
pm.min_spare_servers = 2	#动态方式下最小空闲进程数
--122行--
pm.max_spare_servers = 8	#动态方式下最大空闲进程数

systemctl restart php-fpm.service
ps aux|grep fpm


十、系统内核级别的优化

如果发现系统存在大量TIME_WAIT状态的连接,可以通过调整内核参数解决

bash 复制代码
vim /etc/sysctl.conf 内核配置参数文件
加入以下内容

net.ipv4.tcp_syncookies = 1                  开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击
net.ipv4.tcp_tw_reuse = 1                    开启重用,允许将TIME-WAIT sockets重新用于新的TCP连接
net.ipv4.tcp_tw_recycle = 1                  开启TCP连接中TIME-WAIT sockets的快速回收
net.ipv4.tcp_fin_timeout = 30                修改系默认的 TIMEOUT 时间(MSL值)
net.ipv4.tcp_max_tw_buckets = 6000           系统同时保持TIME-WAIT的最大数量
net.ipv4.ip_local_port_range = 1024 65535    外向连接的端口范围,默认为32768 60999
net.ipv4.tcp_max_syn_backlog = 65536         系统能接受的tcp半连接的最大队列数,TCP三次握手建立阶段接受SYN请求队列的最大长度
net.core.somaxconn = 65536                   每一个端口最大的 Listen 监听队列的长度(排队等待接收的最大连接数)
                                             需要配合Nginx的配置参数一起调整 listen 80 backlog=65536; 
net.ipv4.tcp_keepalive_time = 600            发送keepalive探测包消息的频率,确认客户端是否断网
bash 复制代码
/etc/security/limits.conf   内核限制文件
* 	soft 	noproc			65535      打开的进程数
* 	hard 	noproc			65535
* 	soft 	nofile			65535      打开的文件数
* 	hard 	nofile			65535
* 	soft 	memlock 		unlimited     不做内存锁定
* 	hard 	memlock 		unlimited
相关推荐
CRMEB定制开发31 分钟前
【实战】CRMEB Pro 企业版安装教程(附 Nginx 反向代理配置 + 常见问题解决)
nginx·商城系统·微信商城·crmeb
cocologin1 小时前
RIP 技术深度解析
运维·网络·网络协议
庸子2 小时前
基于Jenkins和Kubernetes构建DevOps自动化运维管理平台
运维·kubernetes·jenkins
Lpy25692 小时前
Docker Desktop 安装到D盘(包括镜像下载等)+ 汉化
运维·docker·容器
眠修2 小时前
Kuberrnetes 服务发布
linux·运维·服务器
好奇的菜鸟3 小时前
Docker 配置项详解与示例
运维·docker·容器
xcs194053 小时前
集运维 麒麟桌面版v10 sp1 2403 aarch64 离线java开发环境自动化安装
运维·自动化
BAOYUCompany3 小时前
暴雨服务器成功中标华中科技大学集成电路学院服务器采购项目
运维·服务器
超龄超能程序猿4 小时前
Bitvisse SSH Client 安装配置文档
运维·ssh·github
奈斯ing4 小时前
【Redis篇】数据库架构演进中Redis缓存的技术必然性—高并发场景下穿透、击穿、雪崩的体系化解决方案
运维·redis·缓存·数据库架构