前言
笔者在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 访问
- 浏览器直接输入ip,访问正常
- 输入刚配置的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 虚拟主机配置问题或自定义目录的权限?
-
nginx -t
测试过配置文件无语法错误,且我是复制原虚拟主机配置,只改了两个小地方的。应该不是。 -
文件目录权限,不管那么多,直接777,先弄通再考虑最优设置。
chmod -R 777 /services
再次访问,依然403。有点蒙了。
-
怀疑自己,可能是虚拟主机没配好,可能是文件用户与http请求访问用户的问题(当时对这块知识比较模糊)。运用初中学的知识,控制变量法。目前我有一套能成功访问例子(虚拟主机配置文件和具体访问目),一套不成功的。做一下尝试
- 好的虚拟主机配置,指向坏的目录。fail
- 坏的虚拟主机,指向好的目录。success。
很明显,是自定义目录问题。
-
但,已经最外层目录到具体文件都设为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有问题,会报错的。