Nginx的优化和防盗链
全篇高能!!!!干货较多!!!!本篇含面试高频题:
修改配置文件时,先备份!!!以便回滚!!!
nginx页面优化
一、隐藏版本号:
方法一:修改配置文件
vim /usr/local/nginx/conf/nginx.conf
在http模块中,添加一个命令:
server_tokens off;
方法二:在源码包中修改(达到混淆入侵者的目的)
vim /opt/nginx-1.22.0/src/core/nginx.h
#define NGINX_VERSION "1.1.1" #修改版本号
#define NGINX_VER "burun/"
NGINX_VERSION
二、nginx的日志分割:
脚本文件
vim nginxlog.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'
#定义nginx的pid文件
pid_file='/usr/local/nginx/run/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
#用kill发送信号给nginx主程序,生成一个新的日志文件
kill -USR1 $(cat ${pid_file})
#cat /usr/local/nginx/run/nginx.pid
#日志文件清理的命令,清理过期文件
find ${dir} -mtime +30 -exec rm -rf {} \;
三、nginx的页面压缩:
主要作用:节约带宽,提升用户的访问速度
注意:nginx压缩的功能是默认自带的,但是如果需要压缩细节,需要打开gzip的注释,然后进行配置。
修改配置文件:
vim /usr/local/nginx/conf/nginx.conf
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;
#压缩的类型,哪些文档启用压缩功能
四、nginx的图片缓存:
修改配置文件:
vim /usr/local/nginx/conf/nginx.conf
注意:不能加png格式,否则会陷入死循环!!
http {
.................
location ~* \.(gif|jpg|jepg|bmp|ico)$ {
root html;
expires 1d; #设置缓存时间为一天;
}
}
连接超时:
http1.1会有一个keepalive模式,告诉web服务器在处理完一个请求之后保持当前连接的tcp的状态,如果当前连接有新的请求,服务端就会利用这个没有关闭的连接,继续给客户端响应,不需要再建立一个新的连接。
keepalive 在一段时间只内保持打开状态,在这段时间之内还是会占用资源,占用过多会影响性能。
keepalive_timeout 65;#tcp连接最多可以保持65秒。
绝大多数企业一般会设置到60 -65
设置为0,就是禁用了keepalive功能。只要请求完成立刻关闭tcp连接。
长连接:
client_header_timeout 60;
客户端向服务端发送请求,会有一个request_header的超时时间。
如果客户端没有在60秒内发送一个完整的请求头(equest_header),nginx会返回一个408 (request timeout :请求超时)
client_body_timeout 60;
客户端没有向服务器在60s发送一个完整的请求体。nginx会返回一个408 (request timeout :请求超时)
vim /usr/local/nginx/conf/nginx.conf
http {
......
keepalive_timeout 65 ; #指定TCP链接最多可以保持65秒
client_header_timeout 60; #请求头
client_body_timeout 60; #请求体
......
}
五、nginx的并发设置:
在高并发的场景中,需要启动更多的nginx进程以保证响应速度,可以更快的处理用户的请求,避免造成阻塞。
1.根据cpu核心数来进行设置
查看cpu核心数:
cat /proc/cpuinfo | grep processor | wc -l
修改配置文件:
```csharp
vim /usr/local/nginx/conf/nginx.conf
设置工作进程数:
worker_processes 2; #修改为核数相同或者2倍
worker_cpu_affinity 01 10;
注意:在生产中worker一般设置为4,访问量不大1足够了,如果要扩展,最多8个!!,8个以上的work进程就不会提高性能了,反而会降低性能。
将work进程绑定cpu
work _cpu affinty 01 10#设置work进程绑定到指定的cpu命令,可以减少cpu切换带来的开销,确保work进程在一个独立的cpu和核心上运行
01 和 10 是二进制数 cpu1 和cpu2 的意思
#注意:单个work进程可以不绑定cpu
如果并大量大将连接数改为10240就够用了(目前在企业中:最好的办法还是更改worker_connections 最大连接数)
并发量计算:worker_process 数 乘以 worker_connections 数
要想达到并发量值,还需要更改最大连接文件数:
1.临时:ulimit -n 65535 (linux最大只支持打开65535)
2.永久修改:vim /etc/security/limits.conf
65535 为Linux系统最大打开文件数
soft nproc 65535
hard nproc 65535
soft nofile 65535
hard nofile 65535
注意:设置保存后,需要重新ssh连接才会看到配置更改的变化。
TIME_WAIT:不是一个报错信息,是tcp连接状态中是一种状态,出现在tcp连接的四次挥手中。
当连接的一方发送fin报文,而且收到了对方的ack报文之后,就会进入time_wait
tcp处理等待的状态,是有一个持续时间,65秒,确保网络中的所有数据包都被完全处理完毕。
有两个作用:
1,确保可靠的关闭连接,如果立刻关闭连接,旧的数据包也会被处理,从而会干扰新的连接。
2.避免连接复用,time_wait时间太短,可能会导致旧的连接仍然在网络中,误认为是新连接,就会导致连接复用。
而且在连接的生命周期中,time_wait占用的资源是非常小的,而且对服务器整体性能的影响也是有限的。大量的短连接频繁创建和销毁,或者大并发连接时(负载均衡),time_wait连接会积累,服务器会出现大量的time_wait连接状态,在这种情况下需要进行优化处理。
在linux内核设置,进行优化。
查看系统的所有tcp连接状态:
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
tcp连接在系统中的状态:
closed:表示连接未活动或者关闭
listen:监听,等待连接
syn_recv:syn接收,服务端收到了来自客户端的syn(连接请求),正在等待确认。
syn_sent:syn发送,客户端已经向服务端发送syn请求,等待服务器确认。
ESTABLISHED:已经建立了tcp连接,正在传输数据。
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
#net.ipv4.tcp_fin_timeout =30-65之间 一般45即可
sysctl -p 立即生效
六、配置防盗链
修改配置文件:
vim /usr/local/nginx/conf/nginx.conf
valid_referers:设置信任的网站,
none:允许没有http_refer的请求访问资源
http {
...........
server{
...........
location ~* \.(jpg|gif|swf)$ {
root html;
expires 1d;
valid_referers none blocked *.kgc.com kgc.com;
if ( $invalid_referer ) {
rewrite ^/ http://www.kgc.com/error.png;
}
}
............
}
...............
}
解释:
~* \.(jpg|gif|swf)$ :这段正则表达式表示匹配不区分大小写,以.jpg 或.gif 或.swf 结尾的文件;
valid_referers :设置信任的网站,可以正常使用图片;
none:允许没有http_refer的请求访问资源(根据Referer的定义,它的作用是指示一个请求是从哪里链接过来的,
如果直接在浏览器的地址栏中输入一个资源的URL地址,那么这种请求是不会包含 Referer 字段的),如 http://www.kgc.com/game.jpg
我们使用 http://www.kgc.com 访问显示的图片,可以理解成 http://www.kgc.com/game.jpg 这个请求是从 http://www.kgc.com
这个链接过来的。
blocked:允许不是http://开头的,不带协议的请求访问资源;
*.kgc.com:只允许来自指定域名的请求访问资源,如 http://www.kgc.com
if语句:如果链接的来源域名不在valid_referers所列出的列表中,$invalid_referer为true,则执行后面的操作,
即进行重写或返回 403 页面。
网页准备:
Web源主机(192.168.233.21)配置:
cd /usr/local/nginx/html
将game.jpg、error.png文件传到/usr/local/nginx/html目录下
vim index.html
......
<img src="game.jpg"/>
</body>
</html>
echo "192.168.233.21 www.kgc.com" >> /etc/hosts
echo "192.168.233.22 www.benet.com" >> /etc/hosts
盗链网站主机(192.168.233.22):
cd /usr/local/nginx/html
vim index.html
......
<img src="http://www.kgc.com/game.jpg"/>
</body>
</html>
echo "192.168.233.21 www.kgc.com" >> /etc/hosts
echo "192.168.233.22 www.benet.com" >> /etc/hosts
在盗图网站主机上进行浏览器验证
http://www.benet.com
七、fpm参数优化
Nginx的PHP解析功能实现如果是交由FPM处理的,为了提高PHP的处理速度,可对FPM模块进行参数的调整。
根据服务器的内存与服务负载,调整FPM模块参数。
vim /usr/local/php/etc/php-fpm.conf
pid = run/php-fpm.pid
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 #动态方式下最大空闲进程数
kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid` #重启php-fpm
netstat -anpt | grep 9000