网站 403 别急着改 Nginx:Linux 文件权限与属主三分钟排错

举报
yd_260072176 发表于 2026/11/04 11:25:00 2026/11/04
【摘要】 前两天把网站迁到新服务器:Nginx 反向代理配好了、Let’s Encrypt 的证书也装上了,浏览器一敲域名——403 Forbidden。第一反应是 Nginx 配置写错了。把 server 块翻来覆去看了三遍,proxy_pass、root 路径、location 都没问题。重启 Nginx 还是 403。折腾了半个多小时,才想起来看一眼错误日志:2026/11/01 10:23:4...

前两天把网站迁到新服务器:Nginx 反向代理配好了、Let’s Encrypt 的证书也装上了,浏览器一敲域名——403 Forbidden。

第一反应是 Nginx 配置写错了。把 server 块翻来覆去看了三遍,proxy_pass、root 路径、location 都没问题。重启 Nginx 还是 403。折腾了半个多小时,才想起来看一眼错误日志:

2026/11/01 10:23:45 [error] 1234#1234: *1 open() "/var/www/blog/index.html" failed (13: Permission denied)

Permission denied。跟 Nginx 配置半毛钱关系没有,是文件权限的问题。

这其实是新手期最高频的乌龙之一:403 先看日志,再看配置。顺序反了,白折腾。

rwx 三分钟速记

ls -l 看到的 -rwxr-xr-- 十个字符:第一位是类型(- 普通文件、d 目录),后面九位分三组——属主、属组、其他人,每组 rwx:

  • r 读:文件能看内容,目录能列出文件名
  • w 写:文件能改内容,目录能新建/删除里面的文件
  • x 执行:文件能当程序跑,目录能"cd 进去"/路过

目录的 x 最容易被忽略:目录没有 x,这条路径你就走不过去,里面的文件权限再对也白搭。

数字表示就是把 rwx 换成 4、2、1 相加:rwx=7,r-x=5,r--=4。755 = 属主全权限、组和其他人读+路过;644 = 属主可写、其他人只读。

网站目录的正确姿势

记住一套万能组合,绝大多数静态站、反向代理的静态资源目录都适用:

# 目录 755:属主全权,其他人能进能看
find /var/www/blog -type d -exec chmod 755 {} \;

# 文件 644:属主可写,其他人只读
find /var/www/blog -type f -exec chmod 644 {} \;

几个特殊位置单独记:

  • 上传目录:程序要往里面写文件(比如用户头像),目录得给写权限。做法是 chmod 775 uploads,再把属组改成 Nginx 进程用户所在的组:chown root:www-data uploads。程序能写,外人依然动不了别人的文件。
  • 私钥/密钥文件:600,只有属主能读写。~/.ssh 目录 700、authorized_keys 600——SSH 对这个极其严格,权限放宽了反而拒绝登录(sshd 报 “bad ownership or modes”),这是安全设计,不是 bug。
  • 先确认 Nginx 进程用户:Debian/Ubuntu 下 worker 进程是 www-data,RHEL/CentOS 下是 nginx。ps aux | grep nginx 看一眼,网站文件"其他人"那组权限必须让它读得动。

三个真实踩坑

1. root 解压的包,Nginx 读不了。

用 root 把网站压缩包解到 /var/www,文件属主全是 root:root。Nginx worker 以 www-data 跑,"其他人"那组没权限 → 403。

解法:chown -R www-data:www-data /var/www/blog(RHEL 系换成 nginx:nginx)。凡是 root 经手放进去的文件,都顺手 chown 一下。

2. 图省事 chmod -R 777。

权限问题一急就 777 全开,403 是没了,但等于把大门钥匙挂在门上:任何本地用户、任何被攻破的进程都能改你的网站文件。更隐蔽的坑:有些程序(比如 SSH)看到权限过松直接罢工,777 反而制造新故障。记住:权限只给"刚好够用"的。

3. 路径中间某一级目录缺了 x。

网站放在 /home/deploy/blog,文件本身 644 好好的,Nginx 还是 403。原因是 /home/deploy 是 700——Nginx 连这条路都走不过去,根本到不了文件。

这是最难肉眼发现的一种,因为谁也不会去查父目录。用 namei -l /home/deploy/blog/index.html,它把路径每一级的权限逐行列出来,哪一级掉了链子一目了然。

403 排错三板斧(按顺序来)

  1. 看错误日志:tail /var/log/nginx/error.log,搜 Permission denied 或 (13:。日志说是权限,那就是权限,别去改配置。
  2. 逐层查权限:ls -ld 从网站目录往上逐级看,重点看"其他人"那组的 r-x;配合 namei -l 一次看穿整条路径。
  3. 核对属主与进程用户:ps aux | grep nginx 确认 worker 用户,ls -l 确认文件属主属组,缺啥补啥(chown/chmod),改完顺手 nginx -t 确认配置没被动坏。

如果日志里干干净净、没有 Permission denied,那才是配置层面的问题(比如缺 index 文件、autoindex 没开)——这时候再去翻 server 块不迟。

收尾记住一句话:权限管"谁能碰",配置管"怎么转"。403 出来先问"谁被拦下了",再问"路指得对不对"。顺序对了,三分钟定位;顺序反了,半小时白给。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。