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
需要学习的排查方向
- Passenger与Rack/Ruby通信验证
- 如何查看Passenger与Ruby应用进程间的IPC通信日志?
- 如何测试Passenger能否正确调用Ruby应用的Rack接口?
- Nginx与Passenger配置校验
- 确认Nginx配置中Passenger的根目录、环境变量设置是否正确
- 检查Nginx是否正确将请求转发至Passenger,而非拦截或丢弃请求
- Rails生产环境初始化排查
- 查找Rails生产环境初始化时的隐藏错误(如依赖缺失、配置加载失败),这类错误可能导致应用进程无法处理请求但不崩溃
- 如何启用Passenger的详细调试日志,查看应用启动和请求处理的完整流程?
- 权限与环境变量检查
- 确认Passenger运行用户(通常为deploy用户)是否拥有应用目录(尤其是tmp、log)的读写权限
- 检查Passenger启动时是否继承了正确的环境变量(如rbenv的PATH、RAILS_ENV等)
- 网络与端口验证
- 确认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
相关产品推荐
相关产品推荐

