乘客 EBADF 文件描述符异常 502
Passenger EBADF file descriptor exception 502
由于 CVE,我们将应用程序升级到 Rails 4.1.12 和 Rack 1.5.5,因此我们似乎随机出现了 502。大约 1% 的请求,我无法始终如一地重新创建问题,只能观察它(正如您可以想象的那样,这非常令人沮丧)。我们曾经是 运行 4.1.8 和 rack 1.5.2 ...我尝试降级 Rack 并且仍然观察到问题但是由于合规性的性质等回到 Rails 4.1.8 可能是相当复杂。
我们使用 Passenger 5.0.6 (prod) 和 5.0.13 (staging) Ruby 2.1.5 with nginx。
我看到的模式是:
nginx-error: [ 2015-07-12 16:12:05.3947 2176/7f97fb7fe700 age/Hel/Req/Utils.cpp:89 ]: [Client 7-50] Sending 502 response: application did not send a complete response
nginx-error: App 2210 stderr: [ 2015-07-12 16:12:05.9232 2813/0x007f6eb5056088(Worker 1) utils.rb:85 ]: *** Exception Errno::EBADF in Passenger RequestHandler's client socket (Bad file descriptor - writev()) (process 2813, thread 0x007f6eb5056088(Worker 1)):
nginx-error: App 2210 stderr: #011from /usr/lib/ruby/vendor_ruby/phusion_passenger/ruby_core_io_enhancements.rb:41:in `writev'
nginx-error: App 2210 stderr: #011from /usr/lib/ruby/vendor_ruby/phusion_passenger/ruby_core_io_enhancements.rb:41:in `writev'
nginx-error: App 2210 stderr: #011from /usr/lib/ruby/vendor_ruby/phusion_passenger/utils/unseekable_socket.rb:126:in `writev'
nginx-error: App 2210 stderr: #011from /usr/lib/ruby/vendor_ruby/phusion_passenger/rack/thread_handler_extension.rb:177:in `process_body'
nginx-error: App 2210 stderr: #011from /usr/lib/ruby/vendor_ruby/phusion_passenger/rack/thread_handler_extension.rb:104:in `process_request'
nginx-error: App 2210 stderr: #011from /usr/lib/ruby/vendor_ruby/phusion_passenger/request_handler/thread_handler.rb:149:in `accept_and_process_next_request'
nginx-error: App 2210 stderr: #011from /usr/lib/ruby/vendor_ruby/phusion_passenger/request_handler/thread_handler.rb:110:in `main_loop'
nginx-error: App 2210 stderr: #011from /usr/lib/ruby/vendor_ruby/phusion_passenger/request_handler.rb:414:in `block (3 levels) in start_threads'
nginx-error: App 2210 stderr: #011from /usr/lib/ruby/vendor_ruby/phusion_passenger/utils.rb:111:in `block in create_thread_and_abort_on_exception'
我已经在 IRC #passenger 上提出了这个问题,但没有看到任何人遇到同样的问题。关于如何找出究竟是什么原因造成的任何提示?
这里是客运作者
我认为此问题是由应用程序中的某些内容引起的,可能是 gem -- 而不是 Passenger。 EBADF 错误是从应用程序中引发的,因此很可能某些 gem(可能具有本机扩展名)关闭了错误的文件描述符。但是 gem 是哪个,我不知道。调试它的标准方法是一个一个地禁用 gems,直到找到罪魁祸首。如果您的代码依赖于 gem,这可能会很困难,但处理这个问题的方法并不多。
由于 CVE,我们将应用程序升级到 Rails 4.1.12 和 Rack 1.5.5,因此我们似乎随机出现了 502。大约 1% 的请求,我无法始终如一地重新创建问题,只能观察它(正如您可以想象的那样,这非常令人沮丧)。我们曾经是 运行 4.1.8 和 rack 1.5.2 ...我尝试降级 Rack 并且仍然观察到问题但是由于合规性的性质等回到 Rails 4.1.8 可能是相当复杂。
我们使用 Passenger 5.0.6 (prod) 和 5.0.13 (staging) Ruby 2.1.5 with nginx。
我看到的模式是:
nginx-error: [ 2015-07-12 16:12:05.3947 2176/7f97fb7fe700 age/Hel/Req/Utils.cpp:89 ]: [Client 7-50] Sending 502 response: application did not send a complete response
nginx-error: App 2210 stderr: [ 2015-07-12 16:12:05.9232 2813/0x007f6eb5056088(Worker 1) utils.rb:85 ]: *** Exception Errno::EBADF in Passenger RequestHandler's client socket (Bad file descriptor - writev()) (process 2813, thread 0x007f6eb5056088(Worker 1)):
nginx-error: App 2210 stderr: #011from /usr/lib/ruby/vendor_ruby/phusion_passenger/ruby_core_io_enhancements.rb:41:in `writev'
nginx-error: App 2210 stderr: #011from /usr/lib/ruby/vendor_ruby/phusion_passenger/ruby_core_io_enhancements.rb:41:in `writev'
nginx-error: App 2210 stderr: #011from /usr/lib/ruby/vendor_ruby/phusion_passenger/utils/unseekable_socket.rb:126:in `writev'
nginx-error: App 2210 stderr: #011from /usr/lib/ruby/vendor_ruby/phusion_passenger/rack/thread_handler_extension.rb:177:in `process_body'
nginx-error: App 2210 stderr: #011from /usr/lib/ruby/vendor_ruby/phusion_passenger/rack/thread_handler_extension.rb:104:in `process_request'
nginx-error: App 2210 stderr: #011from /usr/lib/ruby/vendor_ruby/phusion_passenger/request_handler/thread_handler.rb:149:in `accept_and_process_next_request'
nginx-error: App 2210 stderr: #011from /usr/lib/ruby/vendor_ruby/phusion_passenger/request_handler/thread_handler.rb:110:in `main_loop'
nginx-error: App 2210 stderr: #011from /usr/lib/ruby/vendor_ruby/phusion_passenger/request_handler.rb:414:in `block (3 levels) in start_threads'
nginx-error: App 2210 stderr: #011from /usr/lib/ruby/vendor_ruby/phusion_passenger/utils.rb:111:in `block in create_thread_and_abort_on_exception'
我已经在 IRC #passenger 上提出了这个问题,但没有看到任何人遇到同样的问题。关于如何找出究竟是什么原因造成的任何提示?
这里是客运作者
我认为此问题是由应用程序中的某些内容引起的,可能是 gem -- 而不是 Passenger。 EBADF 错误是从应用程序中引发的,因此很可能某些 gem(可能具有本机扩展名)关闭了错误的文件描述符。但是 gem 是哪个,我不知道。调试它的标准方法是一个一个地禁用 gems,直到找到罪魁祸首。如果您的代码依赖于 gem,这可能会很困难,但处理这个问题的方法并不多。