项目目录下,无通过php mkdir的权限
- 首先,创建目录|文件权限,由目录|文件所在目录的w权限决定。
- 弄清楚哪个用户在mkdir。
- nginx配置里有user
- php-fpm配置里有user
- 显然,nginx配置的用户,一般对项目有r权限,可能还有日志所在目录|文件的w权限;而执行php函数mkdir,是php-fpm配置的用户去执行的。
- 通过
ps aux | grep php-fpm
查看php-fpm配置的用户是谁。 - 解决方法:可以将项目目录的owner和group改为php-fpm配置的用户对应的,也可以统一设置项目目录owner和group为nginx,nginx与php-fpm配置的用户均改为nginx。
- 引入新问题,phpmyadmin无法访问,报session权限问题
phpmyadmin session权限问题无法正常访问
-
刚开始不太理解报错的问题,期望通过日志获得更详细报错信息。
学会看日志——linux那套潜规则
ps aux | grep 服务
一般可查看到服务(或进程)的配置文件-
- access_log
- error_log
-
php-fpm日志
/etc/php-fpm.conf
配置/etc/php-fpm.d/www.conf
配置/etc/php.ini
配置
-
-
先梳理整体流程,理解期望获得的错误日志记录在哪里。
- nginx服务监听到http请求,匹配,当是.php结尾的url,就call本地(127.0.0.1:9000)的服务。(这是nginx配置文件代码的意图)。
- 127.0.0.1:9000端口的服务是php-fpm。
-
nginx日志:把错误日志等级开到info
vim /etc/nginx/nginx.conf ## 修改 error_log /var/log/nginx/error.log info;
没有得到详细的报错信息,说明不是nginx相关错误,并且php-fpm没有报错误报给nginx,nginx就当正常返回了。
-
php-fpm日志:
-
首先将
php.ini
,php-fpm配置的记录日志相关控制都打开。vim /etc/php.ini error_reporting = E_ALL & ~E_DEPRECATED display_errors = On display_startup_errors = On log_errors = On track_errors = On html_errors = On vim /etc/php-fpm.conf log_level = debug vim /etc/php-fpm.d/www.conf catch_workers_output = yes
-
发现即使访问一个php语法有错误的页面,仍没有记录日志。上网查得是因为修改了php-fpm的用户为nginx,而php-fpm日志目录的owner为apache。
-
修改owner为nginx后,访问php语法错误页面有日志。但访问phpmyadmin仍没记录日志,理解可以是phpmyadmin捕获了异常,自定义处理了,没继续抛给php。
-
最后还是上网查得,php-fpm修改后的用户nginx没有创建,写入session文件的权限
- phpmyadmin需要用到session,即要在指定目录(
/etc/php-fpm.d/www.conf
定义了session.save_path
),创建session文件,并写入内容 - 而目前session.save_path的owner是apache的
- phpmyadmin需要用到session,即要在指定目录(
-
-
最终解决:把session.save_path指定目录的owner改为nginx。
总结
- 优先通过查看错误日志找问题
- 把记录日志控制开关打开,并逐步调高日志等级。
- 梳理整个操作流程,确定报错应该记录在谁的错误日志。
- linux里权限问题优先考虑对某目录|文件执行操作的用户是否有该目录|文件的对应操作权限,即:
- 执行操作的用户是谁?
ps aux | grep php-fpm
一般可查看到 - 操作对象在哪?除项目目录外,可考虑
ps aux | grep php-fpm
一般可看到配置文件,再看配置文件制定的目录,可能是日志,session - 操作所属权限是r还是w或x?
- 对文件,很好理解
- 对目录:
- r -> ls
- w -> 创建,修改文件
- x -> cd
- 执行操作的用户是谁?