如何面對你—LNMP高併發時502

問題:最近的搶購有點火,到點搶購的時候網站就會出現502錯誤 頂不住消費者的壓力。

wKioL1Q7oo-QGbd2AABLUqUU51U912.jpg傷。。。。。

之前php-fpm配置:

單個php-fpm實例,使用socket方式,內存8G 靜態方式,啓動php-fpm進程數300,具體參數如下

listen = /tmp/php-cgi.sock
#listen = 127.0.0.1:9000
listen.backlog = 2048
listen.allowed_clients = 127.0.0.1
pm = static
pm.max_children = 300
pm.start_servers = 50
pm.min_spare_servers = 30
pm.max_spare_servers = 250
request_terminate_timeout = 0
request_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來處理請求。

具體操作:

cp php-fpm.conf php-fpm2.conf
vi php-fpm2.conf 做相應的修改
[global]
pid = /usr/local/php/var/run/php-fpm2.pid
error_log = /usr/local/php/var/log/php-fpm2.log
log_level = notice
[www]
listen = /tmp/php-cgi2.sock
#listen = 127.0.0.1:9000
listen.backlog = 2048
listen.allowed_clients = 127.0.0.1
pm = static
pm.max_children = 200
pm.start_servers = 50
pm.min_spare_servers = 30
pm.max_spare_servers = 250
request_terminate_timeout = 0
request_slowlog_timeout = 2
slowlog = var/log/slow.log
cp /etc/init.d/php-fpm /etc/init.d/php-fpm2  
vi  /etc/init.d/php-fpm2 
修改
prefix=/usr/local/php
exec_prefix=${prefix}
php_fpm_BIN=${exec_prefix}/sbin/php-fpm
php_fpm_CONF=${prefix}/etc/php-fpm2.conf
php_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處理多少時間,都是開發者需要考慮的點。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章