Redis实现phpMyAdmin的会话保持

负载均衡的情况下,两个phpMyAdmin会无法正常登录,因为session 不能共享。

一、规划

主机名 ip 用途
lnmp001 192.168.10.101 phpmyadmin-001
lnmp002 192.168.10.102 phpmyadmin-002
nginx 192.168.10.103 共享会话信息
mysql 192.168.10.104 单机数据库
redis 192.168.10.105 负载均衡入口
1
2
3
4
5
6
7
cat > /etc/hosts << EOF
192.168.10.101 lnmp001
192.168.10.102 lnmp002
192.168.10.103 nginx
192.168.10.104 mysql
192.168.10.105 redis
EOF
graph TD
    User((访问用户)) -->|HTTP/HTTPS| Nginx[Nginx 负载均衡
192.168.10.103] subgraph Web_Tier [Web 服务层 - phpMyAdmin] Nginx -->|轮询/权重| PMA1[phpMyAdmin-001
192.168.10.101] Nginx -->|轮询/权重| PMA2[phpMyAdmin-002
192.168.10.102] end subgraph Storage_Tier [数据与会话层] PMA1 -->|读写 Session| Redis[Redis 共享 Session
192.168.10.105] PMA2 -->|读写 Session| Redis PMA1 -->|SQL 查询| MySQL[MySQL 数据库
192.168.10.104] PMA2 -->|SQL 查询| MySQL end style Nginx fill:#f9f,stroke:#333,stroke-width:2px style Redis fill:#f66,stroke:#333,stroke-width:2px style MySQL fill:#69f,stroke:#333,stroke-width:2px

二、环境准备

2.1 LNMP 环境

  • 192.168.10.101
  • 192.168.10.102

其实LNMP的两台主机不需要处理数据库。

配置PHP、安装phpMyAdmin等。

1
tar xf lnmp-rpms-el7.tar.gz
1
yum localinstall lnmp-el7/*.rpm

2.2 Redis

  • 192.168.10.105

安装后暴露端口即可。

CentOS7下Redis7.0手册

2.3 MySQL

  • 192.168.10.104

主要包括数据库的初始化、创建用户和授权。

1
systemctl enable --now mariadb
1
mariadb-secure-installation

修改编码集

1
vi /etc/my.cnf.d/server.cnf
1
2
3
4
5
6
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
skip-character-set-client-handshake
max_connections = 500
1
vi /etc/my.cnf.d/client.cnf
1
2
[client]
default-character-set = utf8mb4
1
vi /etc/my.cnf.d/mysql-clients.cnf
1
2
[mysql]
default-character-set = utf8mb4
1
systemctl restart mysqld
1
mysql -uroot -p'Root21..'
1
2
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

创建用户和授权

1
mysql -uroot -p'Root21..'
1
2
CREATE USER 'phpmyadmin'@'192.168.10.%'
IDENTIFIED BY 'Phpmyadmin21..';
1
2
GRANT ALL PRIVILEGES ON *.* TO 'phpmyadmin'@'192.168.10.%';
FLUSH PRIVILEGES;
1
mysql -h 192.168.10.104 -u phpmyadmin -p'Phpmyadmin21..'

验证PHP访问

1
2
3
<?php
phpinfo();
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
// ===== MySQL 连接信息 =====
$mysql_host = '192.168.10.104';
$mysql_user = 'phpmyadmin';
$mysql_pass = 'Phpmyadmin21..';

// ===== 显示连接信息 =====
echo "<h2>MySQL 连接信息</h2>";
echo "Host: {$mysql_host}<br>";
echo "User: {$mysql_user}<br>";
echo "Password: {$mysql_pass}<br><br>";

// ===== 建立连接 =====
$conn = new mysqli($mysql_host, $mysql_user, $mysql_pass);

// 连接检查
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}

echo "<h2>数据库列表</h2>";

// ===== 查询所有数据库 =====
$result = $conn->query("SHOW DATABASES");

if ($result) {
echo "<ul>";
while ($row = $result->fetch_array()) {
echo "<li>" . htmlspecialchars($row[0]) . "</li>";
}
echo "</ul>";
} else {
echo "查询数据库失败";
}

// ===== 关闭连接 =====
$conn->close();
?>

2.4 phpMyAdmin

  • 192.168.10.101
  • 192.168.10.102
1
mkdir -pv /www/wwwroot
1
unzip phpMyAdmin-5.2.3-all-languages.zip -d /www/wwwroot
1
mv /www/wwwroot/phpMyAdmin-5.2.3-all-languages/ /www/wwwroot/phpmyadmin
  1. 配置nginx
1
vim /etc/nginx/conf.d/admin.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
server{
listen 80;
server_name admin.bravexist.cn;

root /www/wwwroot/phpmyadmin;
index index.php index.html;

location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
  1. php-fpm 配置
1
vi /etc/php-fpm.d/www.conf
1
2
3
4
5
6
7
user = nginx
group = nginx

listen = /run/php-fpm/www.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
1
php-fpm -t
1
vi /etc/php.ini
1
2
3
4
5
memory_limit = 256M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 300
date.timezone = Asia/Shanghai
  1. 启动
1
systemctl restart nginx php-fpm
1
systemctl status nginx php-fpm
  1. 修改权限
1
chown nginx.nginx -R /var/lib/php/session
  1. 分别做解析,访问 http://admin.bravexist.cn

  2. 修改数据库的地址

1
cd /www/wwwroot/phpmyadmin
1
cp config.sample.inc.php config.inc.php
1
vim config.inc.php
1
grep -w host config.inc.php
1
2
[root@node1 /www/wwwroot/phpmyadmin]# grep -w host config.inc.php 
$cfg['Servers'][$i]['host'] = '192.168.10.104';
1
2
phpmyadmin
Phpmyadmin21..

2.5 Nginx

192.168.10.103入口做负载均衡

1
vim /etc/nginx/conf.d/admin.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
upstream adminsPool{
server 192.168.10.101:80;
server 192.168.10.102:80;
}
server{
listen 80;
server_name admin.bravexist.cn;

location / {
proxy_pass http://adminsPool;

proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
}
}
1
systemctl enable --now nginx

域名解析到负载均衡入口,尝试登录,发现无法成功登录。

三、会话共享

  • 192.168.10.101
  • 192.168.10.102

安装扩展

1
yum install -y php-redis

修改 session 配置

1
vim /etc/php-fpm.d/session.conf
1
egrep -v ';|^$' /etc/php-fpm.d/www.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[session]
user = nginx
group = nginx
listen = 127.0.0.1:9001
listen = /run/php-fpm/session.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
slowlog = /var/log/php-fpm/www-slow.log
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
php_value[session.save_handler] = redis
php_value[session.save_path] = "tcp://192.168.10.105:6379?auth=redispwd"
php_value[soap.wsdl_cache_dir] = /var/lib/php/wsdlcache

修改 nginx关键配置

1
vim /etc/nginx/conf.d/admin.conf
1
fastcgi_pass unix:/run/php-fpm/session.sock;
1
nginx -t && nginx -s reload

访问验证

http://admin.bravexist.cn

redis-server 验证

1
redis-cli -a redispwd
1
keys *

四、总结

不知不觉花费了不少时间,有不少的坑点,

  • 修改配置后,忘记在 nginxfastcgi 修改引用的配置
  • 目录的权限忘记修改
  • php插件忘记安装 php-redis