部署phpMyAdmin需确保PHP、Web服务器和MySQL客户端就绪,使用unarchive解压至/var/www/phpmyadmin,template动态生成config.inc.php,配置session.save_path并修复SELinux上下文。

直接部署 phpMyAdmin 到 Rocky Linux 9 的 Ansible Playbook 不能只靠 copy 或 unarchive 就完事——它依赖 PHP、Web 服务器(Nginx/Apache)、MySQL 连接能力,且默认配置会因 SELinux、php-fpm 用户权限、session.save_path 目录不可写而白屏或登录循环。必须把 phpMyAdmin 当作一个「有状态的 Web 应用」来处理,而非静态文件。
确认目标节点已就绪:PHP + Web 服务 + MySQL 客户端
phpMyAdmin 本身不带 PHP 或 Web 服务,它只是个前端界面。Ansible 执行前必须确保目标机已满足三项硬依赖:
-
php版本 ≥ 7.4(Rocky 9 默认是php-8.0,可用;但若手动降级过,需检查php -v) - Web 服务(如
nginx或httpd)已安装并监听 80/443,且能解析.php文件(即已配好fastcgi_pass或ProxyPassMatch) -
mysql命令行客户端已安装(dnf install -y mysql),否则 phpMyAdmin 初始化时连不上数据库会报mysqli extension is missing
建议在 Playbook 开头加一个 pre_tasks 检查:
- name: Verify PHP CLI is available command: php --version register: php_version changed_when: false
- name: Fail if PHP not found fail: msg: "PHP is not installed or not in PATH" when: php_version.rc != 0
下载与解压要避开 /var/www/html 根目录直写风险
直接 unarchive src=... dest=/var/www/html 会导致 phpMyAdmin 覆盖整个网站根目录,且后续升级难回滚。正确做法是单独建子目录,并设为非 root 用户可写(因为 phpMyAdmin 需要写 config.inc.php 和临时 session):
- 使用
unarchive下载官方 .tar.gz(推荐 https://www.php.cn/link/a7da12778cb1cfb4b4ae833ea9a0e849 最新版,如phpMyAdmin-5.2.2-all-languages.tar.gz) -
dest设为/var/www/phpmyadmin,不是/var/www/html - 显式设置
owner: nginx(或apache)和group: nginx,避免 SELinux context 错乱 - 执行后运行
restorecon -Rv /var/www/phpmyadmin确保上下文为httpd_sys_content_t
示例任务:
- name: Download and extract phpMyAdmin
unarchive:
src: https://files.phpmyadmin.net/phpMyAdmin/5.2.2/phpMyAdmin-5.2.2-all-languages.tar.gz
dest: /var/www/phpmyadmin
remote_src: true
owner: nginx
group: nginx
mode: '0755'
- name: Restore SELinux context command: restorecon -Rv /var/www/phpmyadmin args: executable: /bin/bash
config.inc.php 必须用 template 动态生成,不能 copy 静态文件
硬编码的 config.inc.php 在不同环境(如 dev/staging/prod)会出问题,且 blowfish_secret 必须随机生成、$cfg['Servers'][$i]['host'] 必须指向真实 MySQL 地址。Ansible 的 template 模块是唯一安全方式:
- 模板中用
{{ mysql_host }}、{{ mysql_port }}等变量注入,从 inventory 或 role vars 传入 -
blowfish_secret用{{ lookup('password', '/dev/null length=32 chars=ascii_letters,digits') }}每次生成新密钥 - 禁用
$cfg['LoginCookieValidity']或设为合理值(如 14400 秒),否则登录后 30 分钟自动登出 - 务必设置
$cfg['TempDir'] = '/var/lib/php/session';并确保该路径由php-fpm用户可写
关键点:该文件最终属主必须是 nginx(或 apache),权限 0644,否则 phpMyAdmin 启动时报 Cannot load or save configuration。
SELinux 和 systemd 限制下,session 目录权限最容易被忽略
Rocky Linux 9 默认启用 SELinux 且 php-fpm 运行在 php-fpm.service 下,其 PrivateTmp=true 会导致 session 写入失败。现象是登录页反复跳转、提示 Session start failed:
- 不要改
PrivateTmp=false(违反安全原则),而是显式配置session.save_path - 在
/etc/php-fpm.d/www.conf中设置:php_value[session.save_path] = /var/lib/php/session - 确保目录存在、属主为
nginx:nginx(或apache:apache)、权限0755 - 运行
semanage fcontext -a -t httpd_var_lib_t "/var/lib/php/session(/.*)?"并restorecon -Rv /var/lib/php/session
这一步漏掉,所有后续调试都是徒劳——你看到的错误日志里不会提 SELinux,只会显示 session 初始化失败。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











