上一次将某网站迁移到 CentOS 7 之后,运营和开发人员一直没有反映有什么问题,直到今天下午开发人员告诉我他在目录里放的一个 phpmyadmin 不能登陆,提示是“无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正并正确配置 PHP 安装”,放狗搜之,发现可能是 php 的 session.save_path 有问题。
稍微看了一下这个的作用:
PHP session 变量用于存储有关用户会话的信息,或更改用户会话的设置。Session 变量保存的信息是单一用户的,并且可供应用程序中的所有页面使用——w3school
查看 php 错误日志:
cat /var/log/php-fpm/www-error.log | grep session PHP Warning: Unknown: open(/var/lib/php/session/sess_73623e1pgfdtqn1m6gqt8kuet3, O_RDWR) failed: No such file or directory (2) in Unknown PHP Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/var/lib/php/session)
检查该目录,发现竟然是目录不存在(什么鬼,这种目录不应该是自动生成的吗),于是手动生成:
mkdir /var/lib/php/session chown nginx:nginx /var/lib/php/ -R
再访问发现错误依旧,继续查看目录,发现错误变了:
PHP Warning: session_start(): open(/var/lib/php/session/sess_l7feo7vocafag6840ltsp6frj4, O_RDWR) failed: Permission denied (13) in /home/www/xxxxxx/class.main.php on line 131
检查目录权限为755,似乎没有问题。
打开 htop 查看 PHP 进程,惊讶地发现 CentOS 7 下的 php-fpm 进程是以 apache 用户和组启动的,而我的服务器上根本没安装 apache2 或是 httpd 包,虽然可以手动修改 php-fpm 的配置文件
/etc/php-fpm.d/www.conf
更改这个配置,我很好奇为什么默认配置会是这样,在 Debian 系下从来没有见过这种默认配置。
事后在 stackoverflow 查到这样一个问题, Debian 和 CentOS 的默认 session.save_path 有所不同, 迁移的时候并没有用到 phpmyadmin (我自己也不用这个),虽然在迁移前 diff 对比过新旧服务器的 php.ini 以确保配置是一致的,但是发行版区别的坑实在是不踩到一次就很难注意到,比如这次的问题,在上线前只是让开发人员简单的测试了一下功能,覆盖不够完全,等用到了才发现问题,好在 phpmyadmin 不是什么很重要的功能,问题解决的很快没有造成什么影响。
本文链接:https://www.starduster.me/2015/08/11/centos7-linux-pma-session-error/
本站基于 Creactive Commons BY-NC-SA 4.0 License 允许并欢迎您在注明来源和非商业使用前提下自由地对本文进行复制、分享或基于本文进行创作。
请注意:受限于笔者水平,本站内容可能存在主观臆断或事实错误,文中信息也可能因时间推移而不再准确,在此提醒读者结合自身判断谨慎地采纳。