发布于 

访问 Nginx 403 Fobidden

简介

CentOS release 6.10 (Final) 部署了 Rails 应用,其中用到了 Passenger、Nginx,通过二者实现用户对 Rails 应用的访问。

在部署的过程中,遇到了一个较坑的问题,记录在此分享给有需要的人。

问题是这样的,部署完成后我开始进行测试,在浏览器打开 Rails 网站发现总是报 403 Forbidden 错误,最后发现问题出在 Passenger 身上。

Nginx 403

在 Rails 应用中出现 403(Forbidden) 错误,一般是有如下几个原因:

  1. 没有权限访问相关的资源;
  2. nginx 配置文件错误:
  • nginx 配置文件中,在 server 下配置了多余的 location ~
  • 端口错误
  • 没有开启 passenger(passenger_enabled on
  • Passenger 没有配置或者配置错误(下面两个选项配置的文件地址不对)
1
2
passenger_root  
passenger_ruby

我最初怀疑就是因为权限问题导致的,然后使用 ls 也查看了 Rails 应用目录的权限,没有问题。差点就开始执行 chmod -R 777 了 😓。

我的 nginx 配置文件(截一部分)如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
http {
passenger_root /opt/passenger;
passenger_ruby /usr/local/bin/ruby;
passenger_ignore_client_abort on;
passenger_max_pool_size 80;
passenger_use_global_queue on;
passenger_user name;

server {
listen 8080;
server_name localhost;
root /var/rails_app/public;
passenger_enabled on;
}
}

随手写了一个 index.html,然后通过 nginx 去访问这个 index.html 文件。发现这个在网页上正常显示,访问权限是有的(无论是 IP 还是资源目录都有权限访问),并且 nginx 的配置文件也没有错误。

折腾一圈之后,并没有发现 nginx 有什么问题,顿时大脑嗡嗡的 😭

罪魁祸首

既然 nginx 大兄弟没有问题,那就是 Passenger 有问题了,开始排查。

果然,passenger 启动失败了,导致无法访问 Rails 应用才报的 403 错误。

启动 passenger 失败的主要原因是因为其无法兼容当前系统版本的 openssl(1.0.x版本),现在摆在我面前的有两条路:

  1. 升级 Passenger
  2. 降级系统的 openssl(这个后续我会另外补充一篇文章分享)

因为 Rails 应用使用的 rails 和 ruby 版本的原因,我只能选择第 2 条路,然后重新编译 ruby(需要将openssl模块编译进去),否则 passenger 也无法启动。

完成之后,再去使用 /bin/passenger-memory-stats 检查一下 passenger 运行状态,结果显示正常,Rails 应用的网站也可以正常访问了。

至此,问题解决。


本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

veryitman