解决 CentOS8 下 Nginx 莫名崩溃,服务器错误500

1 浏览发布于 作者 zouyang留下评论分享按钮

服务器报错 500,无法访问

一、我发现了2个报错:

1、php 错误日志里是:

WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 16 children, there are 3 idle, and 14 total children

2、重启后 执行 dmesg 命令来查看开机信息,发现有:

Out of memory: Killed process 975 (mysqld) …………

进而使用 top 命令来查看 Linux 系统当前运行状况,发现剩余内存确实很低,只有几十兆了。继续查看 top 命令展示出来的进程,发现 mysqld 占用内存达到了整个内存的近50%。

二、解决办法:

1、修改 pm.min/max 等等配置,如何操作可自行谷歌百度翻文档。命令行执行:

vim /etc/php-fpm.d/www.conf

然后键盘按 i ,进入编辑模式,找到配置 pm 的那里,将各个关于pm的配置进行修改,修改好了键盘直接按 ESC ,输入 :wq,回车,就会保存并退出了。

pm:表示使用那种方式,有两个值可以选择,就是 static(静态)或者 dynamic(动态)。
在更老一些的版本中,dynamic 被称作 apache-like。这个要注意看配置文件的说明。
我设置的是 dynamic。
如果dm设置为static,那么其实只有pm.max_children这个参数生效。系统会开启参数设置数量的php-fpm进程。
如果dm设置为dynamic,4个参数都生效。

参数的意思分别为:

  • pm = dynamic 如何控制子进程,选项有static和dynamic
  • pm.max_children: 静态方式下开启的php-fpm进程数量(填写 阿拉伯数字)
  • pm.max_requests: php-fpm子进程能处理的最大请求数
  • pm.start_servers: 动态方式下的起始php-fpm进程数量
  • pm.min_spare_servers:动态方式下的最小php-fpm进程数
  • pm.max_spare_servers:动态方式下的最大php-fpm进程数量

上面的数值具体设置为多少,得根据服务器的配置来设置。
一般来说一台服务器正常情况下每一个 php-cgi 所耗费的内存在20M~30M左右。也就是说 上面配置的数值*20 或者 数值*30,就得到占用的内存量,比如”max_children”我设置成40的话,20M*40=800M,也就是说在峰值的时候所有 PHP-CGI 所耗内存在 800M 以内。所以,我们需要根据自己服务器内存的大小来决定怎么配置。

对于内存大的服务器(比如8G以上)来说,指定静态的max_children实际上更为妥当,因为这样不需要进行额外的进程数目控制,会提高效率。因为频繁开关php-fpm进程也会有时滞,所以内存够大的情况下开静态效果会更好。

对于小内存的服务器来说,比如256M内存的VPS,即使按照一个20M的内存量来算,10个php-cgi进程就将耗掉200M内存,系统的崩溃很容易发生了。

因此应该尽量地控制php-fpm进程的数量,大体明确其他应用占用的内存后,
给它指定一个静态的小数量,会让系统更加平稳一些。或者使用动态方式,
因为动态方式会结束掉多余的进程,可以回收释放一些内存,所以推荐在内存较少的服务器或VPS上使用。具体最大数量根据 内存/30M 得到。

2、解决 mysqld 占用内存过高

我的 Nginx mysql 配置修改路径是:

vim /etc/my.cnf.d/mysql-server.cnf

加上一句配置:performance_schema = OFF 关闭用于收集和监控 数据库服务器性能参数的配置

效果立竿见影,内存占用直接降低到百分之十几。

至此完美解决500报错。

想要打赏,请点击这里

发表评论

电子邮件地址不会被公开。 必填项已用*标注