You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx与Passenger正常时,如何排查Rails应用无响应问题?

Rails部署后无法接收请求的排查思路学习

问题现象

  • 经Capistrano部署的Rails应用无法接收请求:Safari连接超时,Chromium提示ERR_CONNECTION_REFUSED
  • Nginx的/var/log/nginx/access.log能捕获请求记录,但将Rails日志级别设为:debug后,log/production.log仅存在ActiveRecord::InternalMetadata Load和ActiveRecord::SchemaMigration Load调试信息,无请求处理日志
  • 静态页面(如myapp.example.com/500.html)可正常访问,但Passenger/Rack/Rails处理的动态页面无法访问

已完成的排查操作

应用重启与日志检查

执行passenger-config restart-app /home/deploy/myapp/current重启应用后,/var/log/nginx/error.log仅输出:

[ N 2024-09-14 01:23:04.4806 59187/Td age/Cor/CoreMain.cpp:1147 ]: Checking whether to disconnect long-running connections for process 80053, application /home/deploy/myapp/current (production)

进程状态验证

执行sudo /usr/sbin/passenger-memory-stats确认Passenger进程正常运行且指向目标应用:

> sudo /usr/sbin/passenger-memory-stats
Version: 6.0.23
Date   : 2024-09-14 01:52:13 +0000
------------- Apache processes -------------
*** WARNING: The Apache executable cannot be found.
Please set the APXS2 environment variable to your 'apxs2' executable's filename, or set the HTTPD environment variable to your 'httpd' or 'apache2' executable's filename.


---------- Nginx processes -----------
PID    PPID   VMSize    Private  Name
--------------------------------------
59205  1      197.1 MB  0.6 MB   nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
59206  59205  197.6 MB  0.8 MB   nginx: worker process
59208  59205  197.6 MB  0.8 MB   nginx: worker process
### Processes: 3
### Total private dirty RSS: 2.18 MB


----- Passenger processes ------
PID    VMSize     Private  Name
--------------------------------
59183  361.1 MB   2.8 MB   Passenger watchdog
59187  1045.2 MB  6.6 MB   Passenger core
80223  739.9 MB   78.4 MB  Passenger RubyApp: /home/deploy/myapp/current (production)
### Processes: 3
### Total private dirty RSS: 87.81 MB

Rails生产环境验证

  • 执行RAILS_ENV=production bundle exec rails routes可显示正确路由:
> RAILS_ENV=production bundle exec rails routes
            Prefix  Verb  URI Pattern      Controller#Action
rails_health_check  GET   /up(.:format)    rails/health#show
              home  GET   /home(.:format)  pages#home
              root  GET   /                pages#coming_soon
  • 执行RAILS_ENV=production bundle exec rails server可正常启动Passenger独立服务器(此前误启动为WEBrick):
RAILS_ENV=production bundle exec rails server
=> Booting Passenger application server
=> Rails 7.2.1 application starting in production http://0.0.0.0:3000
=> Run `bin/rails server --help` for more startup options
=============== Phusion Passenger(R) Standalone web server started ===============
PID file: /home/deploy/myapp/current/tmp/pids/passenger.3000.pid
Log file: /home/deploy/myapp/current/log/passenger.3000.log
Environment: production
Accessible via: http://0.0.0.0:3000/

中间件日志添加

修改config.ru添加Rack日志:

#config.ru
require_relative "config/environment"

logger = Logger.new("log/rack.log")
use Rack::CommonLogger, logger

run Rails.application
Rails.application.load_server

重启Passenger后rack.log被创建,但无任何请求记录。

Ruby版本验证

执行passenger-config about ruby-command确认Passenger识别到正确的rbenv Ruby版本:

> passenger-config about ruby-command
passenger-config was invoked through the following Ruby interpreter:
  Command: /home/deploy/.rbenv/versions/3.3.4/bin/ruby
  Version: ruby 3.3.4 (2024-07-09 revision be1089c8ec) [x86_64-linux]
  To use in Apache: PassengerRuby /home/deploy/.rbenv/versions/3.3.4/bin/ruby
  To use in Nginx : passenger_ruby /home/deploy/.rbenv/versions/3.3.4/bin/ruby
  To use with Standalone: /home/deploy/.rbenv/versions/3.3.4/bin/ruby /usr/bin/passenger start

The following Ruby interpreter was found first in $PATH:
  Command: /home/deploy/.rbenv/versions/3.3.4/bin/ruby
  Version: ruby 3.3.4 (2024-07-09 revision be1089c8ec) [x86_64-linux]
  To use in Apache: PassengerRuby /home/deploy/.rbenv/versions/3.3.4/bin/ruby
  To use in Nginx : passenger_ruby /home/deploy/.rbenv/versions/3.3.4/bin/ruby
  To use with Standalone: /home/deploy/.rbenv/versions/3.3.4/bin/ruby /usr/bin/passenger start

需要学习的排查方向

  1. Passenger与Rack/Ruby通信验证
    • 如何查看Passenger与Ruby应用进程间的IPC通信日志?
    • 如何测试Passenger能否正确调用Ruby应用的Rack接口?
  2. Nginx与Passenger配置校验
    • 确认Nginx配置中Passenger的根目录、环境变量设置是否正确
    • 检查Nginx是否正确将请求转发至Passenger,而非拦截或丢弃请求
  3. Rails生产环境初始化排查
    • 查找Rails生产环境初始化时的隐藏错误(如依赖缺失、配置加载失败),这类错误可能导致应用进程无法处理请求但不崩溃
    • 如何启用Passenger的详细调试日志,查看应用启动和请求处理的完整流程?
  4. 权限与环境变量检查
    • 确认Passenger运行用户(通常为deploy用户)是否拥有应用目录(尤其是tmp、log)的读写权限
    • 检查Passenger启动时是否继承了正确的环境变量(如rbenv的PATH、RAILS_ENV等)
  5. 网络与端口验证
    • 确认Passenger是否监听了正确的端口或Unix套接字,Nginx是否正确连接至该端点
    • 检查服务器防火墙是否允许相关端口的通信(即使静态页面可访问,Passenger内部通信端口仍可能被拦截)

环境信息

  • Ubuntu 24.04.01 LTS
  • rbenv 1.3.0-4-gc335ab8
  • Ruby 3.3.4
  • Rails 7.2.1
  • Nginx 1.24.0
  • Passenger 6.0.23

内容的提问来源于stack exchange,提问作者Matthew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 14:14:58