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" ]
thenmkdir -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.1gzip_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格式,否则会陷入死循环!!
在这里插入图片描述

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和核心上运行
0110 是二进制数 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.comif语句:如果链接的来源域名不在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-fpmnetstat -anpt | grep 9000

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/62772.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle数据迁移

问题描述&#xff1a; oracle数据库的所有表结构、数据、索引等需要需从测试库迁移到正式库。 解决步骤&#xff1a; oracle数据库迁移&#xff0c;主要通过expdp从测试库所在的源服务器将指定的数据表或数据源导出为一个或多个数据文件&#xff08;.dmp文件&#xff09;&…

3.6 Spring MVC文件上传

1. 文件上传到本地 实现方式 Spring MVC使用commons-fileupload实现文件上传&#xff0c;注意事项如下&#xff1a; l HTTP请求方法是POST。 l HTTP请求头的Content-Type是multipart/form-data。 SpringMVC配置 配置commons-fileupload插件的文件上传解析器CommonsMultip…

【JAVA基础】- 同步非阻塞模式NIO详解

【JAVA基础】- 同步非阻塞模式NIO详解 文章目录 【JAVA基础】- 同步非阻塞模式NIO详解一、概述二、常用概念三、NIO的实现原理四、NIO代码实现客户端实现服务端实现 五、同步非阻塞NIO总结 一、概述 NIO&#xff08;Non-Blocking IO&#xff09;是同步非阻塞方式来处理IO数据。…

Qt通过QSS设置QPushButton的样式

同时设置QPushButton的文字样式和图标的方法 为了美化界面&#xff0c;有时候需要修改QPushButton的样式&#xff0c;让一个QPushButton上面既要显示图标&#xff0c;又要显示文字内容 起初我的做法是重写QPushButton&#xff0c;这样做可以实现&#xff0c;但是有几个问题 实现…

亚信科技AntDB数据库与库瀚存储方案完成兼容性互认证,联合方案带来约20%性能提升

近日&#xff0c;亚信科技AntDB数据库与苏州库瀚信息科技有限公司自主研发的RISC-V数据库存储解决方案进行了产品兼容测试。经过双方团队的严格测试&#xff0c;亚信科技AntDB数据库与库瀚数据库存储解决方案完全兼容、运行稳定。除高可用性测试外&#xff0c;双方进一步开展TP…

SpringBoot整合、SpringBoot与异步任务

目录 一、背景描述二、简单使用方法三、原理五、使用自定义线程池六、Async失效情况 一、背景描述 java 的代码是同步顺序执行&#xff0c;当我们需要执行异步操作时我们通常会去创建一个新线程去执行。比如new Thread()。start()&#xff0c;或者使用线程池线程池 new Thread…

jackson库收发json格式数据和ajax发送json格式的数据

一、jackson库收发json格式数据 jackson库是maven仓库中用来实现组织json数据功能的库。 json格式  json格式一个组织数据的字符文本格式&#xff0c;它用键值对的方式存贮数据&#xff0c;json数据都是有一对对键值对组成的&#xff0c;键只能是字符串&#xff0c;用双引号包…

C++模板初阶

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析2 目录 &#x1f449;&#x1f3fb;泛型编程&#x1f449;&#x1f3fb;模板函数模板函数…

rust-异步学习

rust获取future中的结果 两种主要的方法使用 async: async fn 和 async 块 async 体以及其他 future 类型是惰性的&#xff1a;除非它们运行起来&#xff0c;否则它们什么都不做。 运行 Future 最常见的方法是 .await 它。 当 .await 在 Future 上调用时&#xff0c;它会尝试把…

vue父页面给iframe子页面传值

在vue父页面有两个个参数 名称和图标&#xff0c;需要把这两个参数传到iframe的地图里面&#xff0c;在地图触发绘点事件的时候&#xff0c;获取到传来的参数并且展示 vue:传值给子页面iframe // 传值给子页面iframe(2个参数)handleIframeLoad() {const iframeWindow this.$re…

【学习FreeRTOS】第4章——FreeRTOS任务创建与删除

1.任务创建和删除的API函数 任务的创建和删除本质就是调用FreeRTOS的API函数 动态方式创建任务——xTaskCreate()静态方式创建任务——xTaskCreateStatic()删除任务——vTaskDelete() 动态创建任务&#xff1a;任务的任务控制块以及任务的栈空间所需的内存&#xff0c;均由 F…

iPhone苹果手机地震预警功能怎么开启?

iPhone苹果手机地震预警功能怎么开启&#xff1f; 1、打开iPhone苹果手机设置&#xff1b; 2、在iPhone苹果手机设置内找到辅助功能&#xff1b; 3、在辅助功能内找到触控&#xff1b; 4、在iPhone苹果手机辅助功能触控内找到振动&#xff0c;如果是关闭状态请启&#xff1b; …