centos 7上nginx 报错,open() "test.min.css" failed (13: Permission denied

在CentOS 7上配置好Django和Nginx后,遇到静态文件无法访问的问题,日志显示'permission denied'。检查静态文件目录权限无误后,通过Google搜索解决方案,发现是SELinux导致的问题。解决步骤包括安装audit.log分析工具,创建并应用Nginx的白名单策略,然后恢复SELinux到强制模式。最终问题得到解决,静态文件能正常访问。

OS: Centos7

Kernal: 3.10.0-327.el7.x86_64


在配置好django及相应的nginx反向代理后

发现web打开没有找到静态文件,nginx日志报permission denied, 检查过程如下:

1. 检查/var/www/static目录的属主和权限,发现属主非www(nginx worker以www用户启动),权限正确

    chown -R www.www /var/www/static

        修改后发现仍然没有静态文件


2. 没办法,google,发现stackoverflow如下回答:

I've just had the same problem on a CentOS 7 box.

Seems I'd hit selinux. Putting selinux into permissive mode (setenforce permissive) has worked round the problem for now. I'll try and get back with a proper fix.

在命令行执行指令setenforce permissive后刷新恢复

这种办法只是把selinux的安全级别降低了,至于如何彻底解决,还在研究


补充:

经过不停的google+各种关键词,终于找到彻底解决办法:

1. 安装audit.log的相关分析工具集

yum install setroubleshoot


2.  产生可访问的白名单

cat /var/log/audit/audit.log| grep nginx |audit2allow -M mynginx


3. 使白名单生效

semodule -i mynginx.pp


4. 恢复selinux默认功能

setenforce enforcing


再次刷新页面,静态文件正常,问题解决

附上selinux的介绍:

SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统。NSA是在Linux社区的帮助下开发了一种访问控制体系,在这种访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件


<think> 首先,用户的问题是关于解决Nginx错误:'/home/nginx/html/index.html' 出现 'forbidden (13: Permission denied)'。我需要基于系统指令和提供的引用内容来回答。 系统指令: - 所有行内数学表达式用$...$格式(但这里可能不涉及数学,所以忽略)。 - 独立公式用$$...$$(同样不适用)。 - LaTeX语法正确(中文回答中可能需要小心特殊字符)。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,如[^1]。 用户问题:用户想查找解决 '/home/nginx/html/index.html' 出现 'forbidden (13: Permission denied)' 错误的解决方案。 提供的引用: - [^1]: 描述了Nginx错误日志,显示出文件禁止访问,权限被拒绝,涉及路径如"/usr/local/anda/web/andacx-web-admin/index.html"。 - [^2]: 提到解决Nginx 403 forbidden的四种方法,包括查看日志、权限问题。 - [^3]: 提到一种方法及重启Nginx的命令。 - [^4]: 涉及访问Nginx报403,检查配置和安装命令。 用户的问题是针对特定路径:'/home/nginx/html/index.html'。我需要基于常见原因给出解决方案。常见原因包括: 1. 文件权限问题:Nginx用户(通常是nginx或www-data)没有权限读取文件。 2. 目录权限问题:父目录权限不足。 3. SELinux或AppArmor安全策略限制(在Linux系统)。 4. Nginx配置错误。 5. 文件所有权问题。 从引用中提取有用信息: - [^2]提到四种方法:检查日志、修改权限、检查所有权、安全策略。 - [^3]提到重启Nginx的命令。 - [^4]提到安装和配置检查。 我的回答结构: - 清晰、步骤化解决用户问题。 - 引用相关引用内容。 - 生成相关问题。 - 使用中文。 回答框架: 1. **介绍问题**:解释该错误通常是由于权限问题引起的。 2. **步骤解决方案**: a. 检查文件权限:确保文件可读。 b. 检查目录权限:确保目录可执行(因为需要访问目录内容)。 c. 检查文件所有权:Nginx用户应有读取权限。 d. 检查安全模块:如SELinux或AppArmor。 e. 重启Nginx。 3. **引用相关引用**:在适当位置添加引用标识。 4. **总结**。 生成相关问题: - 基于错误类型,生成相关问题,如: 1. 如何修改文件权限在Linux中? 2. 如何配置SELinux以允许Nginx访问? 3. Nginx的其他常见错误有哪些? 4. 如何调试Nginx日志? 确保回答真实可靠:基于标准Nginx故障排除知识。 完整回答: - **开头**:直接针对问题。 - **步骤**:列出具体命令和检查点。 - **结尾**:生成相关问题。 最终输出格式: - 回答内容。 - §§相关问题§§ 部分。 </think> ### 解决 '/home/nginx/html/index.html' 出现 'forbidden (13: Permission denied)' 错误的方法 这个错误通常是由于Nginx进程没有权限访问指定文件或目录导致的。权限问题可能涉及文件权限、目录权限、文件所有权或安全策略(如SELinux)。基于您提供的引用内容和标准Nginx故障排除步骤,以下是详细的解决方案。请按照顺序逐一检查,并在每一步后测试Nginx是否恢复正常。 #### 步骤 1: 检查文件权限 Nginx需要读取权限才能访问文件。确保文件权限设置为允许Nginx用户(通常是`nginx`或`www-data`)读取。 - 使用命令查看文件权限: ```bash ls -l /home/nginx/html/index.html ``` 输出示例:`-rw-r--r-- 1 root root 1024 Feb 10` - 如果权限不足(例如无读取权限),修改权限为644: ```bash sudo chmod 644 /home/nginx/html/index.html ``` 这将确保所有者可读写,其他用户可读。类似权限问题在引用中多次出现[^2][^4]。 #### 步骤 2: 检查目录权限 Nginx需要执行权限来访问目录内容(目录的执行权限允许遍历目录)。确保父目录`/home/nginx/html/`的权限正确。 - 查看目录权限: ```bash ls -ld /home/nginx/html/ ``` 输出示例:`drwxr-xr-x 2 root root 4096 Feb 10` - 如果目录权限不足,修改为755: ```bash sudo chmod 755 /home/nginx/html/ ``` 这将允许所有者可读写执行,其他用户可读执行。权限错误是Nginx 403错误的常见原因[^1][^2]。 #### 步骤 3: 检查文件所有权 文件的所有者应与Nginx进程用户匹配。默认用户通常是`nginx`或`www-data`。 - 确认Nginx用户(参考Nginx配置文件`/etc/nginx/nginx.conf`中的`user`指令): ```bash grep "user" /etc/nginx/nginx.conf ``` 输出示例:`user nginx;` - 修改文件所有权为用户: ```bash sudo chown nginx:nginx /home/nginx/html/index.html ``` 同样,检查目录所有权: ```bash sudo chown -R nginx:nginx /home/nginx/html/ ``` 所有权问题会导致访问被拒绝[^2]。 #### 步骤 4: 检查安全策略(SELinux/AppArmor) 在启用SELinux的系统(如CentOS/RHEL)上,安全策略可能阻止访问。 - 检查SELinux状态: ```bash sestatus ``` 如果启用,需添加文件上下文规则: ```bash sudo chcon -R -t httpd_sys_content_t /home/nginx/html/ ``` 或临时禁用SELinux(仅测试用途): ```bash sudo setenforce 0 ``` 如果使用AppArmor(如Ubuntu),检查相关策略。安全策略限制是导致`Permission denied`的另一常见原因[^2][^4]。 #### 步骤 5: 检查Nginx配置和重启 确保配置文件未限制访问,并正确重启Nginx以应用更改。 - 检查配置文件(如`/etc/nginx/sites-enabled/default`)中路径设置是否正确: ```bash sudo nginx -t # 测试配置语法 ``` - 重启Nginx服务: ```bash sudo systemctl restart nginx # 或使用引用中的命令 sudo /usr/local/nginx/sbin/nginx -s reload[^3] ``` 重启可解决配置未更新的问题[^3]。 #### 步骤 6: 查看Nginx错误日志 如果上述步骤无效,检查错误日志获取更多线索: ```bash sudo tail -f /var/log/nginx/error.log ``` 日志中可能出现类似`open() failed (13: Permission denied)`的条目,帮助定位问题[^1][^2]。 #### 总结 大多数情况下,权限问题(文件权限755、目录权限644、所有权匹配)是根本原因。完成以上步骤后,访问网页应正常。如果问题持续,考虑检查文件路径是否正确或系统防火墙设置(如SELinux)。实际操作中,请确保以root权限运行命令[^2][^3][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值