Nginx的优化和防盗链(面试高频!!!)

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的日志分割:
因为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

Nginx的优化和防盗链(面试高频!!!)_第1张图片

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-96是中等等级,也是常用等级)Gzip 压缩级别的范围是 19,
	其中 1 表示压缩速度最快,但压缩比最低,9 表示压缩速度最慢,但压缩比最高。默认值为 1gzip_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格式,否则会陷入死循环!!
Nginx的优化和防盗链(面试高频!!!)_第2张图片

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

设置工作进程数:
Nginx的优化和防盗链(面试高频!!!)_第3张图片

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和核心上运行
0110 是二进制数 cpu1 和cpu2 的意思
#注意:单个work进程可以不绑定cpu

如果并大量大将连接数改为10240就够用了(目前在企业中:最好的办法还是更改worker_connections 最大连接数)
Nginx的优化和防盗链(面试高频!!!)_第4张图片
并发量计算: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的请求访问资源
Nginx的优化和防盗链(面试高频!!!)_第5张图片

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

你可能感兴趣的:(nginx,chrome,运维)