环境介绍:只有一台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();
//判断是否有sessionvar_dump($_SESSION);
?>

  

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

转载于:https://www.cnblogs.com/zhangdaqian/p/11324263.html

NGINX实现负载均衡,并利用PHP实现session入库相关推荐

  1. 利用Nginx实现负载均衡(反向代理)完全详解

    1.常见负载均衡的方式(概念普及) [1]用户手动选择 例如我们玩游戏,服务器会显示当前服务器的状态是拥挤.繁忙.还是空闲,然后用户根据自己实际需要,选择自己想去的服务器. 如果服务器人太多(达到上限 ...

  2. docker nginx 配置负载均衡

    在上篇的文章中我们介绍了docker nginx配置简单的代理 在这篇文章我们介绍docker 利用nginx配置负载均衡 所谓的负载均衡是两台服务器,或者是多台服务器上面部署项目,但是访问的方式是通 ...

  3. 使用Redis存储Nginx+Tomcat负载均衡集群的Session

    配置Tomcat的session共享可以有三种解决方案: 第一种是以负载均衡服务器本身提供的session共享策略,每种服务期的配置是不一样的并且nginx本身是没有的. 第二种是利用web容器本身的 ...

  4. nginx配置 负载均衡_如何配置NGINX负载平衡

    nginx配置 负载均衡 The load balancing is the process of distributing traffic to multiple instances of an a ...

  5. Nginx+DNS负载均衡

    今天看了很多关于nginx负载均衡的博客,人家推荐的都是自己的ip来做负载,但是同样有说DNS负载均衡,刚开始我也是一头雾水,慢慢的分析才知道真正意义上的Nginx+DNS负载均衡. 1. nginx ...

  6. nginx实现负载均衡的6种方式

    nginx实现负载均衡的6种方式 一.负载均衡 1.轮询 2.权重 3.ip_hash 4.最少连接least_conn nginx.conf配置文件内容详解 后续更新 一.负载均衡 nginx负载均 ...

  7. Nginx网络负载均衡,负载均衡,网络负载,网络均衡

    本节就聊聊采用Nginx负载均衡之后碰到的问题: Session问题 文件上传下载 通常解决服务器负载问题,都会通过多服务器分载来解决.常见的解决方案有: 网站入口通过分站链接负载(天空软件站,华军软 ...

  8. Nginx搭建负载均衡集群

    (1).实验环境 youxi1 192.168.5.101 负载均衡器 youxi2 192.168.5.102 主机1 youxi3 192.168.5.103 主机2 (2).Nginx负载均衡策 ...

  9. lnmp架构——nginx的负载均衡

    lnmp架构--nginx的负载均衡 1 什么是nginx 2 nginx的作用 3 nginx的特点 4 nginx的安装以及优化 4.1 安装nginx 4.2 优化 5 nginx主配置文件操作 ...

  10. Nginx+keepalived负载均衡高可用篇第③版

    Nginx+keepalived负载均衡高可用篇第③版 对付中.小型企业,假如没有资金去购买昂贵的四/七层负载均衡交换机,那么Nginx是不错的七层负载均衡选择,并且可以通过Nginx + Keepa ...

最新文章

  1. java 流换行符_【求大神】如何读取含换行符的缓冲流文件
  2. 创建模块化程序(二)
  3. 青龙羊毛——58同城修复版(脚本)
  4. NS2网络模拟(3)-吞吐率
  5. Together与Visual.Studio.NET的结合使用(二)
  6. Linux上端口开放常用命令
  7. VMware虚拟机中调用本机摄像头详解
  8. Java追加写json_java – ObjectMapper追加文件JSON
  9. RUNOOB python练习题47 交换两个变量值
  10. 文件从一台服务器拷贝到另一台服务器
  11. 一款APP设计的从0到1之:Android设计规范篇(转载)
  12. Java基础篇:如何嵌套try语句?
  13. 网页版excel服务器,用excel当数据库,做个简单的网页
  14. git如何查看缓存区文件内容_[暂存盘已满怎么解决]git暂存区的理解
  15. GitHub 上有哪些考研神器?
  16. 利用STM32精确测量电压
  17. 【lua/aviutl】游戏对话框效果
  18. Docker错误合集
  19. 查看CAD图纸时,如何改背景颜色呢?
  20. matlab三元方程拟合,3元函数拟合及结果.docx

热门文章

  1. python求解next数组实现KMP算法
  2. 浅谈LockSupport工具类
  3. FISCO BCOS源码(5)基本概念
  4. 【Django 2021年最新版教程30】ubuntu中停止和重启django项目
  5. linux shell 获取系统当前时间 毫秒
  6. linux shell awk -F‘:‘ ‘{print $1}‘
  7. mysql的执行局计划
  8. linux卸载keystone服务,OpenStack —— 认证服务Keystone(二)
  9. golang errors 取 错误 信息_golang-标准errors包的学习
  10. 大部分程序员还不知道的 Servelt3 异步请求,原来这么简单?