登录后台

页面导航

本文编写于 795 天前,最后修改于 795 天前,其中某些信息可能已经过时。

nginx会话保持,session基本介绍

什么是会话保持

当用户登陆一个网站服务器,网站服务器会将用户的登陆信息存储下来(存储下来的内容Session )以保证 我们能够一直处于 ”登陆在线“ 状态。
客户端:cookies 服务端:sessionID

为什么需要会话保持

由于我们使用的是负载均衡轮询机制,会导致用户请求 分散在不同的节点,从而造成会话无法保持。 假设用户A,通过负载均衡登陆了网站,此时会话信息存 储在A节点,那么当它一刷新,负载均衡会将请求分发给 B节点,那么B节点没有用户A的登陆信息,就会提示用 户A登陆,当A用户点击登陆时又会将请求分发给C节 点,从而造成用户A无法实现会话保持。

如何实现会话保持

  • 1.粘性session(演示):指Ngnix每次都将同一用户的 所有请求转发至同一台服务器上,及Nginx的 IP_hash。
  • 2.session复制(不用):每次session发生变化,就 广播给集群中的服务器,使所有的服务器上的 session相同。
  • 3.session共享(√):缓存session至内存数据库中, 使用redis,memcached实现。
  • 4.session持久化:将session存储至数据库中,像操 作数据一样操作session。

回话保持场景演示

1、首先安装并配置 phpmyadmin

[root@web01 conf.d]# cd /code
[root@web01 code]# wget
https://files.phpmyadmin.net/phpMyAdmin/4.8
.4/phpMyAdmin-4.8.4-all-languages.zip
[root@web01 code]# unzip phpMyAdmin-4.8.4-all-languages.zip

2.修改 phpmyadmin 连接远程的数据库

[root@web01 code]# cd phpMyAdmin-4.8.4-all-
languages/
[root@web01 phpMyAdmin-4.8.4-all-languages]# cp config.sample.inc.php
config.inc.php
[root@web01 phpMyAdmin-4.8.4-all-languages]# vim config.inc.php
/* Server parameters */
$cfg['Servers'][$i]['host'] ='172.16.1.51';

3.在多台 web 上准备 phpmyadmin 的 nginx 配置文件

[root@web01 ~]# cat
/etc/nginx/conf.d/php.conf
server {
    listen 80;
    server_name php.oldxu.net;
    root /code/phpMyAdmin-4.8.4-all-
languages;
    location / {
        index index.php index.html;
}
    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME
$document_root$fastcgi_script_name;
        include fastcgi_params;
} }
#重启Nginx服务
[root@web01 ~]# systemctl restart nginx

配置负载均衡

1.编写一份 proxy 负载均衡的配置文件,将请求调度到 后端 web 节点

[root@proxy01 ~]# cat
/etc/nginx/conf.d/proxy_php.com.conf
upstream php {
        server 172.16.1.7:80;
        server 172.16.1.8:80;
} 
server {
        listen 80;
        server_name php.oldxu.net;
        location / {
            proxy_pass http://php;
            include proxy_params;
        }
}

2.检查语法并重载 nginx

[root@proxy01 conf.d]# nginx -t
[root@proxy01 conf.d]# systemctl restart
nginx

配置Redis服务

1.安装 redis 内存数据库

[root@Redis-node1 ~]# yum install redis -y

2.配置 redis 监听在本地的内网网卡上

[root@Redis-node1 ~]# sed  -i '/^bind/c bind 127.0.0.1 172.16.1.41' /etc/redis.conf

3.启动 redis

[root@Redis-node1 ~]# systemctl start redis
[root@Redis-node1 ~]# systemctl enable redis

配置php连接Redis

1.修改 /etc/php.ini 文件。[所有节点都需要操作]

[root@web ~]# vim /etc/php.ini 
session.save_handler = redis session.save_path = "tcp://172.16.1.41:6379";
session.save_path = "tcp://172.16.1.41:6379?auth=123" #如果redis存在密码,则使用该方式

2.注释 php-fpm.d/www.conf 里面的两条内容,否则 session 内容会一直写入 /var/lib/php/session 目录中,从而造成会话共享失败。[所有节点都需要操作]

[root@web ~]# vim /etc/php-fpm.d/www.conf
;php_value[session.save_handler] = files
;php_value[session.save_path] = /var/lib/php/session

3.重启 php-fpm 服务。[所有节点都需要操作]

[root@web ~]# php-fpm -t
[root@web ~]# systemctl restart php-fpm

测试集群会话共享

1.使用浏览器登陆网站,获取对应的 cookie信息

[root@redis-node1 ~]# redis-cli
127.0.0.1:6379> keys *
1)
"PHPREDIS_SESSION:393ff522ed2a7e26ba44f6d92
5f991f2"
127.0.0.1:6379>

3.此时用户的 cookie始终都不会发生任何变化,无论请求被负载调度到那一台后端web 节点服务器都不会出 现没有登陆情况。