导读:

最近网站使用的用户增加了不少,带来的最大问题就是高并发,Apahce服务器直接崩溃了,并不是说我的服务器性能太差,而是因为Linux宝塔面板默认的设置参数不合适,导致资源不能充分利用。

1、高并发场景建议使用Nginx服务器,Nginx的设置比较简单,而且可以单独设置某个站点的并发数量,非常人性化。 

2、通过查看网站日志发现,我的Apahce服务器之所以崩溃,并非是正常用户并发访问导致,而是有人对我的网站进行了CC攻击,大量的代理IP并发访问,才导致Apahce崩溃。

3、我更换为Nginx服务器,又安装了免费的OpenRASP管理器和免费版Nginx防火墙,CC攻击已经成功拦截。

一、设置 Swap 虚拟内存

swap 是 Linux 系统的虚拟内存,客户访问网站实际是通过内存执行,云服务器内存有限,大流量访问会导致内存不足。为解决该问题,当物理内存不足时,系统就会自动调用硬盘来充当内存,以弥补内存的紧缺,这就是虚拟内存的作用。现在的云服务器大多都是 kvm 虚拟架构的,开启虚拟内存就更有必要( OVZ虚拟架构机器不可用此功能 )。当然如果内存32G以上就不用考虑开启 swap 了。

开启方法:

【 软件商店 】安装Linux 工具箱,然后在 Linux 工具箱窗口点击左侧的【 Swap/虚拟内存 】,填写 Swap 虚拟内存 大小,然后点击【确定】。宝塔官方建议 swap 容量在真实内存容量的1.5倍左右,若您的服务器内存大于4GB,可设 1-2GB 的固定值。(1GB=1024MB)

二、添加计划任务释放内存

释放内存就是将驻留在内存中的数据从内存中释放出来,提高内存资源的利用率,提升云服务器性能。宝塔面板已经考虑到了内存释放的问题,可以添加内存释放计划任务,让服务器每天或每周释放一次,释放PHP、MYSQL、PURE-FTPD、APACHE、NGINX的内存占用,建议在每天半夜执行,间隔时间根据自己网站的用户量及内存占用百分比来定。

释放方法:

宝塔面板点击左侧导航的【 计划任务 】,选择任务类型为释放内存,根据自己需要设置执行周期和执行时间,然后点击确定即可。

 三、Linux宝塔面板Apache性能调整

查看apache当前工作模式:httpd -V或者apachectl -V | grep -i mp

prefork模式下,影响并发性能最重要的参数就是MaxRequestWorkers,它决定了apache的并发处理能力。但是这个参数不是越大越好,因为如果超出了系统硬件能力,机器会卡死。

要如何确定合适的MaxRequestWorkers数值呢?

可以通过top命令查看apache进程占用的资源,主要看%CPU和%MEM这两个指标,例如,每个进程的CPU占用率不超过1%,每个进程的内存占用率不超过2%,考虑内存限制,比较合适的apache进程数量为50个。

然后,逐步测试最大值。通过观测得来的CPU和内存的指标有一定的误差,一般可以适当调节这个数值,例如调到1.5或者2倍,再通过峰值场景下的机器是否卡顿来判断是继续上调还是下调。

1、Apache三种模式

prefork MPM

prefork是比较古老而又稳定的apache模式,特点是每个进程都是单线程,在一个时间点只能处理一个连接,需要启动大量的进程来处理高并发的请求。由于是单线程进程,因而无须考虑线程安全的问题,可以使用非线程安全的库,例如mod_php。

优点是成熟稳定,缺点是比较消耗内存,而且并发支持受限于进程数量,对高并发支持稍差。

worker MPM

worker同样使用多个进程,但每个进程又拥有多个线程,每个线程处理一个连接。由于线程是轻量级的,因而具有较高的并发性,同时,多个进程又获得了一定的稳定性。worker模式特点是占用内存少,并发性比较高,缺点是必须考虑线程安全。如果使用了keep-alive方式,一个线程可能会被一直保持一个连接,但中间没有请求,直到超时。如果有多个线程被这样占据,在高并发场景下同样会出现无线程可用的情形。

event MPM

event模式是在2.4版本中才稳定发布的模式,它在worker的基础上,解决了keep-alive连接不能释放的问题。event MPM中,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力。

2、Apache参数设置

imeout
请求的超时时间

KeepAliveTimeout
长连接超时时间,默认5秒,打开长连接后则要达5秒后才会断开

MaxKeepAliveRequests
长连接最大请求数量,默认100 ,即请求在5秒内达到100次请求后会断开

KeepAlive
是否打开长连接,如果没有打开长连接,那么请求完成后连接就立即被服务器给断开了。打开长连接后则要达到默认超时时间15秒或者请求在15秒内达到100次后才会断开

StartServers
设置Apache启动时运行的进程数,默认值5,若存在低于5个空闲子进程,就创建一个新的子进程准备为客户提供服务

MaxSpareServers
最大进程数量,默认值10,若存在高于10个空闲子进程,就创建逐一删除子进程来提高系统性能

MaxRequestsPerChild
最大请求数,默认值0,即无限大
注意:如果请求超过此连接数,服务器就会释放之前的内存占用,默认0,则内存永远不会被释放,将会造成apache停止

MaxClients
同一时间最大连接数,默认值150,限制同一时间的连接数不能超过150

所有配置根据服务器内存配置,内存为1G/2G的小内存机器,请适当降低数值以确保apache稳定运行

ThreadsPerChild

用于设置每个进程的线程数,其上限值为ThreadLimit,子进程在启动时建立这些线程后就不再建立新的线程了。一方面因为mpm_winnt不能启动多个进程,所以这个数值要足够大,以便可以处理可能的请求高峰;  另一方面该参数以服务器的响应速度为准的,数目太大的反而会变慢,因此需要综合均衡一个合理的数值。

mpm_winnt工作模式下,ThreadsPerChild的默认值是64,最大值是1920,这里建议设置为100-500之间。修改了ThreadsPerChild后可以通过重启apache来生效,但是修改了ThreadLimit只能先停止,然后启动。

MaxRequestWorkers

用于设置服务器同时处理的最大连接数,即表示apache的最大请求并发能力,如果超过所设置的值,那么就会出现排队的现象,最大排队值是由 ListenBacklog指令来设置,在排队过程中,只有当一个请求结束后才会释放出子进程给其它的连接服务使用。

MaxConnectionsPerChild

设置单个子进程(子服务)最多可以处理的连接数。如果子进程伺服的连接数达到这个最大值,那么该子进程就会被杀掉。如果将MaxConnectionsPerChild的值设置为 0,那么表示该子进程可以处理无限多个连接数(进程将永不过期)。将MaxConnectionsPerChild为非零的值,可以限制由于(偶然)内存泄漏导致进程消耗太多内存量的问题。

将MaxRequestsPerChild设置成非零值有两个好处:

  1. 可以防止(偶然的)内存泄漏无限进行,从而耗尽内存。
  2. 给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。

工作方式:一个单独的控制进程(父进程)负责产生子进程,这些子进程用于监听请求并作出应答。Apache总是试图保持一些备用的 (spare)或者是空闲的子进程用于迎接即将到来的请求。这样客户端就不需要在得到服务前等候子进程的产生。在Unix系统中,父进程通常以root身份运行以便邦定80端口,而 Apache产生的子进程通常以一个低特权的用户运行。User和Group指令用于设置子进程的低特权用户。运行子进程的用户必须要对它所服务的内容有读取的权限,但是对服务内容之外的其他资源必须拥有尽可能少的权限。 

四、使用PHP 缓存扩展

常用的 PHP缓存插件有 Opcache 脚本缓存、Memcached 缓存和 redis 内容缓存。我们可以通过安装缓存插件来提升服务器的运行效率。缓存插件安装完成后,网站也需要进行相应的缓存配置,一般在站点文件的配置文件中修改,使用缓存可以有效减轻数据库查询压力,也可以提升网站的访问速度。

opcache、xcache、apc 等脚本缓存扩展,建议只安装其中一个,否则可能导致您的站点程序异常。但是 Memcached 和 redis 这两个内容缓存我们可以同时安装。切记,缓存扩展也并不是越多越好,凡事都得有个度,超过这个度,反而会拖慢 php 的执行效率。

安装方法:

登录宝塔面板,进入已安装PHP版本的管理界面,在管理界面左侧的【 安装扩展 】,选择您需要的缓存插件进行安装。

 五、php 配置优化和性能调整(并发)

1、部分网站或者系统在运行的时候本身比较耗费内存,memory_limit 用来设置脚本内存的临界点,如果运行过程中脚本内存达到了临界点就会出现报错,但也不是说设置的越大越好,原则上脚本内存的设置不要超过云服务器的物理内存, 否则可能会导致启用磁盘 swap,服务器资源耗尽,最后死机。

配置修改:登录宝塔面板,进入已安装PHP版本的管理界面,在管理界面左侧的【 配置修改 】里,把 memory_limit  脚本内存限制修改成 256M(默认是128M),然后保存即可。

 2、并发量和日访问量是两个概念,所谓并发可以简单理解为同一秒访问网站的客户数量,假设并发设置为50(即每秒同时访问50次),那么 1 分钟就可以有 3000 的访问量。但也不是说并发设置的越大就越好,如果并发数设置过大,被 CC 攻击时服务器宕机挂掉的可能性也十分的高,建议并发数设置不要超过 300 

性能调整:php的并发调整是优化中至关重要的环节,宝塔面板里面自带了几个并发优化方案,一般 4 核 8G 内存的云服务器,设置 30 并发或 50 并发就可以。

 六、MySQL数据库 性能优化

服务器性能开销最大的是数据库开销,通过上述各项优化后,还远远不能承受高并发大流量的站点访问,我们需要对 MySQL 进行性能优化。宝塔面板非常人性化,内置了数据库性能优化方案,我们只需要鼠标轻点即可完成。进行性能一键优化后,保存并重启数据库,然后在当前状态进行观察,根据建议做适当的调整。

设置方法:登录宝塔面板,,进入已安装MySQL版本的管理界面,左侧的 【 性能调整 】,根据您的服务器配置选择优化方案,然后先保存再重启数据库即可。

 七、Session 存储设置

Session 称为会话信息,位于web服务器上,主要负责访问者与网站之间的交互,当访问浏览器请求 http 地址时,将传递到web服务器上并与访问信息进行匹配,宝塔默认 Session 保存在指定的文件夹中,当用户访问时要从文件中检索 Session ID ,效率不高,宝塔面板可以把 Session 存储位置修改到 redis ,提高会话信息检索效率,减少响应时间。

设置方法:

1、软件商店里安装Redis;

2、PHP扩展安装redis插件;

3、打开 redis 设置窗口,再点击 redis 窗口的左侧【性能调整】,在 requirepass 一栏输入密码,这个密码自己设置,越复杂越好,设置完成后复制你设置的密码,然后点击【保存】;

4、打开 php 管理窗口,再点击 php 管理窗口左侧的 【 Session设置 】,存储模式切换成redis,然后在密码位置粘贴上一步复制的密码,然后点击保存。

本文重在于整理和补充,很多东西也是要跟前辈们学习的,参考文章:

https://huoyantu.com/2491.html

http://www.wjhsh.net/amy720-p-12187022.html

https://blog.csdn.net/m0_66264533/article/details/122620769

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐