找回密码
 立即注册
首页 业界区 业界 PHP 开发者应该理解的 Linux 入门权限指南 ...

PHP 开发者应该理解的 Linux 入门权限指南

布相 3 小时前
PHP 开发者应该理解的 Linux 入门权限指南

如果你曾经将 PHP 应用部署到 Linux 服务器并遇到 Permission denied 错误(通常出现在最糟糕的时候),你并不孤单。在理解 Linux 权限之前,它们确实会让人感到困惑。本文将帮助你理解 PHP 代码实际运行时涉及的用户、文件组以及那些 rwx 字母的真正含义。
原文链接-PHP 开发者应该理解的 Linux 入门权限指南
10秒速览

Linux 中的每个文件或目录都有:

  • 一个所有者(用户)
  • 一个所属组
  • 三组权限:所有者权限、组权限和其他用户权限
权限分为三种:

  • r = 读取
  • w = 写入
  • x = 执行(对文件)或"可进入"(对目录)
当 PHP 在服务器上运行时,你的代码通常以 web 服务器用户的身份执行(例如 Debian/Ubuntu 上的 www-data,CentOS/Red Hat 上的 apache,或者某些设置中的 nginx)——或者作为你配置的 PHP-FPM 池用户运行。大多数"在本地可以但在生产环境不行"的权限问题都可以归结为"到底是哪个用户在运行这段代码?"
专业解读权限

运行 ls -l 查看详情:
  1. $ ls -l
  2. -rw-r--r-- 1 deploy www-data  4238 Sep 17 10:12 index.php
  3. drwxr-xr-x 2 deploy www-data  4096 Sep 17 10:12 public
  4. drwxrwxr-x 4 deploy www-data  4096 Sep 17 10:12 storage
复制代码
-rw-r--r-- 的解析:

  • 第一个字符:文件类型(- 表示普通文件,d 表示目录)
  • 接下来 3 个:所有者权限(rw-)
  • 再 3 个:组权限(r--)
  • 最后 3 个:其他用户权限(r--)
所以 index.php 对所有人可读,但只有所有者可写。
你还会看到所有者(deploy)和组(www-data)。如果 PHP-FPM 以 www-data 运行,通常最简单的修复方法是给组设置正确的权限。
八进制 vs 符号模式(以及何时使用)

你可以使用以下两种方式设置权限:

  • 符号表示法:chmod g+w storage(给组添加写权限)
  • 八进制表示法:chmod 775 storage(所有者 rwx=7,组 rwx=7,其他用户 r-x=5)
常用的八进制组合:

  • 644 用于文件:所有者可读写,其他用户只读
  • 755 用于目录:所有者完全权限,其他用户可读可执行
  • 664/775 当组也需要写权限时(共享部署)
避免使用 777——这是安全风险,几乎从不需要。
文件 vs 目录:微妙但重要的区别

文件


  • r:可以读取内容
  • w:可以修改内容
  • x:可以执行(作为程序或脚本运行)
目录


  • r:可以列出目录中的文件名
  • w:可以在目录中创建/删除/重命名条目
  • x:可以进入(遍历)该目录
这就是为什么可写上传目录同时需要 w 和 x 权限:
  1. # 对于 PHP 需要写入的上传目录:
  2. chmod 775 uploads
  3. # 或者如果只需要所有者写入:
  4. chmod 755 uploads  # (但要确保所有权与 FPM 用户匹配)
复制代码
所有权:chown 和 chgrp

如果 web 服务器用户需要写入某个目录(例如 storage、cache、uploads),需要调整所有权或组:
  1. # 将 web 服务器组设为所有者组
  2. sudo chgrp -R www-data storage
  3. # 允许组写入(和进入)目录
  4. sudo chmod -R g+rwX storage
复制代码
大写的 X 只对目录(和已有的可执行文件)设置执行权限,这比通配符 +x 更安全。
如果你希望 web 服务器用户拥有文件:
  1. sudo chown -R www-data:www-data storage
复制代码
这在单用户服务器上很常见。在多用户部署中,建议保持代码库归人类用户所有(例如 deploy),同时使用共享组(例如 www-data)和组写权限。
umask:谁设置默认权限?

创建新文件时,它们会从一个"基础"值开始(通常是文件 666,目录 777),然后减去 umask 指定的权限。

  • umask 为 022 会得到 644 文件和 755 目录
  • umask 为 002 会得到 664 文件和 775 目录(组可写)
你可以在服务配置中(例如 PHP-FPM 的 systemd 单元文件)或 PHP 内部(进程范围内)设置 umask。
在 PHP 中(进程生命周期内):
[code]

相关推荐

您需要登录后才可以回帖 登录 | 立即注册