搭建PHP集群的第一步便是设置负载均衡。
首先我们须要三台主机:

Nginx负载:192.166.5.111

PHP运用1:192.168.5.112

php集群sessionPHP集群session共享 PHP

PHP运用2:192.168.5.113

先前,在PHP运用所在的主机,我们须要安装Nginx或者apache等这类web做事器,然后再在前面利用Nginx作为负载。
Nginx 负载和php运用之间的通信是在运用层的,Nginx 负载实在就相称于一个代理。
但是,现在情形不同了。
Fastcgi技能的运用许可在php运用层可以不用再安装web做事器。
现在PHP5.5版本已经将fpm作为内部模块支持了。
在这种情形下,Nginx 负载和php运用之间的通信是在传输层的,二者之间利用socket进行通信。
当然了,这须要fpm做事的支持。

Nginx设置

首先对Nginx(192.168.5.111)进行设置,编辑nginx.conf配置文件

http{

……

upstream onmpw_phpApps{

server 192.168.18.88:9000;

server 192.168.18.191:9000;

}

……

Server{

listen 80;

server_name load.onmpw.com ##这里是域名

root /www/onmpw

……

location ~ \.php$ {

root /www/onmpw ##这里是PHP运用所在目录

fastcgi_pass onmpw_phpApps;

……

}

}

}

以上是对Nginx进行的设置。
个中只是包含了关键的部分,别的的和平常我们利用Nginx+PHP作为web做事的时候进行的设置相同。

PHP所在主机设置

这里的设置就比较大略了。

首先编辑php-fpm.conf文件,修正监听的ip和端口,然后启动fpm做事

主机192.168.5.112

Listen = 192.168.5.112:9000 //这里的端口可以自行设置。
保存退出

# /usr/local/php/sbin/php-fpm //开启做事

主机192.168.5.113

Listen = 192.168.5.113:9000

# /usr/local/php/sbin/php-fpm

到这里就对PHP的主机设置完成了。
当然了,代码须要在两台主机上各上传一份儿。

好了,经由上面的设置,一个基本的PHP集群就已经搭建完成了。
但是有一个问题,这种情形如果只是访问静态资源或者不进行交互的话是没有问题的。
如果须要交互,那就涉及到一个session共享的问题。
默认情形下PHP是将session存在本地磁盘上的。
那这两台主机之间如何共享session呢,接下来我们就来办理这个问题。

PHP主机之间Session共享

之前在网上看到过一种办理办法。
由于PHP是将session存储在文件中,那我们可以在Nginx负载主机上面搭建一个分布式文件系统(NFS),让两台PHP主机的session都存放在此文件系统中。
以此来达到共享session的目的。

我个人比较方向于将session存储到数据库中。
因此这里我先容的是将session存储到redis中。
以是我们须要增加一台Redis做事器

Redis做事器:192.168.5.114

PHP默认情形下是不支持对Redis的操作的。
以是这里我们须要自己手动安装第三方的扩展,使其支持对Redis的操作。
关于如何使PHP支持Redis,我们可以参考《PHP操作Redis的两种办法》。

在这里我就认为我们的PHP已经支持Redis了。
接下来是将session存储到Redis中,有两种办法:一种是直接修正PHP的配置文件php.ini;另一种是重写session机制。

修正PHP配置文件php.ini将session存储到Redis中

利用vim打开php.ini,须要修正的有这两项:session.save_handler和session.save_path。

session.save_handler = Redis

session.save_path = “tcp://192.168.5.114:6379”

//Redis不须要密码验证

session.save_path = “tcp://192.168.5.114:6379?auth=password”

//Redis 须要密码验证

修正完成,保存退出。
然后重启php-fpm做事

# kill -INT `cat /usr/local/php/var/run/php-fpm.pid`

# /usr/local/php/sbin/php-fpm

两台PHP主机都做按照以上步骤操作。
经由以上步骤,对付session的所有信息都保存到了Redis中。
从而实现了session的共享。

通过重写session机制将session存储到Redis中

常日,在很多情形下我们是没有权限修正php.ini文件的。
这时候我们可以通过重写session机制来修正session信息的存储。

对付重写session,php已经为我们供应了SessionHandlerInterface 接口。
我们只要实现这个接口就可以了。
关于如何重写session机制,大家可以参考《PHP重写session机制》这篇文章。
并且我自己也重写了session的机制,该类的完全代码在github上,大家有兴趣的和可以点此查看。

总结

PHP集群的架构办法有很多种,但是其事理都大同小异。
关键是找出适宜自己项目的佳方案。
例如:对付session存储办法的选择,你也可以选择利用memcache或者mysql数据库等。
总之适宜自己的便是优的。
希望本文对大家有所帮助。