标签归档:Redis缓存

Redis 缓存 PHP 7.2 session 变量共享

一般负载均衡内容有两种形式,一种是静态,另一种是动态,动态网站内容就可能需要进行交互,那么就涉及到session共享的问题。默认PHP是将session存储在LocalDisk,如果是多台php主机之间进行负载,那么该如何共享session?今天我们就解决这个问题。

session会话共享文件有很多种方式:

分布式文件共享;NFS,NAS文件存储等。
Nginx负载均衡ip_hash模块,固定访客到后端某台服务器。
将session存储到数据库中;例如MySQL,Memcached,Redis,Mongodb等。

我个人比较倾向于将session存储到Redis数据库,用这种方式来同步session共享,不仅不会加大数据库的负担,而且安全性比cookie更高,把session放到内存里面,比从磁盘文件中读取会快很多。“有人认为;那我把所有的缓存软件都安装,速度岂不是更快,那就不是缓存加速了,而演变成了缓存库了”。

php语言脚本默认不支持对Redis的操作,所以需要安装第三方phpRedis扩展模块,让其支持对Redis的操作,至于如何安装使用phpRedis,可以参考我前面写的文章《phpRedis扩展模块安装配置使用》。此外这里还需要一台Redis服务器,请参阅《Linux Centos7 Redis 3.2.9 源码编译安装配置》。

1.修改PHP配置文件php.ini将session存储到Redis中。

# vim /usr/local/php/etc/php.ini

session.save_handler = files
;session.save_path = "N;/path"

修改为:

session.save_handler = Redis
session.save_path = “tcp://10.10.204.66:6379”

;如果Redis有密码连接方式
session.save_path = “tcp://10.10.204.66:6379?auth=password”

 

2.重启php-fpm服务生效

# systemctl restart php-fpm

以上所有过程均是经过手工测试的,99%可用于生产。

Linux Centos7 Redis 4.0.1 源码编译安装配置

最近做Nginx负载均衡配置,由于我们是交互性网站,必须用到session,尝试了多种方案,最后选择了Redis做为数据库缓存服务器。

Redis官方简介

Redis是一个开源(BSD许可),内存数据结构存储,用作数据库,缓存和消息代理。它支持的数据结构,例如字符串,散列,列表,集合,具有范围查询的排序集,位图,超文本和具有半径查询的地理空间索引。Redis内置复制,Lua脚本,LRU驱逐,事务和不同级别的磁盘持久性,并通过Redis Sentinel提供高可用性,并通过Redis Cluster进行自动分区。

进入正题,无论是物理或虚拟化服务器,Redis安装方法都没有区别,接下来我就开始安装操作。

 

实验OS:CentOS Linux release 7.3.1611 (Core) x64

 

1.先决扩展条件

安装扩展包以及依赖包
# yum install epel-release -y 
# yum install gcc gcc-c++ jemalloc-devel

2.Redis安装

下载解压 将其移动到/usr/local目录,创建目录以及用户和组,并给予目录权限,最后创建软连接。

# wget //download.redis.io/releases/redis-4.0.1.tar.gz
# tar zxvf redis-4.0.1.tar.gz
# mv redis-4.0.1 /usr/local/
# cd /usr/local/
# mkdir -p /usr/local/redis-4.0.1/logs
# mkdir -p /usr/local/redis-4.0.1/rdb
# groupadd redis
# useradd -g redis -s /sbin/nologin redis
# chown -R redis:redis /usr/local/redis-4.0.1/logs
# chown -R redis:redis /usr/local/redis-4.0.1/rdb
# chown redis:redis /usr/local/redis-4.0.1/redis.conf
# make && make install
# ln -s redis-4.0.1 redis

3.配置文件

生产环境中以下信息是必须修改的,所以可以根据自己的需求进行修改 /usr/local/redis-4.0.1/redis.conf 此文件

port 6379 #监听端口,默认是6379
daemonize yes #如果需要在后台运行,把该项改为yes
requirepass foobared #去掉前边#注释,修改foobared为你想配置的任意密码
bind 10.10.204.65 #默认bind的填写127.0.0.1这样配置是只允许本地访问,想远程访问就改本机网卡配置的ip地址。多个IP 请使用空格隔开
pidfile /usr/local/redis/logs/redis.pid
logfile "/usr/local/redis/logs/redis.log" #设置日志文件路径
dir /usr/local/redis-4.0.1/rdb #持久化文件存储路径
supervised systemd #默认为no,由于我们正在运行一个使用systemd init系统的操作系统,所以我们可以将其更改为systemd

除了上述几个设置外,还有其他的等一些参数,有需要可以按照配置文件的说明修改。

4.测试redis启动

 # /usr/local/redis/src/redis-server /usr/local/redis/redis.conf
 ...
 WARNING The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
 WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
 WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

可以看到存在3条启动警告信息:

第一个错误和第二个错误可以同时解决,第一个错误大概是说somaxconn的值128设置过小,此值受限于系统的somaxconn与tcp_max_syn_backlog这两个值,所以应该把这两个内核参数值调大,第二个错误是过量使用内存设置为0!在低内存环境下,后台保存可能失败。请在/etc/sysctl.conf 添加一项 ‘vm.overcommit_memory = 1′ ,然后重启(或者运行命令’sysctl vm.overcommit_memory=1’ )使其生效。

 # vim /etc/sysctl.conf
 net.core.somaxconn = 20480
 #最大队列长度,应付突发的大并发连接请求,默认为128
 net.ipv4.tcp_max_syn_backlog = 20480
 #半连接队列长度,此值受限于内存大小,默认为1024
 vm.overcommit_memory = 1
 #过量使用内存设置为0!
 # sysctl -p

第三个警告错误是需要关闭Linux (THP) 透明内存

 # vim /etc/rc.local
 echo never > /sys/kernel/mm/transparent_hugepage/enabled #在开机脚本里追加此命令

至此3个错误已经解决,再次启动的时候就不会报警告信息。

5.创建一个Redis系统单元文件

# vim /usr/lib/systemd/system/redis.service
[Unit]
Description=Redis persistent key-value database
After=network.target

[Service]
User=redis
Group=redis
ExecStart=/usr/local/bin/redis-server /usr/local/redis/redis.conf --daemonize no
ExecStop=/usr/local/bin/redis-cli -p 6379 shutdown
Restart=always

[Install]
WantedBy=multi-user.target

6.启动redis并加入开机启动

# systemctl daemon-reload 
# systemctl start redis.service 
# systemctl enable redis.service

7.查看是否启动

# ps -A | grep redis
 6167 ? 00:00:00 redis-server

8.加入防火墙

# firewall-cmd --zone=public --add-port=6379/tcp --permanent
# firewall-cmd --reload
# firewall-cmd --zone=public --list-ports

9.测试连接成功

# redis-cli
127.0.0.1:6379>

到目前为止redis已经完成安装,其实生产环境的安装也是如此,只不过需求不同,redis.conf中的修改内容不同。