nginx 403 错误本质是操作系统级访问拒绝,核心原因在于 nginx 工作进程用户(如 www-data 或 nginx)缺乏对目标文件路径的读取权限或父目录的执行(x)权限,需依次排查用户匹配、目录 x 权限、selinux/apparmor 限制及 root 路径真实性。

直接说结论:Nginx 本身不处理 Linux 文件系统权限,它只按配置中指定的用户身份去读取文件;真正的“目录权限访问控制”其实是两层叠加——nginx 进程用户对文件路径的读取权限 + Nginx 配置层的路由/访问规则。漏掉任何一层,都会出现 Permission denied 或 403 错误。
确认 Nginx 运行用户和文件属主是否匹配
这是最容易被跳过的一步,但却是 80% 的 403 来源。Nginx 不是以 root 启动的(安全限制),默认用的是 www-data(Debian/Ubuntu)或 nginx(CentOS/RHEL)。你得让这个用户能「进入」目录树并「读取」目标文件。
- 查 Nginx 用户:
grep "user" /etc/nginx/nginx.conf,常见输出如user www-data; - 查目标目录路径权限:
ls -ld /var/www/html,确保该目录及其所有上级目录(如/var、/var/www)对www-data有执行(x)权限——否则进不去 - 查文件权限:
ls -l /var/www/html/index.html,确保www-data有读取(r)权限 - 修复属主(推荐):
sudo chown -R www-data:www-data /var/www/html,再设权限:sudo find /var/www/html -type d -exec chmod 755 {} \;和sudo find /var/www/html -type f -exec chmod 644 {} \;
用 location + allow/deny 控制 IP 级访问范围
这不是文件权限,而是 HTTP 请求入口的过滤。适用于后台接口、运维目录等需要白名单的场景,且必须写在 location 块内,顺序不能错。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
-
allow和deny按顺序逐条匹配,第一条命中即生效,后续忽略 - 必须把
deny all放在最后,否则前面的allow无效 - 支持 CIDR 写法:
allow 192.168.1.0/24、allow 2001:db8::/32,IPv6 要加方括号:allow [2001:db8::1]; - 示例(仅允许内网访问
/admin/):location ^~ /admin/ {<br> allow 10.0.0.0/8;<br> deny all;<br>}注意用了^~,避免被正则 location 覆盖
禁止敏感文件被直接下载
防止 .git、.env、composer.json 等被暴露,靠正则匹配 URI 路径,不是靠文件系统权限。
-
location ~ /\. { deny all; }:拒绝所有以点开头的隐藏文件(.htaccess、.gitignore) -
location ~ ^/(.git|\.svn|\.hg|\.project|composer\.json|package\.json)$ { deny all; }:注意\.是转义点号,^/确保只匹配根路径下,不会误杀/assets/js/.git.js这类正常文件 - 这类规则要放在
location /之前,否则可能被更宽泛的 location 拦截不到
需要写入时的权限特别处理
静态资源读取只需 r 权限,但上传、日志生成、缓存写入等操作需要 w。Nginx 自身不写文件,但常配合 PHP-FPM 或 Node.js,这时要同步调整对应服务的运行用户。
- 如果 PHP 脚本要写
/var/www/html/upload/,确保该目录属主是www-data且权限为755(目录)或775(需组写入) - PHP-FPM 的用户配置在
/etc/php/*/fpm/pool.d/www.conf中,检查user = www-data和group = www-data - 不要用
chmod 777,哪怕临时测试也不建议——攻击者可利用任意写权限上传 Webshell - 上传目录可单独放宽:
sudo chmod 775 /var/www/html/upload,再确保所属组包含www-data
真正卡住人的往往不是某条指令写错,而是 nginx 用户没权限进上级目录、deny all 写在了 allow 前面、或者正则里忘了转义点号。调的时候先 nginx -t,再看 error log 里的具体路径和用户,比盲猜快得多。










