一, 案例分析.
我们可以想到, 既然是访问缓慢, 有时候直接访问不了, 以前是没问题的, 到现在就突然出现了问题, 那必定是我们的 nginx 与 php 响应不过来导致的, 原因可能是其他域名网站的用户连接数巨增导致的. 那我们找到问题的根源解决并优化就可以了. 接着凭着自己的经验与百度, 去解决问题.
二, 问题解决与过程分析
1,Nginx 优化:
1, 查看 nginx 的日志, 找出错误
- $ cat /usr/local/nginx/logs/error.log | grep error
- 1.png
没发现错误, 正常
查看后台域名的 access.logs
- $ cat /var/log/access_nging.log | grep error
- (这里没及时截到图, 日志是被刷了, 本地做了日志切割, 并定时删除了)
发现日志日志里面可以找到 error 错误信息, 并且有十几个 502 错误. 找到出现的问题了.
2, 问题分析以及 nginx 优化
1,nginx 打开文件数限制导致的.
1), 首先我们想到可能的原因 nginx 的打开文件书的问题, 增加 nginx 的打开文件数
进入 nginx 配置文件, 发现打开文件数为 4096, 果不其然, 打开文件数没有调到最佳, 可能是这个原因导致的. 我们需要把 4096 改为 51200; 保存重新加载 nginx
- vim /usr/local/nginx/conf/nginx.conf
- worker_rlimit_nofile 51200;
- events {
- worker_connections 51200;
- }
- #service nginx relaod
2),Linux 系统文件限制
我们改了 nginx 的打开文件配置, 不一定有用, 我们需要看一下系统的限制的打开文件数
ulimit -n
2.png
我们可以看到系统的文件打开数量也是 4096, 接下来, 我们更改一下系统的打开文件数, 并配置永久生效.
进入配置文件
vim /etc/security/limits.conf
更改参数:
- soft nofile 65535
- hard nofile 65535
- soft nproc 65535
- hard nproc 65535
注: 系统限制可以随便改, 我只要比 nginx 的打开文件数大就好.
3,nginx 的 fastcgi 连接时间太短导致的.
一般 nginx 响应 php, 都是通过 FastCGI 接口来调用, 所以 fastcgi 参数配置很重要, 当 HTTP 服务器每次遇到动态程序时, 可以将其直接交付给 FastCGI 进程来执行, 然后将得到的结果返回给浏览器, 而很多 php 的网页都是采用动态程序. 所以 fastcgi 的配置, 也起的至关重要的作用. 所以这是一个优化不可缺少的一部分.
进入 nginx.conf 配置文件
vim /usr/local/nginx/conf/nginx.conf
把 fastcgi 的 connect,send,read 的参数的时间改成 300, 配置如下:
3.png
重新加载 nginx
#service nginx reload
4, 访问域名测试.
重新访问域名, 发现网页已经加载出来了, 持续访问了几次, 发现访问还是有点慢, 虽然访问稳定了. 到这里, 我们就可以把问题指向到 php 里面了, 继续下一步的 php 优化.
2,Php 优化:
1, 查看 php 日志
首先, 我们需要跟 nginx 的操作一样, 需要先查看一下日志.
- #tail -n 100 /usr/local/php/var/log/php-fpm.log
- 4.png
在日志里面我们可以发现, php 日志出现警告
WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers)
从告警的意思, 我们知道 php 出现告警了, 而且是叫我们增加 php 的, pm.start_servers, or pm.min/max_spare_servers 的值.
2, 原因分析
首先我们, 看到日志只是出现这个警告, 证明还不是很严重, 至于为什么出现这个警告, 接下来我们一起分析一下.
首先我们很明确的知道, pm.start_servers,,pm.min/max_spare_servers 在 php 里面是起着啥作用先, 为什么会出现这个警告. 我先把的以前的配置参数贴一下.
5.png
接下来我们分析一下这几个参数的作用:
参数分析:
pm= dynamic 表示 php 启用的动态模式 注: php 有动态和静态 (static) 两种工作模式, 默认是动态模式.
pm.max_children 表示静态下最大线程数
pm.start_servers 表示动态下启动时的线程数, 该参数大于 pm.min_spare_servers, 小于 pm.max_spare_servers
pm.min_spare_servers 表示动态下最小空闲线程数
pm.max_spare_servers 表示动态下最大空闲线程数
工作模式:
Static 模式
当工作模式设置为静态后, 就只有 pm.max_children 项有效, 即表示 php-fpm 工作时一直保持的线程数.
Dynamic 模式
动态模式下, 与他相关的参数有 pm.start_servers,pm.min_spare_servers ,pm.max_spare_servers, 分别表示开启的 php 进程数, 最小的进程数, 与最大的进程数.
模式比较:
静态模式的话, 比较适合一些内存比较大一点的服务器, 8G 及以上的, 因为对于比较大内存的服务器来说, 设置为静态的话会提高效率.
动态模式适合小内存机器, 灵活分配进程, 省内存. 可以让 php 自动增加和减少进程数, 不过动态创建回收进程对服务器也是一种消耗.
3,php 参数优化
首先我们需要考虑一下问题, 如何去调试参数, 达到优化的目的呢, 一般来说开始的时候一个 php-fpm 进程只占用 3M 左右内存, 但是运行一段时间后就会上升到 20-40M, 这是因为 PHP 程序在执行完成后, 或多或少会产生内存的泄露.
所以按理来说 php 的最大的进程数, 大概是本地内存 / 40, 因为也要考虑系统占用内存的的这种情况, 我们不能直接把除处理的结果, 当成的最大进程数, 不然你会死翘翘的.
我的服务器是 8G 内存的, 所以按理来说是, 最大的 php 进程数是 200 左右, 所以按这个参数我做了一下调整:
6.png
采用静态模式, 最大进程数设为 125-150 之间, 搞定.
重新加载 php
#service php-fpm relod
查看进程数:
- netstat -anpo | grep php-fpm | wc -l
- 128
效果达到了
来源: http://www.bubuko.com/infodetail-2729701.html