如何面对你—LNMP高并发时502
問題:最近的搶購有點火,到點搶購的時候網站就會出現502錯誤 頂不住消費者的壓力。
傷。。。。。
之前php-fpm配置:
單個php-fpm實例,使用socket方式,內存8G 靜態方式,啟動php-fpm進程數300,具體參數如下
| 1234567891011 | listen?=?/tmp/php-cgi.sock#listen?=?127.0.0.1:9000listen.backlog?=?2048listen.allowed_clients?=?127.0.0.1pm?=?staticpm.max_children?=?300pm.start_servers?=?50pm.min_spare_servers?=?30pm.max_spare_servers?=?250request_terminate_timeout?=?0request_slowlog_timeout?=?2 |
由于架構,代碼等原因,單臺幾百并發就出現502錯誤。
初步解決:各種相關優化,
增大pm.max_children為400
nginx和fpm 添加了 listen.backlog = 2048
最大打開文件句柄數 65535
/etc/sysctl.conf 都進行了微調,高并發時nginx發起的連接數,遠遠超過了php-fpm所能處理的數目,導致端口(或socket)頻繁被鎖,造成堵塞。依然出現502錯誤?
終極解決方法:
啟用兩個php-fpm實例,把php-fpm分為兩部分,每部分各聽一個端口或socket,這樣就減少了lock,依然保持400個php-fpm進程,每個實例啟用200個,采用nginx的upstream負載均衡,輪詢每個socket來處理請求。
具體操作:
| 123456789101112131415161718192021222324252627 | cp?php-fpm.conf?php-fpm2.confvi?php-fpm2.conf?做相應的修改[global]pid?=?/usr/local/php/var/run/php-fpm2.piderror_log?=?/usr/local/php/var/log/php-fpm2.loglog_level?=?notice[www]listen?=?/tmp/php-cgi2.sock#listen?=?127.0.0.1:9000listen.backlog?=?2048listen.allowed_clients?=?127.0.0.1pm?=?staticpm.max_children?=?200pm.start_servers?=?50pm.min_spare_servers?=?30pm.max_spare_servers?=?250request_terminate_timeout?=?0request_slowlog_timeout?=?2slowlog?=?var/log/slow.logcp?/etc/init.d/php-fpm?/etc/init.d/php-fpm2??vi??/etc/init.d/php-fpm2?修改prefix=/usr/local/phpexec_prefix=${prefix}php_fpm_BIN=${exec_prefix}/sbin/php-fpmphp_fpm_CONF=${prefix}/etc/php-fpm2.confphp_fpm_PID=${prefix}/var/run/php-fpm2.pid |
啟動php-fpm2即可
配置nginx
編輯nginx.conf 主配置文件,如果后端采用虛擬主機,跟我一樣,
添加
upstream backend{
? ? ? ? ? ? ? server unix:/tmp/php-cgi.sock;
? ? ? ? ? ? ? server unix:/tmp/php-cgi2.sock;
? ? ? ? ? ? ? ? }
vi vhost/test.conf
修改此處 fastcgi_pass ?backend; 調用fastcgi是,使用負載均衡的方式。
location ~ [^/]\.php(/|$)
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? try_files $uri =404;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? fastcgi_pass ?backend;
? ? ? ? ? ? ? ? ? ? ? ? # ? ? ? fastcgi_pass ?127.0.0.1:9000;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? fastcgi_index index.php;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? include fastcgi.conf;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# include pathinfo.conf;
? ? ? ? ? ? ? ? ? ? ? ? }
重啟nginx。
等待驗證吧,502錯誤會大大地減少,網站搶購甚歡,消費者甚歡。
總結:
高并發時使用tcp端口的方式比socket方式相對穩定一點,但是使用端口的方式,處理的效率確實比socket效率低了那么一點。LNMP環境下,在面對高并發時,除了一個合理的架構,與合理的調優之外,開發者的代碼邏輯與高效的代碼也是影響高并發的一個重要因素。一個請求調用多少次php-fpm,每個php-fpm處理多少時間,都是開發者需要考慮的點。
本文出自 “章小魚兒_linux” 博客,請務必保留此出處http://zhangxylinux.blog.51cto.com/5041623/1563427
轉載于:https://blog.51cto.com/ss991/1564629
總結
以上是生活随笔為你收集整理的如何面对你—LNMP高并发时502的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux定时任务crontab
- 下一篇: Subversion客户端认证凭证缓存总