对于服务器集群的搭建,nginx负载均衡是很好的方式:思路如下图
这里的session采用了session共享的方式,这样来避免一些情况下的session丢失。下面我会具体说到。
session丢失:是因为文件存储session的方式会把session存储到当前服务器中,通过cookie中的sessionID来获取相应的session,如果第二次请求跟第一次请求不再一个服务器上那么session就没了。
nginx的分配方式:
1.轮询,也是nginx的默认分配方式
这种方式就会造成我上面说到的session丢失的问题。
轮询的方式可以通过配置weight的方式来实现权重的控制 权重越高 分配到的几率也就越高。
2.ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,就不会造成session丢失的问题。
3.url_hash
按访问url的hash结果来分配请求,使同样的url定向到同一个后端服务器。
4.fair(需要服务器支持)
这种分配方式就比较智能了,根据服务器的响应时间来分配请求,根据时时的服务器状态来职能分配。
明确了上面的问题,session最好放到缓存中,最常用的memcache就可以 只要简单的配置下就ok了。
修改PHP.ini
session.save_handler = memcache
session.save_path = "tcp://127.0.0.1:11211"
把文件存储缓存缓存存储就可以实现session的贡献 key是sessionID value就是序列号后的session内容
ps:memcache服务器要是宕机的话会很尴尬。
==============================================
知道了session的问题,明确了分配方式下面就是具体的配置了:
在http {}配置模块里添加upstream 在server配置中通过proxy_pass命令来实现代理分配
upstream test {
#ip_hash;//分配方式,默认为轮询
server 192.168.1.111 weight 1;
server 192.168.1.112;
server 192.168.1.113;
}
server {
listen 80;
server_name test;
location / {
#设置主机头和客户端真实地址,以便服务器获取客户端真实IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#禁用缓存
proxy_buffering off;
#反向代理的地址
proxy_pass http://test;
}
}
ps:如果不设置proxy_set_header 你获取到的客户端地址都变成你代理服务器的地址了 就尴尬了。。。所以最好都设置一下。
总结:
注意session的问题,选择合理的分配方式。还要根据公司的流量,pv来看看是不是真的需要应用负载均衡。
每一个服务器的运行状态,安装的环境版本最好都保持一致,否则会有问题,对于DB的读取,也要做好合理的安排。如果单机的时候MySQL的可访问权限要是localhost那么换成集群以后记得修改,否则就死了......
值得注意的是,如果采用了负载均衡,在布置代码的时候就会很麻烦,所以自动化运维也是很必要的一件事,我看过一篇帖子是美团的自动化运维发展史,每个公司的具体情况都不一样,所以没有好的公共的方法可以实现 适合大多数公司的自动化运维。一般都是自己的运维人员开发一套适合公司情况的自动化运维系统。
目前就想到这么多,欢迎指正。= = 今天搞一下HHVM,搞好了我会贴出来。。。。(如果不懒的话今天就会贴出来,懶的话就不知道啥时候了:)