【问题标题】:Laravel daily log created with wrong permissions使用错误权限创建的 Laravel 每日日志
【发布时间】:2015-02-24 19:07:33
【问题描述】:

我有一个使用 php artisan(使用 root 用户)运行的脚本,有时它会导致在 apache www-data 之前创建每日日志文件用户会 - 这意味着当真实用户使用我的 Web 应用程序时,我会收到文件夹权限错误:

无法打开流:权限被拒绝

我每次都将权限改回 www-data,但我想通过始终使用正确权限创建日志文件来解决此问题。

我考虑过创建一个 cron 作业来创建文件或触摸它以确保它每天都具有正确的权限,但我正在寻找一种更好的解决方案,它不依赖于其他脚本。

我们还考虑将 php artisan 包装在另一个脚本中,以确保它始终使用 www-data 凭据运行,但我们想要做的事情实际上是 root 不应允许 apache 执行的程序。

还有什么建议吗?

【问题讨论】:

  • 在每天午夜将cron 作业设置为touch 一个新的日志文件(当然是在正确的用户下)。
  • @BenHarold 谢谢,我们已经考虑过了,但我不想涉及更多脚本。
  • 在这种情况下,您需要以要创建日志文件的用户身份运行 php artisan
  • @BenHarold 再次感谢,我们也考虑过这一点,这可能是最好的方法,但我更新了问题以解释为什么这也不理想。
  • 对我有用的是使用 sudo crontab -u www-data -e 以 www-data 用户身份执行 cron

标签: laravel-4 file-permissions


【解决方案1】:

Laravel 5.6.10 及更高版本支持 singledaily 驱动程序的配置 (config/logging.php) 中的 permission 元素:

    'daily' => [
        'driver' => 'daily',
        'path' => storage_path('logs/laravel.log'),
        'level' => 'debug',
        'days' => 7,
        'permission' => 0664,
    ],

无需在引导脚本中处理 Monolog。

具体来说,在https://github.com/laravel/framework/commit/4d31633dca9594c9121afbbaa0190210de28fed8 中添加了支持。

【讨论】:

  • 这应该在官方文档中!
  • 此答案中缺少撇号。它应该是“许可”=>“0664”。那么这个答案就完美了!
  • @Phil Nope - 这只是 Monologs 流处理程序的包装器,它接受 int 权限。 Monolog 包装 php.net/manual/en/function.chmod.php - 请注意,需要前导 0 以确保它是八进制值
  • 'permission' => 0664 为我工作(不带引号)
  • @Friedrich 如果您的日志文件是使用“root”作为文件所有者创建的,这可能表明您在设置网络服务器方面存在更大的问题
【解决方案2】:

重要此答案与 laravel 5.5+ 不兼容。请看这个答案:Custom (dynamic) log file names with laravel5.6

让我们从不变的开始。

你有一个php artisan 命令,由root 运行。

假设这个命令每天执行一次是安全的。

解决方案 1:

鉴于创建文件的用户默认是有写入权限的用户,我们可以按用户将日志分开:

App/start/global.php

/*
|--------------------------------------------------------------------------
| Application Error Logger
|--------------------------------------------------------------------------
|
| Here we will configure the error logger setup for the application which
| is built on top of the wonderful Monolog library. By default we will
| build a basic log file setup which creates a single file for logs.
|
*/

Log::useDailyFiles(storage_path().'/logs/laravel-'.posix_getpwuid(posix_geteuid())['name'].'.log');

如果您的 www-data 用户要创建错误日志,则会导致:storage/logs/laravel-www-data-2015-4-27.log

如果您的 root 用户要创建错误日志,则会导致:storage/logs/laravel-root-2015-4-27.log

解决方案 2:

在 php 脚本中更改 artisan 命令使用的日志。

在您的 run() 函数中,在开头添加这一行:

Log::useFiles(storage_path().'/logs/laravel-'.__CLASS__.'-'.Carbon::now()->format('Y-m-d').'.log');

如果您的班级名称是ArtisanRunner,那么您的日志文件将为:

storage/logs/laravel-ArtisanRunner-2015-4-27.log.

结论:解决方案 1 更好,因为它按用户描述了您的日志,因此不会发生错误。

编辑:正如 jason 所指出的,get_current_user() 返回脚本的所有者名称。因此,要应用解决方案 1,chown 您的工匠类文件到所需的用户名。

【讨论】:

  • 请注意,get_current_user() 返回当前 PHP 脚本的所有者(根据 php.net),而不是当前运行该脚本的用户。我改用php_sapi_name(),它给出了倾向于作为不同用户运行的php处理程序(例如apache或cli)的名称。
  • 我可以建议将执行脚本的用户名和 php_sapi_name 结合使用,因为许多用户可以从 CLI 执行 Laravel,例如一些 DBA 访问您的服务器,或者您可能希望 Laravel CRON 作为 apache 运行。您可以使用 posix_getpwuid(posix_geteuid())['name']; 获取执行此脚本的进程名称;请参阅下面的完整帖子。
  • 这需要更新到最新的 Laravel 版本:v5+
  • @ShankarSBavan 这与 laravel 5.5+ 不兼容
  • @ShankarSBavan 检查此答案以获得兼容的解决方案:stackoverflow.com/questions/50305186/…
【解决方案3】:
cd /path/to/project
chown -R www-data:root .
chmod -R g+s .

【讨论】:

  • 这是一个糟糕的建议,不要这样做
【解决方案4】:

如果您使用的是Laravel Envoyer,以下是在 Linux 中使用 ACL 的可能修复:

1。首先,在服务器上以root 权限运行以下脚本:

在这两个脚本中,您需要按照以下说明替换变量:

  • {{MASTER_PATH}}:您的虚拟主机目录的路径(例如,包含您的应用程序的文件夹)。
  • {{WEB_SERVER_USER}}:您的网络服务器使用的用户。
  • {{DEPLOYMENT_USER}}:运行您的部署脚本的用户。
#!/bin/bash

DIRS="storage current/bootstrap/cache"
MASTER_PATH={{MASTER_PATH}}

if [ -d $MASTER_PATH ]; then 
    cd $MASTER_PATH
    for p in `ls $MASTER_PATH`; do 
        if [ -d $MASTER_PATH/$p ]; then     
        cd $MASTER_PATH/$p
            echo "Project: $p -> $MASTER_PATH/$p"
            for i in $DIRS; do 
                echo "- directory: $i" 
                if [ -d $i ]; then 
                    echo "-- checking ACL..."
                    HAS_ACL=`getfacl -p $i | grep "^user:{{WEB_SERVER_USER}}:.*w" | wc -l`
                    if [  $HAS_ACL -eq 0 ]; then 
                        echo "--- applying $i"
                        setfacl -L -R -m u:{{WEB_SERVER_USER}}:rwX -m u:{{DEPLOYMENT_USER}}:rwX $i
                        setfacl -dL -R -m u:{{WEB_SERVER_USER}}:rwX -m u:{{DEPLOYMENT_USER}}:rwX $i
                    else
                        echo "--- skipping $i"
                    fi
                fi
            done
        echo "--------------"
        fi
    done
else
    echo "No $MASTER_PATH - skipping overall"
fi

2。在“Activate New Release”>“Before This Action

下在 envoyer 上设置以下部署挂钩
PROJECT_DIRS="storage"
RELEASE_DIRS="bootstrap/cache"
 
cd {{ project }}
 
for i in $PROJECT_DIRS; do
  if [ -d $i ]; then
    HAS_ACL=`getfacl -p $i | grep "^user:{{WEB_SERVER_USER}}:.*w" | wc -l`
    if [  $HAS_ACL -eq 0 ]; then
      echo "ACL set for directory {{project}}/$i"
      setfacl -L -R -m u:{{WEB_SERVER_USER}}:rwX -m u:{{DEPLOYMENT_USER}}:rwX $i
      setfacl -dL -R -m u:{{WEB_SERVER_USER}}:rwX -m u:{{DEPLOYMENT_USER}}:rwX $i
    fi
  fi
done
 
cd {{ release }}
 
for i in $RELEASE_DIRS; do
  if [ -d $i ]; then
    HAS_ACL=`getfacl -p $i | grep "^user:{{WEB_SERVER_USER}}:.*w" | wc -l`
    if [  $HAS_ACL -eq 0 ]; then
      echo "ACL set for directory {{project}}/$i"
      setfacl -L -R -m u:{{WEB_SERVER_USER}}:rwX -m u:{{DEPLOYMENT_USER}}:rwX $i
      setfacl -dL -R -m u:{{WEB_SERVER_USER}}:rwX -m u:{{DEPLOYMENT_USER}}:rwX $i
    fi
  fi
done

3。重新部署您的应用程序

现在重新部署您的应用程序,它应该可以继续工作。

注意:1.中定义的脚本应该在每次向机器添加新项目时运行。

【讨论】:

    【解决方案5】:

    这个解决方案肯定适用于 Laravel V5.1 - V6.x

    出现此错误的原因:

    • 主要是权限问题造成的
    • 在您的根目录中找不到环境变量或.env 文件
    • PHP 扩展问题
    • 数据库问题

    修复:

    • 设置正确的权限:
      • 运行这些命令 (Ubuntu/Debian)
    find /path/to/your/root/dir/ -type f -exec chmod 644 {} \;
    find /path/to/your/root/dir/ -type d -exec chmod 755 {} \;
    
    chown -R www-data:www-data /path/to/your/root/dir/
    
    chgrp -R www-data storage bootstrap/cache
    chmod -R ug+rwx storage bootstrap/cache
    
    • 如果 .env 文件不存在,请通过touch .env 创建一个并粘贴您的环境变量,然后运行
       php artisan key:generate
       php artisan cache:clear
       php artisan config:clear
       composer dump-autoload
       php artisan migrate //only if not already migrated
    

    【讨论】:

      【解决方案6】:

      对我来说,这个问题不仅仅是日志权限......我遇到了与引导/缓存和存储文件夹相关的任何问题,其中一个用户将创建一个文件/文件夹,而另一个用户将无法编辑/删除到标准的 644 和 755 权限。

      典型的场景是:

      • bootstrap/cache/compiled.php 文件由 apache 用户创建,但 composer 用户在执行 composer install 命令时无法编辑

      • apache 用户创建的缓存无法使用 composer 用户清除

      • 上述可怕的日志竞争条件。

      梦想是无论哪个用户创建文件/文件夹,其他需要访问的用户都拥有与原作者完全相同的权限。

      TL;DR?

      这是如何完成的。

      我们需要创建一个名为 laravel 的共享用户组,该组由所有需要访问 storage 和 bootstrap/cache 目录的用户组成。 接下来我们需要确保新创建的文件和文件夹分别具有 laravel 组和 664 和 775 权限。

      对现有文件/目录执行此操作很容易,但需要一点技巧来调整默认文件/文件夹创建规则...

      ## create user group
      sudo groupadd laravel
      
      ## add composer user to group
      sudo gpasswd -a composer-user laravel
      
      ## add web server to group
      sudo gpasswd -a apache laravel
      
      ## jump to laravel path
      sudo cd /path/to/your/beautiful/laravel-application
      
      ## optional: temporary disable any daemons that may read/write files/folders
      ## For example Apache & Queues
      
      ## optional: if you've been playing around with permissions
      ## consider resetting all files and directories to the default
      sudo find ./ -type d -exec chmod 755 {} \;
      sudo find ./ -type f -exec chmod 644 {} \;
      
      ## give users part of the laravel group the standard RW and RWX
      ## permissions for the existing files and folders respectively
      sudo chown -R :laravel ./storage
      sudo chown -R :laravel ./bootstrap/cache
      sudo find ./storage -type d -exec chmod 775 {} \;
      sudo find ./bootstrap/cache -type d -exec chmod 775 {} \;
      sudo find ./storage -type f -exec chmod 664 {} \;
      sudo find ./bootstrap/cache -type f -exec chmod 664 {} \;
      
      
      ## give the newly created files/directories the group of the parent directory 
      ## e.g. the laravel group
      sudo find ./bootstrap/cache -type d -exec chmod g+s {} \;
      sudo find ./storage -type d -exec chmod g+s {} \;
      
      ## let newly created files/directories inherit the default owner 
      ## permissions up to maximum permission of rwx e.g. new files get 664, 
      ## folders get 775
      sudo setfacl -R -d -m g::rwx ./storage
      sudo setfacl -R -d -m g::rwx ./bootstrap/cache
      
      ## Reboot so group file permissions refresh (required on Debian and Centos)
      sudo shutdown now -r
      
      ## optional: enable any daemons we disabled like Apache & Queues
      

      纯粹出于调试目的,我发现将日志拆分为 cli/web + 用户是有益的,因此我稍微修改了 Sam Wilson 的答案。我的用例是队列在它自己的用户下运行,因此它有助于区分使用 cli(例如单元测试)的作曲家用户和队列守护进程。

      $app->configureMonologUsing(function(MonologLogger $monolog) {
           $processUser = posix_getpwuid(posix_geteuid());
           $processName= $processUser['name'];
      
           $filename = storage_path('logs/laravel-'.php_sapi_name().'-'.$processName.'.log');
           $handler = new MonologHandlerRotatingFileHandler($filename);
           $monolog->pushHandler($handler);
      }); 
      

      【讨论】:

      • 这很好。但是,一旦您运行了 setfacl 命令,您的 configureMonologUsing 代码仍然需要吗?
      【解决方案7】:

      Laravel 5.1

      在我们的例子中,我们希望创建所有日志文件,以便 deploy 组中的所有内容都具有读/写权限。因此,我们需要创建具有0664 权限的所有新文件,而不是默认的0644

      我们还添加了一个格式化程序来添加换行符以提高可读性:

      $app->configureMonologUsing(function(Monolog\Logger $monolog) {
          $filename = storage_path('/logs/laravel.log');
          $handler = new Monolog\Handler\RotatingFileHandler($filename, 0, \Monolog\Logger::DEBUG, true, 0664);
          $handler->setFormatter(new \Monolog\Formatter\LineFormatter(null, null, true, true));
          $monolog->pushHandler($handler);
      });
      

      也可以将它与接受的答案结合起来

      $app->configureMonologUsing(function(Monolog\Logger $monolog) {
          $filename = storage_path('/logs/laravel-' . php_sapi_name() . '.log');
          $handler = new Monolog\Handler\RotatingFileHandler($filename, 0, \Monolog\Logger::DEBUG, true, 0664);
          $handler->setFormatter(new \Monolog\Formatter\LineFormatter(null, null, true, true));
          $monolog->pushHandler($handler);
      });
      

      【讨论】:

        【解决方案8】:

        您可以简单地在您的 artisan 命令中更改日志文件的权限:

        $path = storage_path('log/daily.log');
        chown($path, get_current_user());
        

        get_current_user() 将返回当前脚本的用户。

        换句话说,daily.log 将始终拥有 www-data 作为其所有者,即使您将脚本初始化为 root 用户。

        【讨论】:

        • 这也适用于 Laravel 5.3 吗?
        • @Mohal 是的 get_current_user() 是一个 php 原生函数
        【解决方案9】:

        Laravel 5.8

        Laravel 5.8 允许您在 config/logging.php 中设置日志名称。

        因此,使用以前的答案和 cmets,如果您想使用实际的 posix 用户名和 php_sapi_name() 值来命名您的日志,您只需要更改日志名称集。使用每日驱动程序允许按用户/api 组合运行日志轮换,这将确保日志始终由可以修改日志的帐户轮换。

        我还添加了对本地环境中可能不存在的 posix 函数的检查,在这种情况下,日志名称只是默认为标准。

        假设您使用默认的日志频道“每日”,您可以像这样修改您的“频道”键:

        # config/logging.php
        'channels' => [
            ...
            'daily' => [
                'driver' => 'daily',
                'path'   => storage_path(
                    function_exists('posix_getpwuid') 
                    && function_exists('posix_geteuid')
                        ? 'logs/laravel'
                            . '-' . php_sapi_name()
                            . '-' . posix_getpwuid(posix_geteuid())['name'] 
                            . '.log'
                        : 'logs/laravel.log'),
                'level'  => 'debug',
                'days'   => 15,
            ],
            ...
        

        这将产生一个日志名称,该名称对于每个组合都应该是唯一的,例如 laravel-cli-sfscs-2019-05-15.loglaravel-apache2handler-apache-2019-05-15.log,具体取决于您的接入点。

        【讨论】:

          【解决方案10】:

          我的工作方式非常简单:

          我在 Laravel 5.6

          上遇到了同样的问题

          config/logging.php 中,我刚刚更新了每日频道的路径值,其中包含php_sapi_name()

          这会为不同的 php_sapi_name 创建单独的持续时间,并将带有时间戳的日志文件放入它们的特定目录中。

          'daily' => [
                      'driver' => 'daily',
                      'path' => storage_path('logs/' . php_sapi_name() . '/laravel.log'),
                      'level' => 'debug',
                      'days' => 7,
                  ]
          

          对我来说,

          • fpm-fcgi 目录下创建日志文件:来自网站的日志,owner: www-data
          • 日志文件在cli 目录下创建:来自工匠命令(cronjob)。 owner: root

          更多关于 Laravel 5.6 日志的信息:https://laravel.com/docs/5.6/logging

          这是我的config/logging.php 文件:

          <?php
          
          return [
              /*
              |--------------------------------------------------------------------------
              | Default Log Channel
              |--------------------------------------------------------------------------
              |
              | This option defines the default log channel that gets used when writing
              | messages to the logs. The name specified in this option should match
              | one of the channels defined in the "channels" configuration array.
              |
              */
              'default' => env('LOG_CHANNEL', 'stack'),
              /*
              |--------------------------------------------------------------------------
              | Log Channels
              |--------------------------------------------------------------------------
              |
              | Here you may configure the log channels for your application. Out of
              | the box, Laravel uses the Monolog PHP logging library. This gives
              | you a variety of powerful log handlers / formatters to utilize.
              |
              | Available Drivers: "single", "daily", "slack", "syslog",
              |                    "errorlog", "custom", "stack"
              |
              */
              'channels' => [
                  'stack' => [
                      'driver' => 'stack',
                      'channels' => ['daily'],
                  ],
                  'single' => [
                      'driver' => 'single',
                      'path' => storage_path('logs/laravel.log'),
                      'level' => 'debug',
                  ],
                  'daily' => [
                      'driver' => 'daily',
                      'path' => storage_path('logs/' . php_sapi_name() . '/laravel.log'),
                      'level' => 'debug',
                      'days' => 7,
                  ],
                  'slack' => [
                      'driver' => 'slack',
                      'url' => env('LOG_SLACK_WEBHOOK_URL'),
                      'username' => 'Laravel Log',
                      'level' => 'critical',
                  ],
                  'syslog' => [
                      'driver' => 'syslog',
                      'level' => 'debug',
                  ],
                  'errorlog' => [
                      'driver' => 'errorlog',
                      'level' => 'debug',
                  ],
              ],
          ];
          

          【讨论】:

          • 很好......你的解决方案更干净......我现在正在测试它
          • 正如另一条评论中所指出的,日志只是故事的一部分。有编译视图、数据缓存、预缓存源代码,其中任何一个都可以由 web 或 cli 用户创建为本地文件。
          • 如果您使用 artisan config:cache 缓存配置,这将不起作用,因为它将使用 cli SAPI 创建配置缓存,该缓存将用于 CLI 和 Web 请求。
          • 这对我有用,试过get_current_user 不工作,但php_sapi_name 工作(虽然看起来更丑)
          • 我认为这是最快最好的方法。修改配置不修改 Laravel 的基本结构,只修改配置。
          【解决方案11】:

          (Laravel 5.6)我最近遇到了同样的问题,我只是设置了一个预定命令在/app/Console/Kernel.php 中运行。

          $schedule-&gt;exec('chown -R www-data:www-data /var/www/**********/storage/logs')-&gt;everyMinute();

          我知道这有点矫枉过正,但它就像一个魅力,从那以后没有任何问题。

          【讨论】:

          • 有效吗?是的,但是最佳做法是什么?我认为不会。
          • 我会说有点矫枉过正......如果你要做这样的事情,为什么不直接在 cron 中做呢?
          【解决方案12】:

          实现这项工作的一种非 Laravel 方法是将您的 cronjob 简单地执行为 www-data。

          例如https://askubuntu.com/questions/189189/how-to-run-crontab-as-userwww-data

          /etc/crontab
          
          */5 * * * * www-data php /var/www/public/voto_m/artisan top >/dev/null 2>&1

          【讨论】:

            【解决方案13】:

            Laravel 5.5

            将此代码添加到bootstrap/app.php

            $app->configureMonologUsing(function (Monolog\Logger $monolog) {
                $filename = storage_path('logs/' . php_sapi_name() . '-' . posix_getpwuid(posix_geteuid())['name'] . '.log');
                $monolog->pushHandler($handler = new Monolog\Handler\RotatingFileHandler($filename, 30));
                $handler->setFilenameFormat('laravel-{date}-{filename}', 'Y-m-d');
                $formatter = new \Monolog\Formatter\LineFormatter(null, null, true, true);
                $formatter->includeStacktraces();
                $handler->setFormatter($formatter);
            });
            
            • 它将像这样存储文件:laravel-2018-01-27-cli-raph.loglaravel-2018-01-27-fpm-cgi-raph.log,这样更易​​读。
            • 保留新行(作为默认 Laravel 行为)
            • 它适用于Laravel Log Viewer

            Laravel 5.6

            have to create a class 为您的记录器:

            <?php
            
            namespace App;
            
            use Monolog\Logger as MonologLogger;
            
            class Logger {
                public function __invoke(array $config)
                {
                    $monolog = new MonologLogger('my-logger');
                    $filename = storage_path('logs/' . php_sapi_name() . '-' . posix_getpwuid(posix_geteuid())['name'] . '.log');
                    $monolog->pushHandler($handler = new \Monolog\Handler\RotatingFileHandler($filename, 30));
                    $handler->setFilenameFormat('laravel-{date}-{filename}', 'Y-m-d');
                    $formatter = new \Monolog\Formatter\LineFormatter(null, null, true, true);
                    $formatter->includeStacktraces();
                    $handler->setFormatter($formatter);
                    return $monolog;
                }
            }
            

            然后,你必须在config/logging.php注册它:

            'channels' => [
                'custom' => [
                    'driver' => 'custom',
                    'via' => App\Logging\CreateCustomLogger::class,
                ],
            ],
            

            与 5.5 相同的行为:

            • 它将像这样存储文件:laravel-2018-01-27-cli-raph.loglaravel-2018-01-27-fpm-cgi-raph.log,这样更具可读性。
            • 保留新行(作为默认 Laravel 行为)
            • 它适用于Laravel Log Viewer

            【讨论】:

            • 最佳答案!荣誉
            【解决方案14】:

            Laravel 5.4

            \Log::getMonolog()->popHandler(); \Log::useDailyFiles(storage_path('/logs/laravel-').get_current_user().'.log');

            AppServiceProvider中添加boot函数

            【讨论】:

            • 这也适用于 Laravel 5.3 吗?
            【解决方案15】:

            我发现最好的方法是fideloper建议,http://fideloper.com/laravel-log-file-name,你可以设置laravel日志配置,不用touch Log类。 我认为控制台程序和 Http 程序使用不同的名称是最好的解决方案。

            【讨论】:

              【解决方案16】:

              对于 Laravel 5.1,我在 bootstrap/app.php 的底部使用以下内容(如 the docs 中所述):

              /**
               * Configure Monolog.
               */
              $app->configureMonologUsing(function(Monolog\Logger $monolog) {
                  $filename = storage_path('logs/laravel-'.php_sapi_name().'.log');
                  $handler = new Monolog\Handler\RotatingFileHandler($filename);
                  $monolog->pushHandler($handler);
              });
              

              当然,您可以使用许多其他处理程序来代替。

              【讨论】:

              • 我真的很喜欢这个答案,因为 1)它已更新到 5.1 和 2)使用文档中的方法来扩展日志行为。
              • 非常好,不需要额外的正向闪光,但仍然有效。它应该是... $filename = storage_path('logs/laravel-'.php_sapi_name().'.log');
              • 我可以建议同时使用执行脚本的用户名和 php_sapi_name 组合,因为许多用户可以从 CLI 执行 Laravel,例如一些 DBA 访问您的服务器,或者您可能希望 Laravel CRON 作为 apache 运行。您可以使用 posix_getpwuid(posix_geteuid())['name']; 获取执行此脚本的进程名称;请参阅下面的完整帖子。
              • 如何在 Laravel 5.6 中使用它?因为 Laravel 5.6 有一个全新的 Logging 系统。
              • 这也适用于 Laravel 5.3 吗?请回复!
              【解决方案17】:

              为此,您应该对文件和目录使用高级 ACL。 setfacl 将是您的答案。如果您想授予 www-data 用户权限以写入特定目录中的 root 的 文件,您可以这样做:

              setfacl -d -m default:www-data:you-chosen-group:rwx /my/folder
              

              发出此命令后,您将为 www-data 用户设置 rwx/my/folder/ 中所有文件的权限,无论这些文件是谁创建的。请参阅thisthis question 以供参考。另外,您可以查看docs for setfacl

              如果这有帮助,请告诉我。

              【讨论】:

              • 以下命令对我有用:setfacl -d -m g:www-data:rw /full/path/to/laravel/storage/logs 后跟 php artisan cache:clearcomposer dump-autoload
              【解决方案18】:

              app/start/artisan.php 文件的开头添加如下内容(这是 Laravel 4):

              // If effectively root, touch the log file and make sure it belongs to www-data
              if (posix_geteuid() === 0) {
                  $file = storage_path() . '/logs/laravel.log';
                  touch($file);
                  chown($file, 'www-data');
                  chgrp($file, 'www-data');
                  chmod($file, 0664);
              }
              

              如果您提到的每日日志文件不是标准的 Laravel 日志文件,请调整路径。您也可能不想像我在这里所做的那样更改组或设置权限。以上将组设置为www-data,并设置组写入权限。然后,我将我的普通用户添加到 www-data 组,以便以我的普通用户身份运行 artisan 命令仍然可以写入日志。

              一个相关的调整是将以下内容放在您的 app/start/global.php 文件的开头:

              umask(0002);
              

              如果你这样做,上面的chmod 行将变得毫无意义。将 umask 设置为这个后,PHP(以及 Laravel)创建的任何新文件的权限都将被屏蔽,以便“其他”用户没有写入权限。这意味着目录将以rwxrwxr-x 开头,文件以rw-rw-r-- 开头。因此,如果www-data 正在运行 PHP,则默认情况下,它生成的任何缓存和日志文件都可以被该用户主组中的任何人写入,即www-data

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2023-03-24
                • 2011-06-11
                • 1970-01-01
                • 1970-01-01
                • 2011-12-15
                • 2019-12-06
                相关资源
                最近更新 更多