Laravel保存文件到public文件夹出现Failed to open stream: Permission denied

Song4 次浏览0个评论2025年12月17日

我ubuntu+nginx+php,laravel 需要保存微信二维码文件,我已经创建了文件并且给了777 权限,但是有时候偶尔会报错Failed to open stream: Permission denied。这种是什么原因导致的呢?

一、什么权限导致的?

在 Ubuntu 中:

  • Nginx 默认以 www-data 用户运行
  • PHP-FPM(如果你用的是)也默认以 www-data 用户运行

但你执行 chmod 777 时,可能是用 root 或你的普通用户(如 ubuntu)操作的。

虽然 777 看似“所有人都能写”,但如果父目录权限不完整、或文件系统挂载限制、或存在 ACL/安全模块,仍可能失败。

. 确认 Web 服务实际运行用户

bash编辑# 查看 Nginx 和 PHP-FPM 的用户
ps aux | grep -E 'nginx|php-fpm'

输出类似:

text编辑www-data  1234  ... nginx: worker process
www-data  5678  ... php-fpm: pool www

→ 所有写操作都是 www-data 用户发起的。

二、解决办法

避免使用 777,改用正确所有权

777 是安全隐患,且在某些场景下无效。正确做法是让目录属于 www-data

bash编辑# 设置目录所有者为 www-data
sudo chown -R www-data:www-data /var/www/baidu/public/miniapps

# 设置合理权限(目录 755,文件 644,但写入目录需 775)
sudo chmod -R 775 /var/www/baidu/public/miniapps

或者Laravel 提供了 storage/app/public 目录用于存储公开文件,并通过软链接映射到 public/storage

更多相关好文