本文编写于 1172 天前,最后修改于 1172 天前,其中某些信息可能已经过时。
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信息
2.检查 redis 中是否存在 cookie 对应的 session 信 息
[root@redis-node1 ~]# redis-cli
127.0.0.1:6379> keys *
1)
"PHPREDIS_SESSION:393ff522ed2a7e26ba44f6d92
5f991f2"
127.0.0.1:6379>