網站架構簡介:
現在很多的企業都是使用lnmp或lamp來做企業的網站伺服器架構,這兩種網站的服務架構,我們都是比較熟悉的;基於nginx的性能優於Apache,現階段的很多公司,都是逐漸把Apache替換成nginx,畢竟nginx的自帶的高可用配置,反向代理等等功能相當突出。
Lnmp網站伺服器架構,其實就是linx nginx mysql php架構體系,架構安裝我就不多說了。接下來我們來談談,我遇到案例吧
案例:
有一天,後台的同事,說後台訪問很慢,而且有時候出現502錯誤。然後回饋給技術上級,接著又找到我處理一下(那時在喝著茶),然後我知道又有事乾了。
分析:
然後我直接找到那個同事,問問是不是網路原因啊,我也叫其他的同事,訪問一下,還是出現訪問忙的問題。這時我就知道事情沒那麼簡單了。公司應用的是lnmp網站伺服器架構,以前沒有做太多的優化,接下來我們需要優化網站的服務架構了
一、案例分析。
我們可以想到,既然是訪問緩慢,有時候直接訪問不了,以前是沒問題的,到現在就突然出現了問題,那必定是我們的nginx與php響應不過來導致的,原因可能是其他網域網站的用戶連線數大大增加導致的。那我們找到問題的根源解決並優化就可以了。接著憑著自己的經驗與百度,去解決問題。
二、問題解決與流程分析
1、Nginx優化:
1、查看nginx的日誌,找出錯誤
`$` cat `/usr/local/nginx/logs/error.log` | grep `error`
沒發現錯誤,正常
查看後台網域的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
我們可以看到系統的檔案開啟數量也是4096,接下來,我們更改一下系統的開啟檔案數,並配置永久生效。
進入設定檔
vim /etc/security/limits.conf
更改參數:
- ##soft nofile 65535hard nofile 65535soft nproc 65535hard 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,設定如下:
重新載入nginx
service nginx reload
4##、存取網域名稱測試。 重新訪問域名,發現網頁已經加載出來了,持續訪問了幾次,發現訪問還是有點慢,雖然訪問穩定了。到這裡,我們就可以把問題指向php裡面了,繼續下一步的php優化。
2
、Php優化:1
、檢視php日誌首先,我們要跟nginx的操作一樣,需要先查看日誌。
tail -n 100 /usr/local/php/var/log/php-fpm.log在日誌裡面我們可以發現,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, 或 pm.min/max_spare_servers的值。2、原因分析
首先我们,看到日志只是出现这个警告,证明还不是很严重,至于为什么出现源码交易这个警告,接下来我们一起分析一下。
首先我们很明确的知道,pm.start_servers,、pm.min/max_spare_servers在php里面是起着啥作用先,为什么会出现这个警告。我先把的以前的配置参数贴一下。
接下来我们分析一下这几个参数的作用:
参数分析:
· 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左右,所以按这个参数我做了一下调整:
采用静态模式,最大进程数设为125-150之间,搞定。
重新加载php
service php-fpm relod
查看进程数:
netstat -anpo | grep php-fpm | wc -l
`128`
效果达到了
4、结果
重新访问,发现访问php页面快了很多,查看日志,没出现告警了,后台访问也好了。
3、压测
一个网站的性能好不好,承受量有多高,这个我们可以通过压测去,去获取数据,我这里简单介绍ab工具来做压测,用法如下
ab -n 1000000 -c 10000 (一个php文件)
-n参数表示 你压力测试 总量
-c参数表示 你的模拟的并发用户数
Ab压力测试工具,是apache自带的,用起来也方便,只要本地有,就可以远程测你的服务器的性能了。个人觉得还是可以了,下面是模拟一千个用户访问100000次的结果,但然你自己压测的时候,慢慢的提升参数,测试你的网站的瓶颈。