nginx启动后,访问时服务器返回的权限拒绝错误,核心问题是 nginx 进程没有访问 /data/portal/html/index.html 文件的权限(错误码 13: permission denied)。
错误原因分析
这个错误的本质是 linux 系统的权限机制导致的:
- nginx 通常以
nginx、www-data或nobody用户身份运行 - 该用户对目标文件
index.html或其所在的目录(如/data/portal/html/)没有读权限 - 也可能是目录的执行权限缺失(linux 中要访问目录内文件,需要目录有执行权限)
解决方案
以下是一步步的排查和修复步骤:
1. 先确认 nginx 运行用户
执行以下命令查看 nginx 进程的运行用户:
ps aux | grep nginx # 或更精准的方式 grep -r "user " /etc/nginx/nginx.conf /etc/nginx/conf.d/
输出示例(常见的是 nginx 或 www-data):
user nginx; # 这就是 nginx 运行用户
2. 检查文件和目录权限
# 检查 index.html 文件权限 ls -l /data/portal/html/index.html # 检查上级目录权限(需要逐层检查) ls -ld /data/portal/html/ ls -ld /data/portal/ ls -ld /data/
正常的权限示例(文件至少有读权限,目录至少有读 + 执行权限):
# 文件权限(-rw-r--r-- 表示所有用户可读) -rw-r--r-- 1 root root 1234 feb 9 10:00 /data/anti/apps/portal/html/index.html # 目录权限(drwxr-xr-x 表示所有用户可进入+读取) drwxr-xr-x 2 root root 4096 feb 9 10:00 /data/anti/apps/portal/html/
3. 修复权限(核心步骤)
方案 1:直接修改文件 / 目录所属用户(推荐)
将文件和目录的所有者改为 nginx 运行用户(假设是 nginx):
# 递归修改目录所属用户 chown -r nginx:nginx /data/portal/html/ # 确保文件有读权限,目录有读+执行权限 chmod -r 755 /data/portal/html/ # 目录权限 chmod 644 /data/portal/html/index.html # 文件权限
方案 2:如果不想改所属用户,可开放其他用户的读权限
# 给所有用户添加读权限(文件) chmod o+r /data/portal/html/index.html # 给所有用户添加读+执行权限(目录) chmod o+rx /data/portal/html/
4. 验证修复效果
# 切换到 nginx 用户,尝试读取文件 su - nginx -c "cat /data/portal/html/index.html" # 重启 nginx 确保配置生效 systemctl restart nginx # 测试访问 curl http://x.x.x.x:22080
如果能正常返回 index.html 的内容,说明权限问题已解决。
深度排查与修复步骤
1. 先完整检查权限链(关键!)
linux 访问文件需要从根目录到目标文件的所有上级目录都有执行权限,只改 html 目录不够,需要逐层检查:
# 检查所有上级目录的权限(执行+读) ls -ld /data ls -ld /data/portal ls -ld /data/portal/html # 检查 index.html 文件本身 ls -l /data/portal/html/index.html
合格的权限标准:
- 所有目录:权限列必须包含
x(执行)和r(读),比如drwxr-xr-x(其他用户至少有--x) - index.html 文件:权限列必须包含
r(读),比如-rw-r--r--
2. 修复全链路权限
如果发现某一级目录权限不足,执行以下命令统一修复:
# 给所有上级目录添加执行+读权限(递归修复/data/anti目录下所有目录) chmod -r 755 /data/portal # 单独确保文件是644权限(只读,更安全) chmod 644 /data/portal/html/index.html # 再次确认nginx用户(比如nginx)拥有目录/文件的所有权 chown -r nginx:nginx /data/portal/html
3. 排查 selinux 限制(centos/rhel 系统必做)
这是最容易被忽略的原因!selinux 会限制 nginx 访问非默认网页目录:
# 1. 先临时关闭selinux,测试是否解决问题 setenforce 0 # 2. 重新访问测试(curl或浏览器) curl http://x.x.x.x:22080 # 3. 如果临时关闭后正常,说明是selinux问题,永久修复(无需关闭selinux): # 给目标目录添加nginx可访问的selinux上下文 chcon -r -t httpd_sys_content_t /data/portal/html/ # 4. 恢复selinux(可选,推荐开启) setenforce 1
4. 验证 nginx 用户能否读取文件
直接模拟 nginx 用户访问文件,确认权限真的生效:
# 切换到nginx用户(如果提示无法切换,用su -s指定shell) su - nginx -s /bin/bash -c "cat /data/portal/html/index.html" # 如果输出index.html内容,说明权限完全正常;如果报错,继续排查
5. 重启 nginx 并测试
# 重启nginx加载权限变更 systemctl restart nginx # 测试访问 curl -i http://x.x.x.x:22080 # 正常输出应该包含:http/1.1 200 ok
额外注意事项
- selinux 干扰:如果是 centos/rhel 系统,selinux 可能会阻止 nginx 访问非默认目录,可临时关闭验证
setenforce 0 # 临时关闭 # 永久关闭(需重启):修改 /etc/selinux/config 中 selinux=disabled
- nginx 配置检查:确保 nginx 配置中
root路径正确,且没有deny all;之类的限制规则。
总结
- 核心问题:nginx 运行用户对
index.html文件 / 所在目录无读 / 执行权限;权限问题不仅要检查目标文件 / 目录,还要检查所有上级目录的执行权限; - 修复关键:要么将文件 / 目录所属用户改为 nginx 用户,要么开放其他用户的读权限;
- 验证方法:切换到 nginx 用户测试读取文件,重启 nginx 后访问目标地址。验证时直接用 nginx 运行用户访问文件,能快速定位是否真的解决了权限问题。
- centos/rhel 系统需重点排查 selinux 限制(最常见的 “隐形权限问题”);
到此这篇关于nginx访问无权限的问题解决的文章就介绍到这了,更多相关nginx访问无权限内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论