拯救我的 tricks.one

终于恢复了,记录一下,主要还是解决 nginx 的 403 问题

背景

前两天我的 VPS 提供商邮件给我,说会在 21 号进行系统维护,维护后会重启服务。 那时候我大概就猜到会有事情了,不过我那时想,它难道重启完了不会告知我一下吗? 就没太在意,结果还真没有。

我习惯每天看下访问量,发现这两天极低,大概就猜到,重启了。

解决

先浏览器访问了下,连不上,试了试 telnet,也是不通,那基本就是 nginx 没开了。 打开 ngnix 很简单:

sudo systemctl start nginx

不过接下来是我们的重头戏,网站是可以访问了,但是不管打开主页,还是某一网页, 都显示 403 forbidden。

之前印象中也遇到过这个问题,那时记得是刷了一下录的权限就好了,但是这次应该就不是这个原因了, 因为重启机器没道理会丢权限。不过也许有朋友会因为这个原因卡住, 印象中是给用户目录和 html 目录刷了 755:

chmod 755 /home/username
chmod -R 755 ~/html

检查了下我的目录,也排除了权限回退的可能。

权限没有问题,那基本就是其它机制在搞怪了,最有可能给我们制造麻烦的是哪个?SELinux。

我的 html 目录设置在用户个人文件夹下,默认 SELinux 是不允许 nginx 访问的, 这一次我遇到的是这个问题,临时解决这个问题,我们可以用以下命令:

sudo chcon -Rt httpd_sys_content_t ~/html

这样再试着访问一下,nginx 终于正常了,不过这个写法只是临时修改,要让 SELinux 记住我们的目录,需要用下面的方式:

sudo semanage fcontext -a -t httpd_sys_content_t "/home/username/html(/.*)?"
sudo restorecon -R -v /home/username/html

SELinux 对 nginx 的限制应该是蛮多的,nginx.com 有一篇专门的 博客 来讲述如何应对 SELinux 的限制。由于我的问题已经解决了,这里我们就不再继续展开了。

总结

总结一下如何应对 nginx 的 403 问题:

  1. 检查目录的权限
  2. 检查 SELinux 是否有限制

现在我非常理解上手 CentOS 就关掉 SELinux 的朋友,真的是太烦了。