NGINX实现负载均衡,并利用PHP实现session入库

Posted zhangdaqian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NGINX实现负载均衡,并利用PHP实现session入库相关的知识,希望对你有一定的参考价值。

环境介绍:只有一台Centos 7的服务器,利用docker搭建3台lnmp服务器来测试。

Step 1 :利用docker来搭建三台lnmp服务器

docker pull imagine10255/centos6-lnmp-php56
docker run -itd --name lnmp1 -p 8081:80 imagine10255/centos6-lnmp-php56
docker run -itd --name lnmp2 -p 8082:80 imagine10255/centos6-lnmp-php56
docker run -itd --name lnmp3 -p 8083:80 imagine10255/centos6-lnmp-php56

  

Step 2 :在每台lnmp服务器网站根目录创建index.php文件。端口映射为8081的lnmp,index.php文件中写“8081”,以此类推写好另外两个lnmp docker服务器。

Step 3:修改服务器的nginx.conf文件,来配置负载均衡。

 upstream up1
        server 47.91.209.222:8081;
        server 47.91.209.222:8082;
        server 47.91.209.222:8083;
    

    server 
        listen       80;
        server_name  www.zpfei.net;

        location / 
                proxy_pass http://up1;
        
        .....
        ....
    

  

这样在访问nginx.zpfei.net的时候页面上就会以此出现 8081、8082、8083、8081..... 这是负载均衡最简单的实现方式,默认采用轮询的方式。

Step 4:那么问题来了,比如用户在8081的时候登录了网站,然后打开第二个页面的时候,发现被退出了,原因是8081的session并没有同步到8082服务器上来...

当然这里也可以采用ip_hash的方式来防止出现这种问题,但是ip_hash的原理是让同一个ip的用户在下次请求网站时依然分发到第一次请求的服务器,这样做很难做到真正的负载均衡。

怎么解决?可以利用session入库。

顾名思义,session入库就是把session写入到数据库中达到多台服务器同步session的目的。这里主要用到了“session_set_save_handler”这个函数,该函数的主要作用就是用于接管session的六个状态。废话少说,直接看代码。

<?php
header(‘content-type:text/html;charset=utf-8‘);

//将session存储方式设置为存入数据库的方式
//session.save_handler = files
ini_set("session.save_handler", "user");

session_set_save_handler("open", "close", "read", "write", "destroy", "gc");

//打开并连接数据库
function open()

    //使用pdo
    $pdo = new PDO(‘mysql:host=47.91.209.222;dbname=session‘,‘user‘,‘000‘);
    $pdo->exec(‘set names utf8‘);


//关闭连接
function close()

    //使用pdo
    $pdo = new PDO(‘mysql:host=47.91.209.222;dbname=session‘,‘user‘,‘000‘);
    $pdo->exec(‘set names utf8‘);
    $pdo = null;


//从表中中读信息
function read($session_id)

    //使用pdo
    $pdo = new PDO(‘mysql:host=47.91.209.222;dbname=session‘,‘user‘,‘000‘);
    $pdo->exec(‘set names utf8‘);
    $read = $pdo->query("select * from session where session_id=‘$session_id‘")->fetch(PDO::FETCH_ASSOC);
    return $read["session_info"];


//将session存入数据库
function write ($session_id,$session_info)

    // echo $session_id. "        " . $session_info;
    //使用pdo
    $pdo = new PDO(‘mysql:host=47.91.209.222;dbname=session‘,‘user‘,‘000‘);
    $pdo->exec(‘set names utf8‘);
    $read = $pdo->query("select * from session where session_id=‘$session_id‘")->fetch(PDO::FETCH_ASSOC);

    if(empty($read))
    
        $time = time();
        $pdo->exec("insert into session (session_id, session_info, session_life) values (‘$session_id‘, ‘$session_info‘, ‘$time‘)");
    
    else
    
        $sql = "update session set session_info=‘$session_info‘ where session_id=‘$session_id‘";
        $pdo->exec($sql);
    


//销毁指定session
function destroy($session_id)

    //使用pdo
    $pdo = new PDO(‘mysql:host=47.91.209.222;dbname=session‘,‘user‘,‘000‘);
    $pdo->exec(‘set names utf8‘);
    $pdo->exec("delete from session where session_id=‘$session_id‘");


//删除所有过期的session
function gc()




session_start();
//判断是否有session

var_dump($_SESSION);
?>

  

经过测试,这样不管用户怎么刷新,session都会保持不变。

以上是关于NGINX实现负载均衡,并利用PHP实现session入库的主要内容,如果未能解决你的问题,请参考以下文章

利用nginx实现Redis的负载均衡,应该怎么配置?

Docker的安装和镜像管理并利用Docker容器实现nginx的负载均衡动静分离

Linux下利用nginx实现负载均衡

Nginx实现反向代理和负载均衡

[转帖]利用nginx实现负载均衡 | 哈希算法,sticky模块实现session粘滞

利用nginx实现负载均衡