【问题标题】:Laravel Permission Denied Error on CentOs 7CentOs 7 上的 Laravel 权限被拒绝错误
【发布时间】:2020-04-18 19:31:58
【问题描述】:

我刚刚安装了带有 httpd、PHP 7.3 和 MariaDB 的 CentOs 7。我使用以下配置了虚拟主机:

<VirtualHost *:80>
  ServerName tenancy
  DocumentRoot /var/www/vhosts/tenancy/public
</VirtualHost>

我的应用程序显示了默认的 laravel 欢迎页面,但是每个与数据库交互的页面都得到了SQLSTATE[HY000] [2002] Permission denied (SQL: select * from tenant_modules where (tenant_id = 28))

虽然每次 api 调用,我都会收到 file_put_contents(/var/www/vhosts/tenancy/storage/framework/cache/data/44/d1/44d142505dd1a3b497197e2f459d2aec779e9ed6): failed to open stream: Permission denied

我已将 www 文件夹的权限设置为777 -R,甚至完成了chcon -R -t httpd_sys_rw_content_t -R \var\www,但仍然没有任何改变。另外,我编写了一个 php 函数来测试 mysql ext 并且可以正常工作。

但是当我运行php artisan serve 时,它运行良好。您知道可能的解决方案吗?

【问题讨论】:

  • 你确定你的用户和组有权在你的 Laravel 文件夹中读写吗?听起来httpd(或www-data)用户没有正确的权限。
  • 我已经将我的用户添加到 apache 组
  • 当然,这意味着您的用户可以读取和写入文件。但是,您的 Apache 用户似乎没有读写权限。我会发布一个答案,希望它会有所帮助。

标签: php laravel centos7


【解决方案1】:

看起来像是权限问题。我怀疑您的 Apache 用户在您的 Laravel 应用程序文件夹中没有读写权限。

我不确定 CentO 上的 Apache 用户/组是什么。我假设它是www-data,请根据需要更改。

免责声明:这适用于我的机器 (Debian),但可能有一些更好的方法来设置您的 Laravel 应用程序权限。欢迎反馈。


  1. 将您的用户添加到 www-data 组:

    sudo usermod -aG www-data youruser

  2. 更改您的项目用户和组所有权:

    sudo chown -R youruser:www-data /var/www/your-project/

  3. 将您的项目文件权限更改为 664:

    sudo find /var/www/your-project/ -type f -exec chmod 664 {} \;

  4. 将你的项目目录权限改为775:

    sudo find /var/www/your-project/ -type d -exec chmod 775 {} \;

  5. 设置 ACL 权限以确保网络服务器创建的新文件具有正确的权限:

    sudo setfacl -Rdm g:www-data:rw /var/www/your-project/bootstrap/cache/
    sudo setfacl -Rdm g:www-data:rw /var/www/your-project/storage/logs/
    sudo setfacl -Rdm g:www-data:rw /var/www/your-project/storage/framework/
    sudo setfacl -Rdm g:www-data:rw /var/www/your-project/storage/app/
    

【讨论】:

  • 在实施第 3 项时,我不断收到 find: missing argument to -exec。CentOs 中默认的 apache 用户/组是 apache
  • 不要将用户添加到 Apache 用户组,给予 Apache 访问内容的正确权限。
  • @CrazyMerlin 怎么样?
  • @LobsterBaz 大多数系统上的网络服务器已经可以访问某个地方来记录错误,也可以访问某个地方来临时存储文件。这些通常是 /var/log 和 /tmp。您可以在这些位置为您的应用程序创建文件夹,将组更改为 webserver 组(检查,不要假设......在 CentOS 上它是 httpd,在 Ubuntu 上它是 www-data)。这样做的原因是您可以轻松地将日志文件添加到 logrotate,并且垃圾收集器将清除不再使用的任何文件。如果要长期缓存,可以考虑 OPC、memcached 等。
  • 我不反对 Laravel 的做法,CakePHP 也是如此,许多其他框架也是如此。我不同意将用户添加到网络用户组,因为这不是正确的方法。我提供了一个可行且不涉及安全问题的解决方案。 CentOS 对此类问题更为严格,而 Debian 则不然。将同一个项目部署到 Debian 机器上,它很可能会正常工作。
猜你喜欢
  • 2016-05-02
  • 1970-01-01
  • 2016-10-18
  • 1970-01-01
  • 2015-05-05
  • 1970-01-01
  • 2020-08-25
  • 2022-01-13
  • 2013-12-16
相关资源
最近更新 更多