2026/2/13 4:46:44
网站建设
项目流程
站长工具关键词查询,南京公司网站建设平台,农副产品销售网站开发,wordpress数字证书登录大型 LNMP 架构下 Session 共享方案#xff1a;替代 ip_hash 解决重复登录问题
在大型网站的 LNMP 架构中#xff0c;传统 ip_hash 策略已无法满足多服务器集群下的用户登录状态保持需求。当 Nginx 代理进行负载均衡轮询时#xff0c;用户可能被分配到不同 Web 服务器…大型 LNMP 架构下 Session 共享方案替代 ip_hash 解决重复登录问题在大型网站的 LNMP 架构中传统 ip_hash 策略已无法满足多服务器集群下的用户登录状态保持需求。当 Nginx 代理进行负载均衡轮询时用户可能被分配到不同 Web 服务器而默认 Session 存储在单服务器本地导致其他服务器无法识别用户登录状态引发重复登录问题。本文将详细介绍基于 Redis 的 Session 共享方案实现过程从环境准备到配置部署的完整流程。一、环境准备与基础部署1. 传输 LNMP 相关包至 Web 主机首先需将代理服务器上的 LNMP 软件包分发到两台 Web 服务器192.168.99.100 和 192.168.99.200使用 scp 命令完成传输[rootproxy~]#scp 1nmp_soft.tar.gz 192.168.99.100:[rootproxy~]#scp 1nmp_soft.tar.gz 192.168.99.200:传输过程中需确认主机真实性并输入目标服务器密码传输成功后将在 Web 主机根目录下获得软件包。2. 安装 Nginx 及依赖在 Web1 和 Web2 上分别执行以下操作完成 Nginx 安装(1)解压软件包并进入 Nginx 源码目录[rootweb1~]#tar -xf Inmp_soft.tar.gz[rootweb1 ~]#cd Inmp_soft/[rootweb1 Inmp_soft]#tar -xf nginx-1.22.1.tar.gz[rootweb1 Inmp_soft]#cd nginx-1.22.1/(2)安装 Nginx 依赖软件[rootweb1 nginx-1.22.1]#yum install -y gcc make pcre-devel openssl-devel(3)编译安装 Nginx编译参数根据实际需求配置3. 安装数据库与 PHP 相关组件为实现动态网页功能需安装 MariaDB 数据库和 PHP 运行环境[rootweb1 nginx-1.22.1]#yum install -y mariadb mariadb-server mariadb-devel php php-mysq1nd php-fpm4. 配置 PHP 与 Nginx 对接(1)配置 php-fpm 权限编辑 php-fpm 配置文件添加 Nginx 用户权限[rootweb1 nginx-1.22.1]#vim /etc/php-fpm.d/www.conf添加允许的用户listen.acl_users apache,nginx, nobody重启 php-fpm 服务[rootweb1 nginx-1.22.1]#systemctl restart php-fpm.service(2)修改 Nginx 动态网页配置编辑 Nginx 主配置文件[rootweb1 nginx]#vim conf/nginx.conf配置动态请求转发至 php-fpm(3)启动服务并部署测试页面启动 Nginx 服务并添加默认网页测试动态页面访问测试访问动态页面成功5. 部署登录测试页面并区分集群节点(1)解压并拷贝登录演示页面至 Nginx 网页目录[rootweb1 nginx]#tar -xf~/1nmp_soft/php_scripts/php-session-demo.tar.gz[rootweb1 nginx]#cp -r php-session-demo/* html(2)区分两台 Web 服务器的登录页面便于测试Web1 修改[rootweb1 nginx]#vim html/index.php添加标识h1PHP-web1 Login Session/h1Web2 修改[rootweb2 nginx]#vim html/index.php添加标识h1PHP-web2 Login Session/h1(3)修改后效果Web1 登录页面Web2 登录页面6. 配置 Nginx 代理负载均衡(1)在代理服务器192.168.99.5的 Nginx 配置中添加 upstream 集群配置upstreamweb {server192.168.99.100:80;server192.168.99.200:80;}server{listen80;server_namelocalhost;#charset koi8-r;#access_log logs/host.access.log main;location~*\.(jpgs|htm1|mp4)${expires30d;}location/{proxy_passhttp://web;roothtml;indexindex.html index.htm;}}(2)加载配置文件后通过代理服务器 IP192.168.99.5可正常访问集群节点登入页面二、Session 与 Cookie 核心原理要解决重复登录问题首先需理解 HTTP 无状态协议下的用户状态保持技术Session 与 Cookie。1.Cookie(1)作用在客户端浏览器存储少量非敏感数据如用户 ID、SessionID、偏好设置核心用于记住登录状态、行为跟踪等场景。(2)工作原理服务器通过Set-Cookie响应头下发 Cookie 给浏览器浏览器本地存储 Cookie后续请求自动通过Cookie请求头携带数据回传服务器。(3)生命周期会话 Cookie浏览器关闭后失效无 Expires/Max-Age持久 Cookie设置过期时间后长期有效如 记住我 功能。(4)关键属性Domain/Path限制 Cookie 生效范围Secure仅 HTTPS 传输HttpOnly禁止 JS 读取防 XSSSameSite限制跨站传输防 CSRF。2. Session(1)作用在服务器端存储敏感会话数据如用户登录凭证、权限信息避免敏感数据暴露在客户端。(2)工作原理用户首次访问时服务器生成唯一 Session ID通过 Cookie主流或 URL 重写将 Session ID 下发给浏览器后续请求携带 Session ID服务器通过该 ID 查询对应会话数据。(3)生命周期默认随浏览器关闭失效可设置超时机制如 30 分钟无活动销毁。3. Cookie 与 Session 核心区别维度CookieSession存储位置客户端浏览器服务器端内存、数据库、缓存数据安全性较低可能被篡改 / 窃取较高数据不暴露给客户端存储容量较小通常 4KB较大受服务器资源限制生命周期可手动设置过期时间随会话结束或超时失效性能影响低客户端处理高需读取服务器存储4. 协作流程(1)用户登录时服务器验证账号密码(2)服务器创建 Session存储用户 ID生成 Session ID(3)通过Set-Cookie将 Session ID 下发给浏览器(4)后续请求自动携带 Session ID(5)服务器通过 Session ID 查询会话数据识别用户身份(6)用户退出时服务器删除 Session 数据并使 Cookie 过期。5. 关键注意事项(1)Session 固定攻击登录成功后需重新生成 Session ID(2)Cookie 盗用需设置 HttpOnly 和 Secure 属性(3)分布式 Session集群环境下需集中存储如 Redis避免 Session 丢失。6. Nginx 默认 Session 存储在 LNMP 环境中PHP 的 Session 默认存储路径为/var/lib/php/session/可通过删除该目录下的 Session 文件强制用户重新登录[rootweb1 nginx]#rm -rf /var/lib/php/session/sess*三、Redis 实现 Session 共享核心方案1. 方案原理Session 共享的核心是让所有 Web 服务器访问同一 Session 存储介质。Redis 作为高性能内存数据库具备快速读写、支持分布式部署的特性是 Session 集中存储的理想选择。通过将 Session 数据存储在 Redis 中所有 Web 服务器均可通过 Redis 获取用户 Session 信息从而解决集群下的重复登录问题。2. 安装并配置 Redis(1)安装 Redis在代理服务器192.168.99.5上安装 Redis单独部署更优此处为操作便捷选择代理服务器(2)启动 Redis 并验证[rootproxy nginx]#systemctl start redis[rootproxy nginx]#ss -ntulp | grep redis默认 Redis 仅监听本地 127.0.0.1:6379(3)修改 Redis 配置允许远程访问编辑 Redis 配置文件[rootproxy nginx]#vim /etc/redis.conf注释第 69 行的绑定地址#bind 127.0.0.1关闭第 88 行的保护模式protected-mode no保存后重启 Redis[rootproxy nginx]#systemctl restart redis(4)验证监听地址已改为 0.0.0.0允许任意地址访问3. 安装 phpredis 扩展PHP 与 Redis 关联在 Web1 和 Web2 上安装 phpredis 扩展使 PHP 能够操作 Redis 数据库4. 配置 Session 共享(1)修改 PHP 配置文件编辑 php-fpm 配置文件[rootweb1 ~]#vim /etc/php-fpm.d/www.conf[rootweb2 ~]#vim /etc/php-fpm.d/www.conf(2)在文件末尾添加以下配置指定 Session 存储方式为 Redisphp_value [session.save_handler] redisphp_value [session.save_path] tcp://192.168.99.5:6379php_value [soap.wsdl_cache_dir] /var/lib/php/wsdlcache;php_value [opcache.file_cache] /var/lib/php/opcachesession.save_handler设置 Session 存储处理器为 Redissession.save_path指定 Redis 服务器地址192.168.99.5和端口6379(3)重启 php-fpm 服务[rootweb1 ~]#systemctl restart php-fpm.service[rootweb2 ~]#systemctl restart php-fpm.service四、效果验证Session 共享配置完成后通过代理服务器 IP192.168.99.5访问登录页面只需登录一次即可在 Web1 和 Web2 之间无缝切换无需重复登录。登录后访问效果五、总结在大型 LNMP 集群架构中ip_hash 策略的局限性导致无法解决多服务器间的 Session 共享问题。通过 Redis 实现 Session 集中存储配合 phpredis 扩展让 PHP 与 Redis 联动所有 Web 服务器均可访问统一的 Session 数据彻底解决了负载均衡下的重复登录问题。该方案具备高性能、高可用性和安全性适用于各类大型分布式网站的用户状态管理场景。