Linux 网站目录的文件权限应该怎么设置?
网站目录推荐权限:目录 755、文件 644、代码属主为部署用户,Web 服务器用户仅需读取;必要运行目录单独授权写入;上传目录禁执行、配置文件 600/640。绝对不要 777。本文给出完整设置命令与安全要点。
**推荐基线:目录 755、文件 644、代码属主设为部署用户,Web运行用户只读;仅必要运行目录可写。**下面是完整做法和例外场景。
标准设置
# 将deploy替换为实际部署账号,先确认站点目录不混入上传/机密/运行数据
sudo chown -R deploy:www-data /var/www/html
# 所有目录 755(rwxr-xr-x)
sudo find /var/www/html -type d -exec chmod 755 {} \;
# 所有文件 644(rw-r--r--)
sudo find /var/www/html -type f -exec chmod 644 {} \;
755 让 Web 服务器能读取和执行(目录的 x 位是"可进入"),644 让文件可读不可被其他用户改写。
例外场景
上传目录:仅授权应用写入所需目录,可按隔离需求使用750/640等最小权限,最好放Web根之外;还必须——禁止执行其中的脚本(Nginx 配置里对 uploads 路径禁用 PHP 解析等),防止用户上传 webshell 被执行。
含敏感信息的配置文件(数据库密码、API 密钥):
chmod 600 wp-config.php # 仅属主可读写
# 或 640,允许同组读
chmod 640 config.php
需要 Web 服务器写入的目录(缓存、日志、会话):属主给 www-data 并保持 755 即可——不需要给"其他人"写权限。
红线:永远不要 777
chmod 777 意味着系统上任何进程都能改写你的网站文件,是服务器入侵后篡改页面的经典帮凶。遇到"权限不够"的正确解法是调整属主/属组,不是放开权限。
排障思路
网站 403 且日志报 Permission denied 时按序检查:路径上每一级父目录的 x 位 → 文件读权限 → SELinux 上下文(RHEL/CentOS 上 restorecon -Rv /var/www)。
排查多台 Web 主机时,可在观测云集中查询已采集的 Nginx 错误日志,按主机、时间及 Permission denied 筛选。把错误中的具体路径与上面的逐级权限检查对应起来,再重试请求,确认修改后错误不再出现。
常见问题(FAQ)
Q:部署用户和 www-data 都要写怎么办?
把两者放进同一属组,目录设 2775(setgid 位让新文件继承属组):仅对明确需要共享写入的运行目录用 find -type d 设置2770/2775,文件另设660/664并配umask或ACL;不要递归给所有代码文件加执行/setgid或写权限。
Q:SELinux 开着时 chmod 对了还是 403?
检查文件上下文:ls -Z。只读Web内容常用httpd_sys_content_t,写目录需匹配策略;自定义路径先持久配置fcontext规则,restorecon只按既有规则恢复,不自动授权所有访问。
Q:WordPress 之类需要自动更新怎么办?
优先由部署流程更新;确需Web进程自动更新时只对必要路径临时授予写权限并评估风险。失败可能涉及属主、模式、ACL或安全策略,不能仅归因属主。