虚拟机centos6下nginx自定义目录访问报403的解决记录

本文详细记录了解决在CentOS 6.10环境下,使用Nginx时遇到的403 Forbidden错误的过程。从网络配置、防火墙检查、虚拟主机配置和文件权限调整,直至发现SELinux是根本原因,并提供了禁用SELinux的步骤。

前言

笔者在mac上装VMWARE,再装了minimal-ceotos6.10,网络设置好后(宿主机和虚拟机互相能ping通且虚拟机能上网),在教程指导下装nginx,在宿主机通过虚拟机的ip访问,正常,但新增虚拟主机(指定到非原给定的目录),访问报403。经过层层试验,最终发现是SELinux默认开启了导致。记录下解决过程中的尝试。

正文

1. 新建虚拟主机

  • 域名为demo.com, 访问目录为/services/demo
1.1 服务端配置
# 创建自定义访问目录
mkdir -p /services/demo
vim /services/demo/index.html
# 输入Hello Nginx,wq保存退出

# 复制原虚拟主机配置文件
cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/demo.conf
vim /etc/nginx/conf.d/demo.conf

# 修改    
server_name  demo.com;	# 改

location / {
    root   /services/demo;	# 改
    index  index.html index.htm;
}

# 保存退出后,重启nginx或重新加载配置文件
service nginx restart	# 重启服务
nginx -s reload		# 重新加载配置文件


# 查看虚拟机ip,看eth的inet addr,如此处是192.168.211.128
ifconfig

# 输出
eth0      Link encap:Ethernet  HWaddr 00:0C:29:9B:C2:CA  
          inet addr:192.168.211.128  Bcast:192.168.211.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe9b:c2ca/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:566 errors:0 dropped:0 overruns:0 frame:0
          TX packets:312 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:65758 (64.2 KiB)  TX bytes:62635 (61.1 KiB)
1.2 客户端配置域名解析
  • mac下的配置,windows同理,找到hosts文件即可。
vim /etc/hosts

# 添加域名解析 demo.com	192.168.211.128
# 这个ip是虚拟机的ip
1.3 访问
  1. 浏览器直接输入ip,访问正常
  2. 输入刚配置的demo.com,报403。开始排查原因

2 防火墙问题?

应该不是,刚做好的虚拟机,没做任何特殊配置,直接输入ip能正常访问的,证明端口是通。其实没想明白当前情况是否一定与防火墙无关,但不管了,先关再说。(后面证实我遇到的情况是与防火墙无关的)。

service iptables status
# 输出一堆规则,有点难懂,先不管
service iptables stop

关了后再访问,情况依旧。

  • 后来想明白,一个排除是防火墙问题的方法,看nginx访问日志,错误日志。按理来说,防火墙是先于nginx的,如果响应为403的请求,在nginx错误日志有记录,那么肯定与防火墙无关了。查看方法如下

    tail -f /var/log/nginx/error.log
    
    # 我的输出显示是
    /services/demo/index.html" is forbidden (13: Permission denied),......
    

这里note一下:应该首先想起看错误日志,错误提示之类的。再结合自己的猜测,防火墙?文件权限?虚拟主机配置错误? 因为猜测可以有无限种,但错误日志能快速过滤大部分。

3 虚拟主机配置问题或自定义目录的权限?

  1. nginx -t测试过配置文件无语法错误,且我是复制原虚拟主机配置,只改了两个小地方的。应该不是。

  2. 文件目录权限,不管那么多,直接777,先弄通再考虑最优设置。

    chmod -R 777 /services
    

    再次访问,依然403。有点蒙了。

  3. 怀疑自己,可能是虚拟主机没配好,可能是文件用户与http请求访问用户的问题(当时对这块知识比较模糊)。运用初中学的知识,控制变量法。目前我有一套能成功访问例子(虚拟主机配置文件和具体访问目),一套不成功的。做一下尝试

    1. 好的虚拟主机配置,指向坏的目录。fail
    2. 坏的虚拟主机,指向好的目录。success。

    很明显,是自定义目录问题。

  4. 但,已经最外层目录到具体文件都设为777了,按理是不存在文件无法读,执行的问题的。因为流程是这样的,首先

    vim /etc/nginx/nginx.conf`
    # 内容有
    user  nginx;
    

即意思是,客户端发http请求到了服务端的nginx层, 是通过linux系统中的nginx用户去读写执行对应文件的,(这个nginx用户是安装nginx是自动添加的)。可以将上面的user改为root,但我认为无必要,改为777意味着非同组用户都有读写执行权限,我自定义的目录文件确实是root用户拥有的,但改为777,任何用户都有rwx权限。

4 最终解决

实在没思路了,上网搜nginx 403,一堆解决方案。我的是因为SELinux开启了,导致无权限访问。SELinux这东西是安全相关的,但貌似因为学习难度大,很多运维都把它关了~,而虚拟机装的centos6默认是开启的…

# 查看selinux状态
/usr/sbin/sestatus

vi /etc/selinux/config
# 注释下面这个
# SELINUX=enforcing
# 添加这个
SELINUX=disabled

# 重启
reboot

5 注意事项

  • nginx修改配置后记得nginx -s reload重新加载配置文件,无需重新启动,一般也不需要nginx -t测试,因为reload有问题,会报错的。

参考链接

<think>嗯,用户想知道在CentOS 7上安装的Nginx内置功能是否足够使用。首先,我需要回忆一下NginxCentOS 7中的默认安装情况。根据引用[1],用户可能通过系统包管理器安装的Nginx,或者自己编译安装的。如果是系统自带的版本,可能比较旧,功能可能有限。如果是编译安装的话,用户可能启用了更多模块,比如SSL模块,像引用[3]提到的,编译时添加了--with-http_ssl_module参数。 然后,我需要分析Nginx的常见内置功能。比如基础功能有HTTP服务器、反向代理、负载均衡,这些应该都是默认支持的。但像SSL支持可能需要编译时添加模块,或者在安装后动态加载。用户如果使用的是默认安装,可能缺少某些模块,比如SSL或HTTP/2支持,这时候可能需要自己编译安装,如引用[2]和[3]提到的步骤。 接下来要考虑用户的需求场景。如果只是简单的静态文件服务或反向代理,默认安装可能足够。但如果需要HTTPS、gzip压缩、缓存优化等高级功能,可能需要确认这些模块是否存在。例如,SSL模块需要确认是否编译进去,否则无法配置HTTPS。另外,动态模块的支持在较新版本的Nginx中才更好,CentOS 7默认的版本可能较旧,可能不支持动态加载模块,需要重新编译。 还要考虑性能优化方面的功能,比如连接数限制、访问控制等,这些通常都是内置的。但像GeoIP、图像处理等可能需要额外模块。如果用户需要这些,可能需要自行编译添加。 最后,建议用户检查已安装的模块,使用nginx -V命令查看编译参数,确认需要的模块是否存在。如果缺少,可能需要参考引用[2]和[3]中的编译步骤,添加所需模块重新安装。同时,如果用户的需求是基础应用,默认安装可能足够;如果需要更多高级功能,可能需要自行编译或使用第三方仓库获取更新的版本。</think>在 CentOS 7 中安装的 Nginx 是否满足功能需求,需根据具体场景和编译方式判断: ### 一、默认安装功能分析 1. **基础功能** 通过`yum`安装的 Nginx 默认包含以下核心功能: - HTTP/HTTPS 服务器 - 反向代理与负载均衡 - 静态文件服务 - 基础访问控制(IP限制、身份验证) - Gzip 压缩 - 日志记录自定义 2. **模块限制** 默认安装可能缺少以下模块: - **SSL 支持**:需手动添加`--with-http_ssl_module`编译参数[^3] - **HTTP/2**:需通过`--with-http_v2_module`启用 - **流媒体支持**:如 RTMP 模块需单独编译 - **高级缓存控制**:如`proxy_cache_purge`模块 ### 二、编译安装扩展能力 通过源码编译可实现功能扩展: ```bash # 示例编译命令(含 SSL 模块) ./configure --prefix=/usr/local/nginx \ --with-http_ssl_module \ --with-http_realip_module \ --with-http_gzip_static_module make && make install ``` 此方式可支持: - 自定义证书管理 - 更精细的请求头控制 - 高级流量压缩优化 ### 三、典型场景验证 | 需求场景 | 是否满足 | 依赖条件 | |----------------|----------|------------------------| | 企业官网 | ✔ | 基础HTTP功能 | | API网关 | ✔ | 反向代理+负载均衡 | | HTTPS电商站点 | 需编译 | SSL模块+证书配置 | | 视频直播平台 | ✘ | 需额外RTMP模块 | ### 四、功能验证方法 1. 执行`nginx -V`查看已编译模块 2. 检查配置文件是否支持目标指令 3. 通过`curl -I`测试HTTP响应头验证功能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值