用户 我正在生产中使用 Unicorn Web 服务器运行一个大型 Rails 应用程序。从 Rails 7.0 升级到 7.1 后,我遇到以下问题:
这是通过 Unicorn 运行时每个请求发生的错误:
127.0.0.1 - - [29/Nov/2023:09:53:30 +0100] "GET / HTTP/1.1" 500 51908 0.0197
TypeError: wrong argument type strio (expected strio) (TypeError)
/Users/me/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/rack-3.0.8/lib/rack/lint.rb:390:in `external_encoding'
/Users/me/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/rack-3.0.8/lib/rack/lint.rb:390:in `check_input'
/Users/me/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/rack-3.0.8/lib/rack/lint.rb:332:in `check_environment'
/Users/me/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/rack-3.0.8/lib/rack/lint.rb:57:in `response'
/Users/me/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/rack-3.0.8/lib/rack/lint.rb:35:in `call'
/Users/me/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/rack-3.0.8/lib/rack/show_exceptions.rb:27:in `call'
/Users/me/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/rack-3.0.8/lib/rack/common_logger.rb:43:in `call'
/Users/me/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/rack-3.0.8/lib/rack/chunked.rb:102:in `call'
/Users/me/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/rack-3.0.8/lib/rack/content_length.rb:20:in `call'
/Users/me/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/unicorn-6.1.0/lib/unicorn/http_server.rb:634:in `process_client'
/Users/me/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/unicorn-6.1.0/lib/unicorn/http_server.rb:739:in `worker_loop'
/Users/me/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/unicorn-6.1.0/lib/unicorn/http_server.rb:547:in `spawn_missing_workers'
/Users/me/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/unicorn-6.1.0/lib/unicorn/http_server.rb:143:in `start'
/Users/me/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/unicorn-6.1.0/bin/unicorn:128:in `<top (required)>'
/Users/me/installs/ruby/3.2.2/bin/unicorn:25:in `load'
/Users/me/installs/ruby/3.2.2/bin/unicorn:25:in `<main>'
所有请求都会发生这种情况。我当然尝试过从 https://yhbt.net/unicorn.git 将 Unicorn 更新到最新的 master 并机架到最新版本。 据我所知,Google 上“错误的参数类型 strio”的匹配搜索结果为零。 我在独角兽邮件列表中也找不到任何相关细节:https://yhbt.net/unicorn-public/ 我也无法在 https://github.com/rack/rack/issues
上找到任何相关内容在这里调用external_encoding方法似乎失败https://github.com/rack/rack/blob/f6c583adb0e863e524bacedaf594602964e01078/lib/rack/lint.rb#L393C59-L393C76 该方法是在 C 中实现的......所以不知道为什么由于错误的参数类型而失败
可能是什么原因导致的以及如何进一步调试它?
我也有类似的问题(尽管是使用 puma 服务器)。看起来像:
[timestamp] Listen loop: #<TypeError: wrong argument type strio (expected strio)>
(旁注:花点时间欣赏一下该消息的纯粹愚蠢)
该问题是在例行捆绑更新后出现的,该更新仅更新了一堆次要版本的内容,仅影响“裸机”Mac 开发 - docker 和 Linux 都很好。
原因是
debug
gem(当然,我们的开发/测试组中有它)具有 irb
的依赖性。
irb
在 1.7.x 和 1.10.x 之间的某个时刻添加了对 rdoc
的依赖。 rdoc
取决于 psych
,psych
取决于 strio
。我们暂时解决了这个问题,方法是在 irb
上添加直接依赖项(在开发/测试组中)并将其固定到 ~> 1.7
以防止其超出范围。这从我们的依赖树中删除了 rdoc
、psych
和 strio
。
注意:我们没有费心去检查这是否是 irb 1.8、1.9 或 1.10 的更改,因此我们很可能可以安全地使用 1.8 或 1.9,我只是不太在意。
所以这个:
group :development, :test do
gem 'debug', '~> 1.8'
end
变成:
group :development, :test do
gem 'debug', '~> 1.8'
gem 'irb', '~> 1.7'
end
希望这也是您的问题,因为这是互联网上我发现有人讨论此类错误的唯一地方。