访问 Nginx 403 Fobidden
简介
在 CentOS release 6.10 (Final)
部署了 Rails 应用,其中用到了 Passenger、Nginx,通过二者实现用户对 Rails 应用的访问。
在部署的过程中,遇到了一个较坑的问题,记录在此分享给有需要的人。
问题是这样的,部署完成后我开始进行测试,在浏览器打开 Rails 网站发现总是报 403 Forbidden
错误,最后发现问题出在 Passenger 身上。
Nginx 403
在 Rails 应用中出现 403(Forbidden) 错误,一般是有如下几个原因:
- 没有权限访问相关的资源;
- nginx 配置文件错误:
- nginx 配置文件中,在 server 下配置了多余的
location ~
- 端口错误
- 没有开启 passenger(
passenger_enabled on
) - Passenger 没有配置或者配置错误(下面两个选项配置的文件地址不对)
1 | passenger_root |
我最初怀疑就是因为权限问题导致的,然后使用 ls
也查看了 Rails 应用目录的权限,没有问题。差点就开始执行 chmod -R 777
了 😓。
我的 nginx
配置文件(截一部分)如下:
1 | http { |
随手写了一个 index.html
,然后通过 nginx 去访问这个 index.html
文件。发现这个在网页上正常显示,访问权限是有的(无论是 IP 还是资源目录都有权限访问),并且 nginx
的配置文件也没有错误。
折腾一圈之后,并没有发现 nginx
有什么问题,顿时大脑嗡嗡的 😭
罪魁祸首
既然 nginx
大兄弟没有问题,那就是 Passenger 有问题了,开始排查。
果然,passenger 启动失败了,导致无法访问 Rails 应用才报的 403 错误。
启动 passenger 失败的主要原因是因为其无法兼容当前系统版本的 openssl(1.0.x版本),现在摆在我面前的有两条路:
- 升级 Passenger
- 降级系统的 openssl(这个后续我会另外补充一篇文章分享)
因为 Rails 应用使用的 rails 和 ruby 版本的原因,我只能选择第 2 条路,然后重新编译 ruby(需要将openssl模块编译进去),否则 passenger 也无法启动。
完成之后,再去使用 /bin/passenger-memory-stats
检查一下 passenger 运行状态,结果显示正常,Rails 应用的网站也可以正常访问了。
至此,问题解决。