网站 403 别急着改 Nginx:Linux 文件权限与属主三分钟排错
前两天把网站迁到新服务器: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_keys600——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 排错三板斧(按顺序来)
- 看错误日志:
tail /var/log/nginx/error.log,搜Permission denied或(13:。日志说是权限,那就是权限,别去改配置。 - 逐层查权限:
ls -ld从网站目录往上逐级看,重点看"其他人"那组的r-x;配合namei -l一次看穿整条路径。 - 核对属主与进程用户:
ps aux | grep nginx确认 worker 用户,ls -l确认文件属主属组,缺啥补啥(chown/chmod),改完顺手nginx -t确认配置没被动坏。
如果日志里干干净净、没有 Permission denied,那才是配置层面的问题(比如缺 index 文件、autoindex 没开)——这时候再去翻 server 块不迟。
收尾记住一句话:权限管"谁能碰",配置管"怎么转"。403 出来先问"谁被拦下了",再问"路指得对不对"。顺序对了,三分钟定位;顺序反了,半小时白给。
- 点赞
- 收藏
- 关注作者
评论(0)