Linux系統上目前主要使用Apache和php-fpm來解析運行PHP Web程序。php-fpm僅支持多進程,Apache支持多進程和多線程,但絕大多數環境中均爲多進程方式,這裏也只討論多進程。php
從實踐來看,單實例最多能夠開到200-300左右的進程,開到500以上就容易出錯了。
每一個進程佔用的內存在5M-15M左右,按平均10M計算,500個進程也只有5G,而如今不少高性能機都是64G甚至128G的內存,這樣單實例是沒法全面使用上內存資源的。
這幾年部署過的多實例環境並很少,由於訪問量不是十分高的話,是用不上的。
上次配置多實例是一個100萬左右PV的Discuz論壇,配置以後是頗有效的。如今作的這個是千萬PV的靜態站,請求主要在點擊計數上,在300和500之間調整進程數仍是會偶爾的掛掉,機器配置是足夠用的,是穩定性的問題。c#
LNMP或者LNAMP環境的配置這裏不作介紹,只講在LNMP環境的基礎上配置多實例的過程。由於我在使用的是LNAMP環境,因此額外編譯一份php到/usr/local/php-fpm/,配置文件在/etc/php-fpm/,並在此基礎上作的筆記。多線程
先修改三個值:
1,以static方式,也就是固定進程數量運行php-fpm。
2,每一個實例創建100個worker進程。(不宜太多,避免不穩定)
3,每一個進程執行完200次請求即退出。(避免PHP的內存泄露問題,也就是內存越用越多)負載均衡
sed -i 's#pm = dynamic#pm = static#' /etc/php-fpm/php-fpm.conf
sed -i 's#pm.max_children = 5#pm.max_children = 100#' /etc/php-fpm/php-fpm.conf
sed -i 's#;pm.max_requests = 500#pm.max_requests = 200#' /etc/php-fpm/php-fpm.confide
如下爲複製php-fpm.conf和php-fpm服務管理腳本的命令php-fpm
cd /etc/php-fpm/
cp php-fpm.conf php-fpm-1.conf
sed -i 's#listen = 127.0.0.1:9000#listen = 127.0.0.1:9001#' php-fpm-1.conf
sed -i 's#\[www\]#\[php-fpm-pool-1\]#' php-fpm-1.conf
sed -i 's#pid = run/php-fpm.pid#pid = run/php-fpm-1.pid#' php-fpm-1.conf
cd /etc/init.d/
cp php-fpm php-fpm-1
sed -i 's#/etc/php-fpm/php-fpm.conf#/etc/php-fpm/php-fpm-1.conf#' php-fpm-1
sed -i 's#/var/run/php-fpm.pid#/var/run/php-fpm-1.pid#' php-fpm-1
service php-fpm-1 restart性能
執行完上面的命令即複製了一份php-fpm,服務名和配置文件名均爲php-fpm-1。
再複製更多份,把上面的命令上的-1替換爲-2,listen監聽端口往上修改,而後再執行一遍就OK。線程
而後寫一個restart_php_fpm.sh的文件,內容爲rest
service php-fpm-1 restart
service php-fpm-2 restart
service php-fpm-3 restart
... ...server
能夠用來啓動和重啓全部的php-fpm實例。關閉用命令killall php-fpm便可。
而後是Nginx配置。
在http段加入:
upstream php-fpm-pool {
server 127.0.0.1:9001;
server 127.0.0.1:9002;
server 127.0.0.1:9003;
server 127.0.0.1:9004;
server 127.0.0.1:9005;
}
修改server段:
location ~ .*\.(php|php5)?$ {
fastcgi_pass php-fpm-pool;
fastcgi_index index.php;
include fastcgi.conf;
}
配置結束。
多實例在效果上基本等於多臺機器的負載均衡,可是我我的仍是比較傾向於在單臺上配置多實例(累加資源相等的狀況下),在一臺機器上配置、維護、使用都要方便的多