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
安装后暴露端口即可。
CentOS7下Redis7.0手册
2.3 MySQL
主要包括数据库的初始化、创建用户和授权。
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 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_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
| unzip phpMyAdmin-5.2.3-all-languages.zip -d /www/wwwroot
|
1
| mv /www/wwwroot/phpMyAdmin-5.2.3-all-languages/ /www/wwwroot/phpmyadmin
|
- 配置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; } }
|
- 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 2 3 4 5
| memory_limit = 256M upload_max_filesize = 64M post_max_size = 64M max_execution_time = 300 date.timezone = Asia/Shanghai
|
- 启动
1
| systemctl restart nginx php-fpm
|
1
| systemctl status nginx php-fpm
|
- 修改权限
1
| chown nginx.nginx -R /var/lib/php/session
|
分别做解析,访问 http://admin.bravexist.cn
修改数据库的地址
1
| cd /www/wwwroot/phpmyadmin
|
1
| cp config.sample.inc.php 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 验证
四、总结
不知不觉花费了不少时间,有不少的坑点,
- 修改配置后,忘记在
nginx 中 fastcgi 修改引用的配置
- 目录的权限忘记修改
- php插件忘记安装
php-redis