nginx负载均衡的一些问题和具体配置

对于服务器集群的搭建,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,搞好了我会贴出来。。。。(如果不懒的话今天就会贴出来,懒的话就不知道啥时候了:)




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