Nginx-redis【会话保持】

什么是会话保持

  • 当用于登录一个网站服务器, 网站服务器会将用户的登录信息存储下来(存储session),以保证我们能一直处于登录在线的状态

为什么要做会话保持

  • 由于我们使用的是负载均衡轮询机制,会导致用户请求分散在不同的节点,从而造成会话无法保持

如何实现会话保持

  • 1、粘性session:指nginx每次都将统一用户的所有请求转发到同一台服务,使用IP_hash机制
  • 2、session复制:即每次session发生变化时,就广播给集群中的服务器,是所有的服务器的session相同,tomcat_cluster中会自动同步
  • 3、session共享:缓存session到内存数据库中,使用redis,memcached
  • 4、session持久化:将session存储到数据库中,像操作数据一样操作session

演示案例【phpmyadmin】

LB

192.168.200.120

web-01

192.168.200.121

web-02

192.168.200.122

redis

192.168.200.123

mysql

192.168.200.127

web-01安装、配置

cat > /etc/yum.repos.d/nginx.repo << OK
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/
gpgcheck=0
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
OK

## 下载nginx
[root@nginx]# yum -y install nginx
[root@nginx conf.d]# cd /etc/nginx/conf.d/


[root@nginx conf.d]# rpm -e $(rpm -a | grep php)
[root@nginx conf.d]# rm -rf /etc/php.ini.rpmsave

[root@nginx PHP]# cat >  /etc/yum.repos.d/php.repo << OK
[webtatic-php]
name = php Repository
baseurl = http://us-east.repo.webtatic.com/yum/el7/x86_64/
gpgcheck = 0
OK

## 下载php
[root@nginx PHP]# yum -y install php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd php71w-opcache php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb

## 修改nginx、php启动用户
[root@nginx conf.d]# sed -i '/^user/c user www;' /etc/nginx/nginx.conf
[root@nginx conf.d]# sed -i '/^user/c user = www' /etc/php-fpm.d/www.conf 
[root@nginx conf.d]# sed -i '/^group/c group = www' /etc/php-fpm.d/www.conf

[root@nginx conf.d]# mv default.conf{,.bak}

## 创建虚拟主机配置文件
[root@nginx conf.d]# vim phpmyadmin.conf 
server {
  listen 80;
  server_name www.php-myadmin.org;
  root /code/phpmy;
  location / {
    index index.php;
  }
  location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
  }
}

## 检查语法
[root@nginx conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

[root@nginx conf.d]# systemctl enable php-fpm.service 
[root@nginx conf.d]# systemctl start php-fpm.service

[root@nginx conf.d]# systemctl enable nginx.service
[root@nginx conf.d]# systemctl start nginx.service

## 创建目录、下载代码包
[root@nginx conf.d]# mkdir /code/
[root@nginx conf.d]# cd /code/

[root@nginx code]# unzip phpMyAdmin-4.9.11-all-languages.zip
[root@nginx code]# chown -R www.www phpMyAdmin-4.9.11-all-languages
[root@nginx code]# ln -s phpMyAdmin-4.9.11-all-languages /code/phpmy

## 配置
[root@nginx code]# cp phpmy/config.sample.inc.php  /code/phpmy/config.inc.php

[root@nginx code]# vim phpmy/config.inc.php
.....
$cfg['Servers'][$i]['host'] = '192.168.200.127';
.....


[root@nginx code]# chown -R www.www /var/lib/php/session/
[root@nginx code]# systemctl reload nginx.service

mysql创建用户

[root@mysql-master ~]# yum -y install mariadb-service mariadb

[root@mysql-master ~]# systemctl start mariadb
[root@mysql-master ~]# systemctl enable mariadb

[root@mysql-master ~]# mysqladmin -uroot password

[root@mysql-master ~]# mysql -uroot -p111
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 5.5.68-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> grant all on *.* to myadmin@'%' identified by '111';
Query OK, 0 rows affected (0.00 sec)

测试访问

 

web-02安装、配置

cat > /etc/yum.repos.d/nginx.repo << OK
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/
gpgcheck=0
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
OK

## 下载nginx
[root@nginx]# yum -y install nginx
[root@nginx conf.d]# cd /etc/nginx/conf.d/


[root@nginx conf.d]# rpm -e $(rpm -a | grep php)
[root@nginx conf.d]# rm -rf /etc/php.ini.rpmsave

[root@nginx PHP]# cat >  /etc/yum.repos.d/php.repo << OK
[webtatic-php]
name = php Repository
baseurl = http://us-east.repo.webtatic.com/yum/el7/x86_64/
gpgcheck = 0
OK

## 下载php
[root@nginx PHP]# yum -y install php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd php71w-opcache php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb

## 修改nginx、php启动用户
[root@nginx conf.d]# sed -i '/^user/c user www;' /etc/nginx/nginx.conf
[root@nginx conf.d]# sed -i '/^user/c user = www' /etc/php-fpm.d/www.conf 
[root@nginx conf.d]# sed -i '/^group/c group = www' /etc/php-fpm.d/www.conf

[root@nginx conf.d]# mv default.conf{,.bak}

## 创建虚拟主机配置文件
[root@nginx conf.d]# vim phpmyadmin.conf 
server {
  listen 80;
  server_name www.php-myadmin.org;
  root /code/phpmy;
  location / {
    index index.php;
  }
  location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
  }
}

## 检查语法
[root@nginx conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

[root@nginx conf.d]# systemctl enable php-fpm.service 
[root@nginx conf.d]# systemctl start php-fpm.service

[root@nginx conf.d]# systemctl enable nginx.service
[root@nginx conf.d]# systemctl start nginx.service

## 创建目录、下载代码包
[root@nginx conf.d]# mkdir /code/
[root@nginx conf.d]# cd /code/

[root@nginx code]# unzip phpMyAdmin-4.9.11-all-languages.zip
[root@nginx code]# chown -R www.www phpMyAdmin-4.9.11-all-languages
[root@nginx code]# ln -s phpMyAdmin-4.9.11-all-languages /code/phpmy

## 配置
[root@nginx code]# cp phpmy/config.sample.inc.php  /code/phpmy/config.inc.php

[root@nginx code]# vim phpmy/config.inc.php
.....
$cfg['Servers'][$i]['host'] = '192.168.200.127';
.....


[root@nginx code]# chown -R www.www /var/lib/php/session/
[root@nginx code]# systemctl reload nginx.service

接入LB

[root@nginx conf.d]# vim phpmyadmin.conf
upstream phpmy {
  server 192.168.200.121:80;
  server 192.168.200.122:80;
}
server {
  listen 80;
  server_name www.php-myadmin.org;
    location / {
      proxy_pass http://phpmy;
      proxy_set_header Host $http_host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

[root@nginx conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@nginx conf.d]# systemctl reload nginx.service

测试【域名解析到LB】

[root@lb conf.d]# vim phpmyadmin.conf
  
upstream phpmy {
  server 192.168.200.121:80;
  server 192.168.200.122:80;
}
server {
  listen 80;
  server_name www.php-myadmin.org;
    location / {
      proxy_pass http://phpmy;
      proxy_set_header Host $http_host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

[root@lb conf.d]# systemctl reload nginx.service
  •  接入LB后,发现登录不上了,因为是轮询调度,session一直在发生变化

配置IP_hash【会话保持】测试

upstream phpmy {
  ip_hash;
  server 192.168.200.121:80;
  server 192.168.200.122:80;
}
server {
  listen 80;
  server_name www.php-myadmin.org;
    location / {
      proxy_pass http://phpmy;
      proxy_set_header Host $http_host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

[root@nginx conf.d]# systemctl reload nginx.service
  •  登录成功,但是发现无论怎么刷新,都是被调度到固定节点,显然使用ip_hash如果同一时间出现高并发,后端某台服务压力瞬增

 安装、配置redis实现【会话保持】

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

[root@nginx ~]# sed -i '/^bind/c bind 127.0.0.1 192.168.200.123' /etc/redis.conf
[root@nginx ~]# systemctl enable redis
[root@nginx ~]# systemctl start redis

[root@nginx ~]# netstat -lntp | grep redis
tcp        0      0 192.168.200.123:6379    0.0.0.0:*               LISTEN      2260/redis-server 1 
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      2260/redis-server 1

配置将web的php应用服务的session信息,存储到redis中

  • php使用php71w-pecl-redis-3.1.6模块
  • 如果redis有密码,要将auth=111添加到配置文件中
[root@nginx code]# rpm -qa | grep php | grep redis
php71w-pecl-redis-3.1.6-1.w7.x86_64

## 修改配置
[root@nginx code]# vim /etc/php.ini
;session.save_handler = files
session.save_handler = redis
session.save_path = "tcp://192.168.200.123:6379?&weight=1&timeout=2.5"

## 注释一下内容
[root@nginx code]# vim /etc/php-fpm.d/www.conf
;php_value[session.save_handler] = files
;php_value[session.save_path]    = /var/lib/php/session

[root@nginx code]# systemctl restart php-fpm

配置LB

[root@nginx conf.d]# vim /etc/nginx/conf.d/phpmyadmin.conf 
upstream phpmy {
  server 192.168.200.121:80;
  server 192.168.200.122:80;
}
server {
  listen 80;
  server_name www.php-myadmin.org;
    location / {
      proxy_pass http://phpmy;
      proxy_set_header Host $http_host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

[root@nginx conf.d]# systemctl reload nginx.service

测试

 登录redis查看session

[root@nginx ~]# redis-cli 
127.0.0.1:6379> KEYS *
1) "PHPREDIS_SESSION:76700eb33b48322e8159cfbbd9921d08"

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Nginx的反向代理配置中,可以通过配置相应的代理模块来实现会话保持。具体而言,Nginx提供了以下几种实现会话保持的方式: 1. 使用`ip_hash`负载均衡算法:可以通过在`upstream`块中设置`ip_hash`指令来实现会话保持。这样相同IP的请求将被转发到同一台后端服务器上,从而保持会话。 ```nginx upstream backend_servers { ip_hash; server backend1.example.com; server backend2.example.com; } ``` 2. 使用`sticky`模块:`sticky`模块是一个第三方模块,可以通过在`upstream`块中设置`sticky`指令来实现会话保持。它使用一些算法(如cookie、URL参数等)来标记和识别会话,将同一会话的请求转发到同一台后端服务器上。 ```nginx http { upstream backend_servers { sticky cookie srv_id expires=1h domain=.example.com path=/; server backend1.example.com; server backend2.example.com; } } ``` 3. 使用`ngx_http_upstream_session_sticky`模块:这是另一个第三方模块,可以通过在`upstream`块中设置相应的指令来实现会话保持。它使用一些算法(如cookie、URL参数等)来标记和识别会话,并将同一会话的请求转发到同一台后端服务器上。 需要注意的是,使用这些方法实现会话保持时,需要确保后端服务器之间能够共享会话信息,例如使用共享存储(如Redis)或使用会话复制机制等。 选择适合你场景的方法,并根据具体需求进行配置即可实现Nginx会话保持功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦有一把琐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值