关于在Laravel PHP 中目录文件权限问题解决的思考

in PHP with 0 comment
最近维护系统的时候,总是会有一些预料之外的错误

大抵他们都会是这个样子:

failed to open stream: Permission denied

这个问题,其实非常简单,按照常规做法,chmod -R 777 对应目录/* 即可

但是

这种做法最多只能从表面上快速解决问题,同时也为日后埋下了隐患.

我们需要关注的是,为什么会产生如此低层次的问题, 经过当前项目,我再衍生了一些可能导致的原因

好了,通过如上整理,我们大概理清楚了思绪,大概能表达出基本的跟原因

再通过其上原因根据需求,具体分析解决

解决

统一归属权限,统一归属权限组

再 Linux 中,我们可以列出我们的权限和权限组的所具备的功能

图片描述...
图片描述...
图片描述...

当然,我们可以使用 Linux 命令 来了解我们当前的目录和文件情况: ls -alh

图片描述...

我们要区分好这三者

所以

-
-

根据如上,我们可以总结出,我们针对其可以用什么权限了

因为我们这里的使用场景比较单一,开发则运维,运维则开发,所以我们设置如下权限

rw-rw-rw- 其对应权限代码 为 666 (所有用户都有文件读、写权限)

并且我们的用户组/用户,统一设置为: www/www

具体的 设置 定时任务、运维工具的权限,这里就不细说了,官方会提供文档,告知如何设置执行权限

这里参考 supervisor

图片描述...

运维方面级别

由于运维即开发,开发为运维,那么,我们应该分离职责。

当需要全局服务器配置的时候,允许使用 root 进行连接, 当只是调查 bug,如查询日志,执行命令的时候,我们应该规范的是使用 跳板机 和 指定用户组用户进行登录,并且可以将其用户组划分至 www 用户组

这个涉及到一些 基础的 linux 命令,如创建用户,创建用户组等等,这里不详细解释,可以查看一些基础命令

代码层面控制

我们已经根据如上,把外部问题解决了,那么我们可以开始解决第内部层面的问题

在代码层面,由于我们已经严格控制了外部的问题,只要是用户组运行对应环境,那么我们基本上可以杜绝权限相关的问题了。但是我们也可以按需对我们的一些基本功能日志进行划分,尽可能的避免出现外部影响内部

我们可以根据实际代码来解决

这里我们针对 mysql 输出 日志,我们在 AppServiceProvider 中, 设置了 日志监听

    \DB::connection('mysql')->listen(
        function ($query) {
            $prefix = is_cli() ? "logs/sql-cli-" : "logs/sql-";
            $url = "";
            if(request()) {
                $url = request()->fullUrl();
            }
            $tmp = str_replace('?', '"'.'%s'.'"', $query->sql);
            try {
                $tmp = vsprintf($tmp, $query->bindings);
            }catch (\Throwable $e) {}
            $file = $prefix . date("Y-m-d") .".log";
            $tmp = str_replace("\\", "", $tmp) . PHP_EOL;
            $msg = '--' . $query->time .'ms | ' . format_now() . "; url:$url|" . PHP_EOL . $tmp . PHP_EOL;

            error_log($msg, '3', storage_path($file));
        }
    );

我们可以尝试使用 monolog, 也可以尝试我的日志包: https://github.com/surest-sky/laravel-echo-log

图片描述...

请注意: chgrp、chown 都是危险的函数,没必要不要开。没开的话,可以按照 运维方面级别方面解决问题,尽量不要使用其他用户在服务器操作
图片描述...

Comments are closed.