目录
nginx优化
隐藏版本号
nginx日志分割
nginx不自带日志分割工具,需要手动以脚本的方式分割
nginx页面压缩
链接超时
nginx并发设置
内核设置进行优化
防盗链
方法一 修改配置文件
cd /usr/local/nginx/conf/
cp nginx.conf nginx.conf.bak.2023.0805
vim nginx.conf
在http模块中加入
server_tokens off
方法二 在源码包里改
/src/core/nginx.h
/opt/nginx-1.22.0/src/core/nginx.h
#define NGINX_VERSION "1.1.1" #修改版本号 #define NGINX_VER "burun/" NGINX_VERSION
#!/bin/bash
#获取日期
d=$(date +%Y-%m-%d)
#定义存储目录
dir="/usr/local/nginx/logs"
#分割日志
logs_access="usr/local/nginx/logs/access.logs"
logs_error="usr/local/nginx/logs/error.logs"
#定义nginx的pid文件
pid_file='usr/local/nginx/run/nginx.pid'
if [ ! -d "$dir"]
then
mkdir -p $dir
fi
#移动日志并且重命名
mv $logs_access ${dir}/access_${d}.log
mv $logs_error ${dir}/error_${d}.log
#发送信号给nginx主程序,生成新的日志文件
kill -USR1 $(cat ${pid_file})
#日志文件清理
find ${dir} -mtime +30 -exec rm -rf {} \;
可以节约带宽,提升用户的访问速度
gzip on; #取消注释,开启gzip的压缩功能
gzip_min_length 1k; #最小压缩文件的大小
gzip_buffers 4 64k; #压缩缓冲区,大小为4个64K缓冲区,Nginx 会使用 4 个 64KB 大小的缓冲区来存储压缩后的数据。
gzip_http_version 1.1; #压缩版本,默认为1.1
gzip_comp_level 6; #压缩比率(压缩等级为1-9,6是中等等级,也是常用等级)Gzip 压缩级别的范围是 1 到 9,
其中 1 表示压缩速度最快,但压缩比最低,9 表示压缩速度最慢,但压缩比最高。默认值为 1。
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;
#压缩的类型,哪些文档启用压缩功能
压缩的功能是默认自带的,可以不取消注释的但是需要添加压缩细节,需典把gzip 打开时后,进行配置
http1.1会有一个keepalive模式,告诉web服务器在处理完一个请求之后保持当前连接的tcp的状态为打开状态,如果当前连接有新的请求,服务端就会利用这个没有关闭的连接,继续给客户端响应,不需要再建立一个新的连接
keepalive在一段时间之内保持打开状态,在这段时间内还是会占用资源,占用过多会影响性能
keepalive_timeout 65;tcp连接最多可以保持65秒
设置为0,就是禁用了keepalive功能,只要请求完成立即关闭tcp连接
client_header_timeout 60;
客户端会向服务端发送请求,会有一个request_header的超时时间。如果客户端没有在时间内发送一个完整的请求头,nginx就会返回408 request time out
client_body_timeout 60;
客户端没有向服务器在60秒发送一个完整请求体,nginx 408 request time out
在高并发场景中,需要启动更多的nginx进程以保证响应速度,可以更快的处理用户的请求避免阻塞
1.根据CPU的核心数来进行设置
查看CPU的核心数
cat /proc/cpuinfo | grep processor | wc -l
nginx配置文件
worker_processes
#工作进程也就是worker进程的数量,一般配置成CPU数一致或者2倍
worker_connections
#每个进程可以处理的最大连接数
2.worker_cpu_affinity
置worker进程绑定到指定CPU的命令,可以减少CPU切换带来的开销,确保worker进程在一个独立的CPU核心上运行
worker_cpu_affinity 01 10
后面CPU的数为二进制数
在生产中worker一般为4,如果要扩展最多到8个。8个以上的worker进程反而会降低性能
TIME_WAIT
不是一个报错信息,是tcp连接中的一种状态,出现在tcp连接的四次挥手中
当连接的乙方发送fin报文,而且收到了对方的ack报文之后,就会进入time_wait
tcp处理等待的状态,有一个持续时间65秒,确保网络中的所有数据包都被完全处理完毕。
两个作用
1.确保可靠的关闭连接。如果立刻关闭连接,就得数据包也会被处理,从而会干扰新的连接
2.避免链接复用,time_wait时间太短,可能会导致就得连接仍然在网络中,会被误认为新链接而导致连接复用
在连接的生命周期中,time_wait占用的资源是非常小的,而且对服务器整体性能的影响非常有限。大量的短链接频繁创建和销毁,或者大并发连接时(负载均衡),time_out连接会积累,服务器会出现大量的tome_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连接,正在传输shuju
fin_wait1 表示一端已经发送了连接关闭的请求,等待另一端确认
fin_wait2 表示另一端已经确认连接关闭请求,等待发出端确认连接关闭请求
close_wait 表示一端已经关闭连接,但是应用程序还未关闭连接
closing 正在关闭连接
time_wait 连接等待
last_ack 表示应用程序已经发送了最后的确认,等待另一端进入closed状态
vim /etc/sysctl.conf
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 60
sysctl -p 立即生效
vaid_referers设置信任的网站
none 允许没有http refer的请求访问资源
blocked 允许不带协议请求访问资源