首页 > 编程语言 >php session_start() open failed Permission denied,session.save_path的解决办法

php session_start() open failed Permission denied,session.save_path的解决办法

时间:2022-11-26 10:13:08浏览次数:51  
标签:web 权限 failed nginx session save root php

1.背景

  公司最近来了一个新游戏项目,游戏入口程序居然见到了许多年未见的php环境,虽然很久没有接触,但是这种东西不是简简单单嘛,怀着这种心态,慢慢的走进了一个小坑,搞了1个多小时,居然刚开始连基础的排错思路都给忘了。

  先说一下环境:

软件 版本 安装方式
nginx 1.20.1 yum
php 74 yum

  很简单的环境,很简单的安装过程,以上也是为了快速,使用yum安装,一切都安装完成,服务也启动成功。

  这里使用root部署的代码,代码目录是root所属主和所属组,所以研发程序写入一些文件的时候,代码下的文件夹必须给其它组开777权限(研发网页程序往代码目录写文件的时候用户不是root用户或者root组,而是其它组;可能是程序的运行用户,如nginx的nginx或者php74的apache用户),并且用root放置代码目录一点安全意识也没有且该目录还是nginx的根目录并且还是777权限,于是想全部使用非root权限来进行。实现如下方式:

  1. nginx和php使用非root用户运行(这个使用yum安装的时候已经做好了)
  2. 代码目录使用非root用户管理,如web用户

  很久之前nginx+php一般使用源码安装,具体的配置自己比较清楚,所以改起来相对方便熟悉一点。当然yum安装也可以使用rpm -ql也查看具体的配置。于是开始按照以下步骤去优化环境。

  1. 创建web普通用户,不予许sudo提权。
  2. 修改nginx的/etc/nginx/nginx.conf文件,将运行用户由nginx改为web
  3. 修改php74的/etc/opt/remi/php74/php-fpm.d/www.conf,将运行用户由apache改为web
  4. 程序代码目录所属主和所属组改为web

  以上流程按照以前使用源码安装的方式,基本就完成了,即使有些小问题,根据报错慢慢改嘛,也改不了几个地方,于是就怀着很快就能解决的心态开始踩了1小时的坑。

 

2.排错过程

  开始登陆后台管理网页报错,错误为访问session文件没有权限

  

  于是按照报错路径去查看目录,结果一看,session目录居然还是root:apache的权限,下面的session文件更离谱,全部都是apache:apache权限。

  (下面的图片不用在意什么主机上执行的,反正这就是没改之前的)

  

  于是手动直接chown -R web:web session,并且赋予了777权限做测试,这一波应该稳了吧?于是开始登陆后台网页进行测试,结果不报错了,甚至网页可以登录,但是登录进去一片空白。于是赶紧去查看session目录。是不是改变权限命令没有执行?

  

  在确认目录权限有了之后进入到session目录,发现用户的具体session只有500权限

  

  权限也改了,这个权限没有问题,怎么回事?这里开始觉得是不是即使我是web用户,由于是yum安装,很多东西都是官方大神们打包好的,会不会php程序写入的时候还是使用root或者apache,我程序读却又是web,或者写入的时候是web,读取的时候是apache或者root,会不会这是一个bug?php74使用yum安装就没办法改变这玩意?

  因为即使session目录权限是777,但是每次生成的session是500啊,这样,每次生成的session,其它组用户是没有权限做任何事情的。

  于是百度了好半天,甚至有人说官方给的解决方案就是一个配置session.save_path=/tmp就可以解决

  

  于是找到配置vim /etc/opt/remi/php74/php-fpm.d/www.conf并且修改这一行想看看是否可行,到底是不是权限的原因,这里就不展示过程了,因为一个吊样,网页登录之后一篇空白,看来还是session的问题。

  (甚至都改了/etc/opt/remi/php74/php.ini的这个配置,php和php-fpm都有这个配置)

  看来还得解决创建session就是500的问题,于是根据配置文件里面的注释,找到了官方文档,看看能不能创建的时候直接给权限777。

  

  https://www.php.net/manual/zh/session.configuration.php#ini.session.save-path

  

  这个配置好了之后,权限果然发生了改变(这里就欠着图了,环境没有了),结果网页可以登录,但是登录进入之后还是一片白板。

  到这里,突然想到,为什么有nginx的访问日志我不去看?这...,于是打开网站的访问日志。

  

  nginx目录没有权限?于是赶紧切换到这个目录下。

  

    立马chown -R web:web tmp

  

  问题解决,一切正常

 

3.总结

  提醒大家出现问题看日志就不说了,毕竟正常的运维都会看日志,本人可能太久没有搞

  技术导致大脑短路一小时,以为是很复杂的问题,结果啪啪啪打脸。

  所以这里也做一个简单的记录

  如果有yum 安装nginx+php环境,需要切换到其它的非root用户运营的时候,记得以下2点。

  1. 修改nginx /var/lig/nginx的权限给到运行用户
  2. 修改php的session权限给到php的运行用户。

 

  题外小记

  当初搜索到一篇文章,自我觉得不可能是nginx的问题,所以就略过了,当初如果

  看完了这篇文章,也不至于浪费一个小时。这里还是截个图保留一下

  

 

 

 

 

   

标签:web,权限,failed,nginx,session,save,root,php
From: https://www.cnblogs.com/lizexiong/p/16926968.html

相关文章