公司一个项目单点压力越来越大,考虑到稳定性和降压,使用nginx做负载均衡,将请求分发到多个docker上去,这里记录下PHP多服务器间的会话session共享问题,解决方案是把session单独存在一台redis上面。

LB nginx配置:

upstream allserver{
server 127.0.0.1: weight=;
server 127.0.0.1: weight=;
server 127.0.0.1: weight=;
}
server
{
listen ;
#listen [::]:;
server_name www.sessiontest.com ; #error_page /.html;
error_log /data/logs/nginx/www.sessiontest.com_error.log ;
access_log /data/logs/nginx/www.sessiontest.com.log ;
#设定查看Nginx状态的地址
location /nginxstatus{
stub_status on;
access_log on;
auth_basic "nginxstatus";
auth_basic_user_file htpasswd;
}
#匹配以jsp结尾的,tomcat的网页文件是以jsp结尾
location / {
index index.php;
proxy_pass http://allserver; #在这里设置一个代理,和upstream的名字一样
#以下是一些反向代理的配置可删除
proxy_redirect off;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实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;
client_max_body_size 10m; #允许客户端请求的最大单文件字节数
client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数
proxy_connect_timeout ; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout ; #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout ; #连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*)
proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
} }

docker 是使用docker-compose编排的

version: ''

services:
phpserver1:
image: webdevops/php-nginx:latest
ports:
- "8081:80"#
links:
- redis
depends_on:
- redis
volumes:
- /data/docker/app1:/app phpserver2:
image: webdevops/php-nginx:latest
ports:
- "8082:80"#
links:
- redis
depends_on:
- redis
volumes:
- /data/docker/app2:/app phpserver3:
image: webdevops/php-nginx:latest
ports:
- "8083:80"#
links:
- redis
depends_on:
- redis
volumes:
- /data/docker/app3:/app redis:
image: redis
ports:
- :

使用docker-compose up 启动

data目录结构

不使用redis时的PHP文件

我们先只开启server1的session赋值

请求前端域名可以发现

只有server1的session id 打印了,session不共享

接下来在每个PHP脚本都设置使用redis保存session

同样只打开server1的session id 写入

再次请求前端url

可以看到server1设置过session id值后,负载到其他server时同样可以使用同一个会话session

PHP session 配置还可以写在php.ini中

session.save_handler = redis
session.save_path = "tcp://redis:6379?auth=passwd"

  

注意如果redis配置了密码的话后面要加auth 验证

除了redis,还支持memcache,mysql

具体可以参考这篇博客

https://www.jianshu.com/p/43a061a4c997

最新文章

  1. java计算文件32位md5值
  2. 【转】K3Cloud 二次开发 单据转换系列
  3. Objective-C /iphone开发基础:分类(category,又称类别)
  4. Android用户界面 UI组件--TextView及其子类(四) Chronometer计时器
  5. Apache Log4j使用实例
  6. UITableView 或 UIScrollView 点击状态栏列表回到顶部
  7. DW 做一个table表 对单元格进行合并
  8. dbvisualizer参数设置
  9. ng2响应式表单-翻译与概括官网REACTIVE FORMS页面
  10. stark组件配置,二层URL
  11. Opencv画图操作
  12. Oracle 监听器日志配置与管理
  13. static静态全局变量和static静态局部变量
  14. 10个最佳 Javascript+HTML5 演示文稿框架
  15. Android studio导入eclipse项目遇到的错误解决方案
  16. Hadoop(HA)分布式集群部署
  17. windows 2008 r2 安装 owas 2013
  18. Libheap:一款用于分析Glibc堆结构的GDB调试工具
  19. javascript之反柯里化(uncurrying)
  20. How to authenticate a user by uid and password?

热门文章

  1. .gitignore 的简单实用
  2. mac vim 配色
  3. HDU 6207:Apple(Java高精度)
  4. TCP/IP协议、三次握手、四次挥手
  5. Python题整理
  6. 用SpringBoot+MySql+JPA实现对数据库的增删改查和分页
  7. Linux 终端连接工具 XShell v6.0.01 企业便携版
  8. Socket网络编程系列教程序
  9. 附录:1-Grain生命周期-译注
  10. Java编程思想:压缩