用Nginx+Redis实现session共享的均衡负载

2023-11-09

原文地址:https://segmentfault.com/a/1190000004708640

前言
大学三年多,也做个几个网站和APP后端,老是被人问到,如果用户多了服务器会不会挂,总是很尴尬的回答:“哈哈,我们的用户还少,到了服务器撑不住的时候,估计都上市了吧”。说是这么说,但是对于有强迫症的我,这个问题一直回响在我脑海里,久久不散啊。如今大四下了,终于有时间来深入了解一下这个问题了。

貌似解决大访问量的方案有硬件和软件两个大类的方法,硬件一般比较贵,学生党就不去考虑了。还是想想怎么用软件解决吧。于是乎,Google,Baidu,balabala… 搜到最多的词就是“均衡负载”,搭配的一般都是Nginx。找到了方向,那就撸起袖子干活吧。

集群搭建
首先在vmware12中安装3台debain,命名为debian1,debian2,debian3。一路默认就好(其实并不好,后面会说)。

vmware有个问题,一旦窗口获得焦点,就自动关闭了小键盘,导致我设置root密码的时候输入为空(它也没提示)。后来我想用su命令才发现密码错误,输入空密码一样错误,就只有找回密码了。

对于debian来说,这样改:在grub界面光标指向待启动的系统,然后按 e 键进行编辑,如图:

在 quiet 后面加个1(注意要有空格),按F10,你就可以以root身份进入命令行界面的。

这时候就用passwd修改密码,然后reboot就可以了。

终于打开了,准备试试网络,发现无法访问外网,但是windows主机可以,如果一路默认的话不应该出现问题,最有可能就是杀毒软件把vmware的服务进程给关了(装了360…)。在windows中启动Vmware的DHCP服务

然后虚拟机要reboot一下来获取ip。好了,现在虚拟机可以访问外网了。

安装nginx,才发现根本连不上,一看才发现是老美的源,应该是一路默认惹的祸啊,修改为科大源(我为母校自豪,哈哈)。

vi /etc/apt/source.list
修改为:

deb http://mirrors.ustc.edu.cn/debian/ wheezy main non-free contrib
deb http://mirrors.ustc.edu.cn/debian/ wheezy-proposed-updates main non-free contrib
deb-src http://mirrors.ustc.edu.cn/debian/ wheezy main non-free contrib
deb-src http://mirrors.ustc.edu.cn/debian/ wheezy-proposed-updates main non-free contrib

deb http://mirrors.ustc.edu.cn/debian-security/ wheezy/updates main non-free contrib
deb-src http://mirrors.ustc.edu.cn/debian-security/ wheezy/updates main non-free contrib
然后执行这个命令来更新: apt-get update

安装: apt-get install nginx

启动: /etc/init.d/nginx start

随便用一个虚拟机开启一个浏览器打开localhost,成功启动,如图:

vi用不惯安装vim: apt-get install vim 报错:

The following packages have unmet dependencies:
vim : Depends: vim-common (= 2:7.3.547-7) but 2:7.4.488-7 is to be installed
E: Unable to correct problems, you have held broken packages.
可见冲突了,解决方法:

先执行 apt-get remove vim-common 卸载vim-common

再进行安装vim,执行 apt-get install vim

找找nginx的根目录,我们打开配置文件(和Apache一样,配置文件模块化的,不是一个单独的nginx.conf)看一看

vim /etc/nginx/sites-enabled/default
中间有一行

root /usr/share/nginx/www;
这就是根目录啦

修改index.html来区分三台主机

用ipconfig 分别获得 ip 地址,在windows中访问

debian1 http://192.168.182.128/

debian2 http://192.168.182.129/

debian3 http://192.168.182.130/
基础尝试
先来一个小例子,以便对均衡负载产生一个直观的感受吧。

我们把debian1作为主服务器承担请求分发的任务,即外部访问的是debian1,然后debain1把请求发送给debian2或者debain3,如下图:

在debian1中修改配置文件 :vim /etc/nginx/nginx.conf
在http配置项中加入如下

upstream site {
server 192.168.182.129:80;
server 192.168.182.130:80;
}

server{
listen 80;
location / {
proxy_pass http://site;
}
}
这是选择的轮询的模式保存重启nginx。

现在在windows中访问debian1,http://192.168.182.128/。多次刷新 可见如下两图依次出现:

说明发送给 debian1 的请求的确是均匀分配到 debian2和debian3了,亦即轮询。

session共享
上面的例子可以说简单到没有什么实用价值,大型网站一般不可能是纯静态的,一般都涉及到用户登录的问题,那么就涉及到session的问题了。你想用户在A登陆了,A记住了用户的登录状态,可是下一次用户请求被分配到B去了怎么办?显然不可能让用户再登陆一次。所以要实现session共享。一般有几个解决办法:

iphash,把特定ip发送给特定主机,就不存在session这个问题了,因为1个用户对应1台主机。但是某时刻当来自某个IP地址的请求特别多,那么将导致某台负载服务器的压力可能非常大,而其他负载服务器却空闲的不均衡情况,这就违背了我们负载均衡的初衷。
搭建redis集群或者memcached集群,用集群自带的同步方法来帮我们在不同的主机中同步session,这样就相当于把原来的一份session变成了N分session(有点浪费,哈哈),session的同步就依赖于NoSql集群的同步了。
不使用session,换作cookie。但是秉承着防御性编程的原则,我们不能相信用户输入,因为cookie可能被禁用,甚至篡改。
单独设置一个session服务器,负载服务器得到一个sessionid过后,去session服务器获得会话状态,然后根据状态来响应用户请求,如果会话状态为空,则在session服务器中设置一个会话状态,然后返回给用户一个sessionid。
我准备采用方案4,即用debian1作为分发服务器,同时作为session服务器(用redis实现),负载服务器每次都要向分发服务器请求用户的session对应的会话状态,以此决定响应方式。

php 环境搭建
在debain2,3中搭建php环境
先在2中修改命令 :

apt-get update #更新源
apt-get install php5 #安装php5
apt-get install php5-cli #安装php5 命令行工具
apt-get install php5-fpm
最后一句就报错了:

The following packages have unmet dependencies:
gnupg : Depends: libreadline6 (>= 6.0) but it is not going to be installed
Recommends: gnupg-curl but it is not going to be installed
php5-fpm : Depends: libssl1.0.0 (>= 1.0.0) but it is not going to be installed
Depends: php5-common (= 5.4.45-0+deb7u2) but it is not going to be installed
Depends: ucf but it is not going to be installed
Depends: tzdata but it is not going to be installed
PreDepends: dpkg (>= 1.16.1~) but it is not going to be installed
搞了好久也没解决,还是换个fastcgi管理工具吧(回头再来啃一啃):

apt-get install spawn-fcgi
启动spawn-fcgi:

/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 5 -u www-data -g www-data -f /usr/bin/php-cgi
说明:

-a : PHP FastCGI 绑定IP地址

-p : PHP FastCGI 指定端口

-u : PHP FastCGI 用户名

-g : PHP FastCGI 用户组

-f : 指向 PHP5 fastcgi
另外

vim /etc/rc.local
加入上述命令使得它开机自启

配置nginx的php选项(还是看官网比较好,不要到处乱搜):

location ~ [^/].php(/|) {  
    fastcgi_split_path_info ^(.+?.php)(/.*)
;
if (!-f documentroot fastcgi_script_name) {
return 404;
}

fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;

}
重启:/etc/init.d/nginx restart

在根目录中加入1.php

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用Nginx+Redis实现session共享的均衡负载 的相关文章

随机推荐

  • openGLES3.0编程指南源码运行

    前言 openGLES3 0编程指南随书源码环境配置和例子运行 在这篇文章中 笔者给出了官网例子配置和运行 但是我自己新建的单独工程源码正确 但依然无法运行程序 遇到的坑 印象深刻 记录一下 错误做法 openGL ES Emulator
  • windows powershell 里怎么从C盘跳到D盘?

    直接在C根目录时输入d 进入其他盘同理 PS C gt d
  • 关于SAR的研究热点——几点思考

    关于SAR的研究热点 几点思考 SAR研究热点之一 新体制论证 SAR系统设计追求的目标 图像质量高 空间和辐射分辨率高 成像幅宽大 具备多模式 扫描 可变入射角条带 斜视 聚束 多波段 全极化 三维成像 动目标检测与成像能力 对平台运动姿
  • 今日头条自媒体矩阵运营攻略

    你今天通常做什么 许多人用它来娱乐八卦 寻找乐趣 并打发时间 但对于媒体和品牌来说 它是一个非常好的操作平台 基于媒体矩阵标题数量的改进及其独特的推荐机制 公司传播品牌 打造个人品牌非常友好 今天我们讨论了标题号如何快速建立个人品牌的综合潜
  • Hexo一些实用的插件

    Hexo的插件真是个好东西 一开始部署博客的时候并没有太在意插件的问题 毕竟觉得博客主题自带的插件挺全面的 足够使用了 但是用久了总是会腻 就想着静态博客能不能整一些新操作 即使只是添加点小功能 于是就翻了翻 Hexo 的插件目录 挑了些比
  • Android BLE学习笔记

    http blog csdn net xiaoyaoyou1212 article details 51854454 个人网站 http www xiaoyaoyou1212 com 欢迎吐槽围观 前言 本文主要描述Android BLE的
  • 链式基数排序(第十章 P286 算法10.15,10.16,10.17)

    链式基数排序 概述 基数排序 radix sort 属于 分配式排序 distribution sort 基数排序也叫做多关键字排序 基数排序是一种借助 多关键字排序 的思想来实现 单关键字排序 的内部排序算法 多关键字排序的方法 n 个记
  • fastjson 重复引用和循环引用问题

    数据传输使用json格式再方便不过了 fastjson 由阿里巴巴那伙人使用Java语言编写 号称最快的JSON库前两天遇到一个问题 后台的数据转化为json字符串后发送到前台出现了 ref字样的东西 后来明白了这是引用 在传输的数据中出现
  • 【LKM】makefile的支持c99的方法: ccflags-y := -std=c99

    如果写的C代码中 变量的定义在 函数之后 则会warning warning ISO C90 forbids mixed declarations and code Wdeclaration after statement 解决办法 1 正
  • 子关卡卸载actor不完全的问题解决。

    在子关卡中 actorA里面挂接n个actor 结果卸载actorA时 挂接的那些actor没有随之卸载掉 解决办法也简单 给这些actor设置owner为actorA即可 即在actorA所在的类里 生成这些挂载的actor时 FActo
  • linux在欢迎界面restart,[Linux]如何手动触发kernel restart

    所谓Linux panic就是碰到错误情况时 code里主动调的一个函数panic 里面出不来 会让cpu重启 不允许再乱执行代码 以便保留现场 像下面这个例子 就是在kernel fault函数里检查到非法无效地址访问后的错误处理 主动调
  • MySQL的服务层和存储引擎层

    1 服务层 Server Layer 服务层是MySQL的顶层组件 负责处理客户端与MySQL服务器之间的交互 它提供了一组API和协议 使应用程序能够连接到MySQL服务器 并发送查询 事务管理 用户权限控制等请求 服务层负责解析和优化查
  • 区块链技术关键词

    区块链技术 区块链是一种分布式账本技术 通过将数据以区块的形式依次链接在一起 并使用密码学技术保证安全性和一致性 加密货币 加密货币是基于区块链技术的数字资产 例如比特币 Bitcoin 和以太坊 Ethereum 等 它们使用区块链来记录
  • neo4j入门(三) 在数据库已知存在的节点上创建新的边

    from py2neo import Graph Node Relationship from py2neo import NodeSelector graph Graph http localhost 7474 username neo4
  • POJ1753 FlipGame

    分类 状压 暴力枚举 参考博客 https www cnblogs com honeycat p 5176211 html 代码是这位博主原创的 加了点注释 题目 http poj org problem id 1753 1 用16位的in
  • 解决由于找不到xxx.dll,无法继续执行代码的问题

    在用vs写项目 或者你下载github上的C 代码的时候 是不是经常遇到由于找不到xxx dll 无法继续执行代码的问题 其实很简单 解决方法如下 首先 对应于不同的运行模式 debug和release 方法都是一样的 找到你项目目录下 项
  • ctfhub-web-密码口令

    弱口令 先尝试admin password 尝试admin admin 默认口令 一般这种题目都是要去找这个产品的默认密码
  • “卷”资金抢人才,一文看懂国产AI大模型竞争格局|钛度图闻

    神仙打架 大佬 下凡 编辑 刘亚宁 孙骋 作图 初彦墨 策划制作 钛媒体视觉中心 6月29日 美团在港交所发布公告 宣布收购王慧文创办的大模型公司 光年之外 这也给AI大模型市场留下了猜测 不只在国内 ChatGPT的访问量在近期增速下滑
  • QCC300x笔记(2) -- QCC3007芯片入门进阶(二)

    哈喽大家好 这是该系列博文的第二篇 篇 lt lt 系列博文索引 快速通道 gt gt 接着上一篇 这一篇主要讲解如何使用ADK Configuration Tool修改固件的常用配置一 在线模式 Go Configurable Read
  • 用Nginx+Redis实现session共享的均衡负载

    原文地址 https segmentfault com a 1190000004708640 前言 大学三年多 也做个几个网站和APP后端 老是被人问到 如果用户多了服务器会不会挂 总是很尴尬的回答 哈哈 我们的用户还少 到了服务器撑不住的