Nginx的性能优化、安全以及防盗链配置

news2024/11/18 11:36:38

目录

一、nginx的日志分割

二、nginx性能优化之启用epoll模型

三、nginx性能优化之设置worker进程数并与cpu进行绑核

四、nginx性能优化之调整worker的最大打开文件数和最大处理连接请求数量

五、nginx性能优化之启用gzip压缩,提高传输,减少带宽

六、nginx性能优化之设置keepalive超时时间以及最大请求连接数

七、nginx性能优化之设置页面缓存时间

八、nginx安全之隐藏版本号

九、nginx安全之修改进程运行的属主和属组

十、nginx安全之防盗链设置,避免资源盗用以及节省带宽

十一、fpm参数优化

一、nginx的日志分割

nginx的日志是生成在安装目录下/usr/local/nginx/logs中,大量的日志如果不做良好的管理,长此以往会造成日志文件过大且日志分析困难

 

编写日志分割的脚本
#!/bin/bash
#this is used for cutting nginx logs 
##定义日志收集的目录
newlogpath=/var/log/nginx
##定义区分日志的标识,采用时间标记,计划每天一次日志分割
lastday=`date -d "-1 day" +%Y%m%d`
##找到应用程序生成日志的源路径
oldlogpath=/usr/local/nginx/logs
##定义应用程序的pid号 也就是nginx的master进程号
pid=`cat ${oldlogpath}/nginx.pid`

##先判断收集日志的目录是否存在,没有则创建,有则进行下一步
[ -d $newlogpath ]||mkdir $newlogpath

##使用mv命令进行日志分割,将生成的访问日志和错误日志都移动到收集日志的目录下,并添加时间标记
mv $oldlogpath/access.log $newlogpath/access.log.$lastday
mv $oldlogpath/error.log $newlogpath/error.log.$lastday

##重新生成新的日志,便于nginx记录后续访问事务
kill -USR1 $pid

##删除大于30天的日志,释放磁盘空间
find $newlogpath -mtime +30 -exec rm -rf {} \;

chmod +x ~/nginx_log.sh
crontab -e
0 0 * * * ~/nginx_log.sh

二、nginx性能优化之启用epoll模型

epoll模型使用的是IO多路复用技术,这是一种基于事件处理的模型,可以实现很高的并发量,而且内存占用小。处理请求灵活效率高。

在event模块添加
user epoll;
底层采用epoll模型,多路复用,可以实现很高的并发量,而且内存占用小。

三、nginx性能优化之设置worker进程数并与cpu进行绑核

为什么要绑核?

##默认情况,Nginx的多个进程可能跑在一个CPU上,如果进行绑核可以分配不同的进程给不同的CPU处理,充分利用硬件多核多CPU。

worker_processes auto;
worker_cpu_affinity 0001 0010 0100 1000;
##默认情况,Nginx的多个进程可能跑在一个CPU上,如果进行绑核可以分配不同的进程给不同的CPU处理,充分利用硬件多核多CPU

 #将每个worker子进程与特定CPU物理核心绑定,提升cpu利用率,进而提升性能。避免同一个worker子进程在不同的CPU核心上切换或者多个进程跑在一个CPU上,缓存失效,降低性能。

四、nginx性能优化之调整worker的最大打开文件数和最大处理连接请求数量

 除了调整应用程序  还需要调整系统内核的限制

在全局模块在配置
worker_rlimit_nofile 20480;
在event模块配置最大连接数量
worker_connections  20480;

##记得同时修改内核参数,数量是根据需求自定义的
[root@localhost ~]#vim /etc/security/limits.conf 
*   soft   nofile   81920
*   hard   nofile   81920

五、nginx性能优化之启用gzip压缩,提高传输,减少带宽

Nginx的ngx_http_gzip_module压缩模块提供对文件内容压缩的功能
允许Nginx服务器将输出内容在发送客户端之前进行压缩,以节约网站带宽,提升用户的访问体验,默认已经安装,可在配置文件中加入相应的压缩功能参数对压缩性能进行优化

修改/usr/local/nginx/conf/nginx.conf配置文件

http {
...... 
   gzip on;							#取消注释,开启gzip压缩功能
   gzip_min_length 1k;      		#最小压缩文件大小
   gzip_buffers 4 64k;      		#压缩缓冲区,大小为4个64k缓冲区
   gzip_http_version 1.1;   		#压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
   gzip_comp_level 6;       		#压缩比率
   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;		#压缩类型,表示哪些网页文档启用压缩功能
...... 
}

 favicon.ico表示的是网站的小图标,这里是没有的,与nginx的配置没有关系

六、nginx性能优化之设置keepalive超时时间以及最大请求连接数

HTTP有一个KeepAlive模式,它告诉web服务器在处理完一个请求后保持这个TCP连接的打开状态。若接收到来自同一客户端的其它请求,服务端会利用这个未被关闭的连接,而不需要再建立一个连接。KeepAlive 在一段时间内保持打开状态,它们会在这段时间内占用资源。占用过多就会影响性能。

keepalive_timeout
指定KeepAlive的超时时间(timeout)。
指定一个长连接最多可以保持多长时间,服务器将会在这个时间后关闭连接。 
Nginx的默认值是65秒,有些浏览器最多只保持 60 秒,所以可以设定为 60 秒。
若将它设置为0,就禁止了keepalive 连接。

第二个参数(可选的)指定了在响应头Keep-Alive:timeout=time中的time值。
这个头能够让一些浏览器主动关闭连接,这样服务器就不必去关闭连接了。
没有这个参数,Nginx 不会发送 Keep-Alive 响应头。


client_header_timeout
客户端向服务端发送一个完整的 request header 的超时时间。
如果客户端在指定时间内没有发送一个完整的 request header,Nginx 返回 HTTP 408(Request Timed Out)。


client_body_timeout
指定客户端与服务端建立连接后发送 request body 的超时时间。
如果客户端在指定时间内没有发送任何内容,Nginx 返回 HTTP 408(Request Timed Out)。
##ip数据包在传输的时候会进行分片,会让数据包分开传输 等到接收端接收后,会重新组合数据包,也就是说数据分片以后到达的时间是不一样的。这里就是限制整个数据包完整传输的最大时间限制

 测试一下:

 一般客户端小于等于服务端时间,因为大量的timewait会占用tcp连接资源,想要timewait在客户端产生,这样可以避免浪费服务端的tcp连接请求资源

##解决方式

服务器不要主动关闭,让客户端去主动关闭,那么timewait状态就在客户端
另一种是修改内核参数,去收回timewait资源,以及允许timeout的socket可以重用

七、nginx性能优化之设置页面缓存时间

设置缓存的时间,以方便客户在后面访问相同的数据请求,避免重复的请求,加快数据访问,可以减少服务器的带宽请求,一般只对静态资源做缓存时间设置,动态页面不设置缓存,静态页面会在nginx服务器中定时更新,但是动态页面是数据库实时更新;

##设置静态资源在客户端的缓存时间        
        location ~ \.(jpg|gif|mp3|mp4)$ {
            root   html/static;
            expires 1h;  #expires的意思是到期
        }
        
缓存时间也是可以在三个地方设置,分别是http server location
Expires就是用于设置缓存时间,支持天d 小时h 分钟m 秒s

 缓存时间也是可以在三个地方设置,分别是http server location

八、nginx安全之隐藏版本号

第一种:直接使用server_tokens off关闭版本号

##在server模块中添加  server_tokens off;

方法二:修改nginx的源代码的nginx.h文件,这些文件一般都是函数等等

 

 然后重新编译安装后测试

##修改nginx的源代码  进行重新编译安装
vim /opt/nginx-1.24.0/src/core/nginx.h
 12 #define nginx_version      1024000
 13 #define NGINX_VERSION      "2.36.7"
 14 #define NGINX_VER          "Apache/" NGINX_VERSION
 
修改完以后 重新编译安装
nginx -V
 ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
nake -j4
make install 
cd /usr/local/nginx/conf/
vim nginx.conf
#server_tokens off;##注释这个模块,让其默认开启
nginx -t
systemctl restart nginx

方法三:使用模块插件,实现响应请求头直接自定义删除

 需要下载模块插件 然后进行重新配置编译安装,再去修改配置文件

./configure --add-module='模块路径' 

下载一个模块插件 可以自定义请求头的内容
headers-more-nginx-module-0.34.tar.gz 插件包,解压到一个目录,编译安装 nginx, ./configure --add-module='模块路径' && make && make install
##如./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --add-module='/opt/headers-more-nginx-module-0.34' && make && make install

修改 nginx.conf 文件,在 http 配置块加   more_clear_headers '响应头字段'; 
##在http模块下添加
        more_clear_headers "Server"; ##注意大小写
表示完全隐藏该响应的请求头

即可去除 nginx 响应头任何想去除的字段  

九、nginx安全之修改进程运行的属主和属组

主进程由root创建,子进程由nginx创建

这个一般在配置模块的时候就已经设置了
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module

还有一种就是修改配置文件中的user

 

十、nginx安全之防盗链设置,避免资源盗用以及节省带宽

先准备测试环境

主服务器192.168.20.30,这是域名解析为www.accp.com
关于accp的测试文件
[root@localhost html]#cat accp.html 
<head></head>
<body>
<h1>I am accp</h1>
<img src="test.jpg">  ##引用自己站点的图片
</body>

 另一台nginx服务器作为想要盗用的web服务器,先部署环境

这台服务器的ip是192.168.20.8,对应域名是www.benet.com
[root@localhost html]#cat daotu.html 
<head></head>
<body>
<h1>this is a daotu</h1>
<img src="http://www.accp.com/test.jpg">   ##盗图   
</body>

现在想要实现不允许盗图

使用rewrite模块 重写url 来实现防盗链

主服务器accp的配置,设置防盗链:
						location ~ \.(jpg|gif|mp3|mp4)$ {
            root   html/static;
            valid_referers none blocked www.accp.com *.accp.com;
            if ($invalid_referer) {
            rewrite ^/ http://www.accp.com/static/error.png;
        }
        }
同时需要准备一张error.png图片放在html/static中
同时,该图片的格式png 不能出现在location的匹配中,否则会死循环,浪费资源

~* \.(jpg|gif|swf)$ :这段正则表达式表示匹配不区分大小写,以.jpg 或.gif 或.swf 结尾的文件;
valid_referers :设置信任的网站,可以正常使用图片;
none:允许没有http_refer的请求访问资源(根据Referer的定义,它的作用是指示一个请求是从哪里链接过来的,如果直接在浏览器的地址栏中输入一个资源的URL地址,那么这种请求是不会包含 Referer 字段的)
blocked:允许不是http://开头的,不带协议的请求访问资源; 
*.kgc.com:只允许来自指定域名的请求访问资源,如 http://www.kgc.com

if语句:如果链接的来源域名不在valid_referers所列出的列表中,$invalid_referer为true,则执行后面的操作,即进行重写或返回 403 页面。

关于valid_referer 

如果是
http://www.accp.com/zip.html www.accp.com/zip.html ---> www.accp.com/test.jpg
那么:$valid_referer 就是www.accp.com/zip.html
如果是
http://www.accp.com/test.jpg --->直接访问
那么:$valid_referer 就是none 空
如果是
http://www.benet.com/daotu.html www.benet.com/daotu.html ---> www.accp.com/test.jpg
那么:$valid_referer 就是www.benet.com/daotu.html
 

进行结果验证

 

关于电脑真机中如何设置ip与域名的映射关系 

文件修改的时候进入属性——安全——编辑(指定当前用户)有写入的权限,及时修改 及时撤回!!!

十一、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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通俗易懂,什么是.NET Core以及.NET Core能做什么

我们都知道.NET Core是一个可以用来构建现代、可伸缩和高性能的跨平台软件应用程序的通用开发框架。可用于为Windows、Linux和MacOS构建软件应用程序。与其他软件框架不同&#xff0c;.NET Core是最通用的框架&#xff0c;可用于构建各种软件&#xff0c;包括Web应用程序、移动…

HLS实现图像膨胀和腐蚀运算--xf_dilation和xf_erosion

一、图像膨胀和图像腐蚀概念 我们先定义&#xff0c;需要处理的图片为二值化图像A。图片的背景色为黑色&#xff0c;即像素值为0。图片的目标色为白色&#xff0c;即像素值为1。 再定义一个结构元S&#xff0c;结构元范围内所有的像素为白色&#xff0c;像素值为1。 1、图像的…

《三十》模块化打包构建工具 Rollup

19的2小时06分钟 Rollup 是一个 JavaScript 的模块化打包工具&#xff0c;可以帮助编译微小的代码到庞大的复杂的代码中&#xff08;例如一个库或者一个应用程序&#xff09;。 Rollup 和 Webpack 的区别&#xff1a; Rollup 也是一个模块化的打包工具&#xff0c;但是它主要…

JUnit 之初体验

文章目录 1.定义2.引入1&#xff09;使用 Maven 工具2&#xff09;使用 Gradle 工具3&#xff09;使用 Jar 包 2.样例0&#xff09;前提1&#xff09;测试类2&#xff09;测试方法3&#xff09;测试断言4&#xff09;实施 总结 1.定义 JUnit 是一个流行的 Java 单元测试框架&a…

精选Axure原型设计模板,RP原型组件库(PC端移动端元件库及Axure函数及运算符说明)

好的原型组件会大大的提高产品经理的工作效率&#xff0c;小7在陆续整理、精选Axure 8的原型设计模板&#xff0c;包含了原型设计的常用元素和AxureRP 8函数及运算符的说明文档&#xff0c;及各种设备模板框架。 本文也是基于小7另一篇文章的补充&#xff0c;更多更详细的资料…

C++编程法则365天一天一条(24)RTTI运行时类型信息typeid和type_info

文章目录 基本用法编译时或运行时判定 基本用法 typeid 是 C 的一个运算符&#xff0c;它用于获取表达式的类型信息。它返回一个 std::type_info 对象引用&#xff0c;该对象包含有关表达式的类型的信息。 要使用 typeid 运算符&#xff0c;需要包含 <typeinfo> 头文件…

FPGA 低延时 TCP UDP IP协议栈兼容1G 10G 25G MAC

在计算和数据中心、军事和航天、政府、仪器与测量、金融服务和广播和视频等行业&#xff0c;需要高可靠性的硬件和软件产品&#xff0c;帮助客户更快地开发部署新一代产品&#xff0c;减少技术和市场风险&#xff0c;我司研发的低延迟TCP/IP的IP核的传输速率高于传统网口&#…

二十一章总结

网络程序设计基础 局域网与互联网 为了实现两台计算机的通信&#xff0c;必须用一个网络线路连接两台计算机。如下图所示 网络协议 1.IP协议 IP是Internet Protocol的简称&#xff0c;是一种网络协议。Internet 网络采用的协议是TCP/IP协议&#xff0c;其全称是Transmission…

Nginx基础篇:Nginx搭建、Nginx反向代理、文件服务器部署配置。

Nginx Linux系统安装以及反向代理的配置 简介优点nginx 环境安装常用Nginx 命令nginx 文件服务器搭建 简介 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点…

AI:94-基于深度学习的微小目标检测与定位

🚀 本文选自专栏:人工智能领域200例教程专栏 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的核心代码,详细讲解供大家学习,希望可以帮到大家。欢迎订阅支持,正在不断更新…

目标检测、目标跟踪、重识别

文章目录 环境前言项目复现特征提取工程下载参考资料 环境 ubuntu 18.04 64位yolov5deepsortfastreid 前言 基于YOLOv5和DeepSort的目标跟踪 介绍过针对行人的检测与跟踪。本文介绍另一个项目&#xff0c;结合 FastReid 来实现行人的检测、跟踪和重识别。作者给出的2个主…

Dantzig-Wolfe分解

参考资料&#xff1a;Introduction to Linear Programming&#xff0c; Dimitris Bertsimas etc 这篇博客是个人笔记的电子版(●ˇ∀ˇ●)&#xff0c;希望之后的自己也能看懂吧 在这本教材的Dantzig-Wolfe分解章节中&#xff0c;作者主要列举了两个小例子&#xff0c;结合坐标…

深入理解Os--调用劫持

1.调用劫持 以Linux系统为例&#xff0c;介绍三种可实现调用劫持的技术。 1.1.编译时调用劫持 以一个实例展开介绍 (1).main.cpp #include <stdio.h> #include <malloc.h> int main() {int* p (int*)malloc(32);free(p);return (0); }(2).mymalloc.cpp #inclu…

30、卷积 - 参数 stride 的作用

在卷积运算中,还有一个参数叫做 stride,它对卷积的运算以及运算结果影响也很大。 还是先看卷积动图,从图上你能猜到 stride 参数在哪吗? 在卷积操作中,stride 指的是卷积核在滑动过程中每次跳过的像素数量。 stride 决定了卷积核在输入图像上移动的速度。例如,如果 str…

【Angular 开发】Angular 信号的应用状态管理

自我介绍 做一个简单介绍&#xff0c;年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【架构…

STM32基于USB串口通信应用开发

✅作者简介&#xff1a;热爱科研的嵌入式开发者&#xff0c;修心和技术同步精进&#xff0c; 代码获取、问题探讨及文章转载可私信。 ☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。 &#x1f34e;获取更多嵌入式资料可点击链接进群领取&#xff0c;谢谢支持&#xff01;…

使用selenium的edge浏览器登录某为

互联网上基本都是某哥的用法&#xff0c;其实edge和某哥的用法是一样的就有一下参数不一样。 一、运行环境 Python&#xff1a;3.7 Selenium&#xff1a;4.11.2 Edge&#xff1a;版本 120.0.2210.61 (正式版本) (64 位) 二、执行代码 from time import sleepfrom selenium…

Course2-Week4-决策树

Course2-Week4-决策树 文章目录 Course2-Week4-决策树1. 决策树的直观理解2. 构建单个决策树2.1 熵和信息增益2.2 构建决策树——二元输入特征2.3 构建决策树——多元输入特征2.4 构建决策树——连续的输入特征2.5 构建回归树——连续的输出结果(选修)2.6 代码实现-递归构建单个…

基于K-means与CNN的遥感影像分类方法

基于K-means与CNN的遥感影像分类 一、引言 1.研究背景 航天遥感技术是一种通过卫星对地观测获取遥感图像信息数据的技术&#xff0c;这些图像数据在各领域都发挥着不可或缺的作用。遥感图像分类主要是根据地面物体电磁波辐射在遥感图像上的特征&#xff0c;判断识别地面物体的属…

BUUCTF pwn rip WriteUp

文件分析 下载附件&#xff0c;分析文件 可以看到是64位ELF文件&#xff0c;elf可以理解为Linux中的可执行文件&#xff0c;就像Windows中的exe文件 用ida打开文件 查看main函数的伪代码&#xff0c;可以看到有一个15位的字符数组&#xff0c;该数组通过gets函数传值 还有一…