目录
优化:
1.隐藏版本号
2.nginx的日志分割:
3.nginx的页面压缩
4.nginx的图片压缩
5.连接超时:
6.nginx的并发设置:
1、cpu的核心数来进行设置
2、worker进程绑定到cpu中
7.nginx优化之 TIME_WAIT
防盗链
优化:
1.隐藏版本号
第一种方法:修改配置文件
备份配置文件 加上日期有助于回滚 cp nginx.conf nginx.conf.bak.2023.0805
改配置文件 cd /usr/local/nginx/conf/
在http模块中添加代码,任意位置
重启服务
第二种方法:直接进源码包中,可以修改版本名字
cd /opt
进入源码包
cd src
cd core
打开nginx.h
回到源码包的主目录,重新编译安装
make -j 4 && make install
如果做了第一种方法,记得改成:server_tokens on;
重启服务
2.nginx的日志分割:
nginx不自带日志分割工具,需要手动以脚本的形式来进行分割。
cd /usr/local/nginx/logs/
cd /opt
vim nginx.sh
#!/bin/bash
d=$(date +%Y-%m-%d) #获取日期
dir="/usr/local/nginx/logs" #定义存储目录
logs_file="/usr/local/nginx/logs/access.log" #分割日志
logs_error='/usr/local/nginx/logs/error.log'
pid_file='/usr/local/nginx/run/nginx.pid' #定义nginx的pid文件
if [ ! -d "$dir" ]
then
mkdir -p $dir
fi
mv $logs_file ${dir}/access_${d}.log #移动日志并且重命名
#mv /usr/local/nginx/logs/access.log /usr/local/nginx/logs/access_2023-08-05.log
mv $logs_error ${dir}/error_${d}.log
#发送信号给nginx的主程序,让他生成一个新的日志文件
kill -USR1 $(cat ${pid_file}) #cat /usr/local/nginx/run/nginx.pid
#日志文件清理的命令
find ${dir} -mtime +30 -exec rm -rf {}\; #清理30天前的日志文件
chmod 777 nginx.sh
./nginx.sh
3.nginx的页面压缩
1.压缩的功能是默认自带的,可以不取消注释的,但是需要添加压缩细节,需要把gzip打开后,进行配置
节约带宽,提升用户的访问速度
配置文件中
http中的gzip on
gzip_min_length_1k;
#如果这个文件小于等于1k,不再进行压缩
gzip_buffers 4 64k;
#压缩的缓冲区,大小为64k,有4个,nginx会使用4个大小的缓冲区,存储压缩后的数据
gzip_http_version 1.1;
#压缩的版本号,可以不写,默认就是1.1
gzip_comp_level 6
#压缩比率 1-9 数字越小,压缩的速度越快,但是比率越低。反之,数字越大,压缩的速度越慢,但是比率越高
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;
#压缩的类型,开启对这些文档的压缩功能
wq!
systemctl restart nginx
4.nginx的图片压缩
cd conf/
打开配置文件
在server块中添加一个location块
location ~* \ . (gif|jpg|swf|jepg|ico)$ //不要用png格式,否则会陷入死循环
{
root html;
expires 1d;
#设置图片的缓存时间为1天
}
wq!
systemctl restart nginx
5.连接超时:
http1.1会有一个keepalive模式,告诉web服务器在处理完一个请求之后,保持当前连接的tcp的状态为打开状态。如果当前连接有新的请求,服务端就会利用这个没有关闭的连接,继续给客户端响应,不需要再建立一个新的连接。
keep alive 在一段时间之内保持打开状态,在这段时间之内还是会占用资源,占用过多会影响性能。
打开nginx配置文件
http模块中的keep alive
keep alive_timeout 60; #tcp连接最多可以保持60秒,60-65都可以,如果设置为0,就是禁用了keep alive功能,只要请求完成立刻关闭tcp连接。有连接保持和长连接功能
client_header_timeout 60 ;#请求头的超时时间,
客户端向服务端发送请求,会有一个完整的request_header的超时时间。如果客户端没有按照配置的60秒内发送一个完整的请求头,nginx会返回一个状态码408,也就是request time out (请求超时),就像网络游戏,挂机时间过长没有操作发送请求,就会被踢出,避免占用服务器资源。
client_body_timeout 60 #请求体的超时时间
客户端没有向服务端在60秒内发送一个完整请求体,nginx 408 request time out (服务器端没有响应/ip无法上网)
6.nginx的并发设置:
在高并发的场景中,需要启动更多的nginx进程以保证响应速度。可以更快的处理用户的请求,避免造成阻塞。
1、cpu的核心数来进行设置
cat /proc/cpuinfo | grep processor |wc -l #查看cpu核心数
cd /usr/local/nginx/conf/
修改配置文件
把全局配置的worker_processes 改为4
systemctl restart nginx
一个进程可以执行worker_connections设置的连接数
记得修改限制最大连接数!!!
2、worker进程绑定到cpu中
worker_cpu_affinity
设置worker进程绑定到指定的cpu的命令。可以减少cpu切换带来的开销,可以确保woker进程在一个独立的cpu核心上运行。
二进制
0000 0
0001 1
0010 2
0100 3
1000 4
worker_cpu_affinity 01 10
worker_cpu_affinity 单个进程可以不绑定cpu
生产中worker一般设置为4,访问量不大,1也足够了
如果要扩展,最多到8 16个。
8个以上的worker进程就不会再提高性能了,反而会降低性能。
8个足够,一般设置为4个
7.nginx优化之 TIME_WAIT
TIME_WAIT
不是一个报错信息,是tcp连接状态中的一种状态。出现在tcp连接的四次挥手过程中,
当连接的一方发送FIN(断开)报文,而且收到了对方的ack报文之后,就会进入time_wait
tcp处于等待的状态,是有一个持续时间,由keep alive设置的,为60秒。确保网络中的所有数据包都被完全处理完毕。
作用:
1、确保可靠的关闭连接,如果立刻关闭连接,旧的数据包也会被处理,从而会干扰新的连接。
2、避免连接复用,timewait的时间太短,可能会导致旧的连接仍然在网络中,误认为是新连接,就会导致出现连接复用。
在连接的生命周期当中,time_wait占用的资源是非常小的,而且对服务器整体性能的影响也非常有限。
大量的短连接频繁创建和销毁,或者大并发连接时(负载均衡),time_wait连接会积累,服务器会出现大量的time_wait状态的连接,这种情况下,需要优化处理。
此时,需要靠内核设置,进行优化
查看系统的所有tcp连接的状态:
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
closed 表示连接未活动或者关闭
listen 监听,等待连接
syn_recv: syn接收,服务端接收到了来自客户端的syn(连接请求),正在等待确认
syn_sent:syn发送,客户端已经向服务器发送了syn请求,等待服务器确认。
ESTABLISHED: 已经建立了tcp连接,正在传送数据
fin_wait 1: 表示一端已经发送了连接关闭的请求,等待另一端确认
fin_wait 2:表示另一端已经确认了,等待发出端确认关闭请求。
close_wait:表示一端已经关闭连接,但是应用程序还未关闭连接
closing:表示正在关闭
time_wait:连接等待
last_ack:表示应用程序已经发送了最后的确认,等待另一端进入closed状态。
清理:vim /etc/sys
net.ipv4.tcp_syncookies = 1 #表示开启syn的缓存功能,当出现SYN队列溢出,启用cookie处理请求
net.ipv4.tcp_tw_reuse = 1 #让TIME_WAIT状态的连接可以复用,即使time_wait把本地的端口全部占满,它也不会拒绝新的请求
net.ipv4.tcp_tw_recycle = 1 #让time_wait尽快回收
net.ipv4.tcp_tw_fin_timeout = 60 #表示如果端口由本端要求关闭,fin_wait_2状态的保持时间,
sysctl -p #改完内核文件保存后,输入此命令让配置立即生效。
防盗链
location ~* \ . (jpg|gif|swf|ico)$
{
root html;
valid_referers none blocked *.kgc.com
if ( $invalid_referer)
{
rewrite ^/ http:www.kgc.com/error.png;
}
}
systemctl restart nginx
valid_referers:设置信任的网站,*.kgc.com kgc.com都可以访问图片
none:允许没有http_refer的请求访问资源。
www.kgc.com/ls.jpg
www.kgc.com 也可以访问显示图片。www.kgc.com可以直接访问www.kgc.com/ls.jpg
blocked:允许不是http://开头的请求,可以不带协议请求访问资源。
*.kgc.com:只允许域名是kgc的才可以请求资源。
$invalid_referer:只要不是valid_referer设置信任的网站,