我正在尝试将我们生产服务器上的 Rails 应用程序更新为 ruby 1.9。我们有几个生产站点,其中一些具有更关键的正常运行时间要求,因此一次更新每个站点以确保更关键站点上的停机时间最少是非常有益的。
Phusion Passenger 4 允许使用不同的 ruby 版本轻松运行站点,这将是确保交错过渡到 1.9(和更高版本的 2.0)的绝佳功能。目前,服务器在 Apache 模块 Passenger 3.0.11 下工作,并使用系统 ruby-1.8.7-352。
要开始更新,我已经安装了 rvm 和 ruby-1.9.2-p320。使用新的红宝石,我安装了乘客 4.0.10。然后我将 httpd.conf 更新为:
LoadModule passenger_module /path/to/mod_passenger.so
PassengerRoot /path/to/gems/passenger-4.0.10
PassengerDefaultRuby /path/to/ruby-1.9.2-p320/ruby
然后在 site.conf
PassengerRuby /path/to/old/ruby
这意味着站点应该像以前一样使用系统 ruby,唯一需要更新的是 Phusion Passenger。结果是生产应用程序开始抛出ActiveRecord::StatementInvalid
异常,可能每 3000 个请求一次。在高流量期间异常率明显更高。错误如下:
Exception Class: ActiveRecord::StatementInvalid
Message: Mysql2::Error: Lost connection to MySQL server during query: SELECT ...
我有几个页面上的错误示例,但主要是那些具有“大” sql 查询的页面(可能长达 0.4 秒的查询,1.7 秒的请求)。
我已经用老乘客恢复了 httpd.conf 并且错误已经停止。
任何人都可以帮助诊断查询死亡的来源吗?
谢谢。
=== 编辑 1 ===
我已经尝试添加PassengerSpawnMethod direct
到 httpd.conf 所以它现在显示为:
LoadModule passenger_module /path/to/mod_passenger.so
PassengerRoot /path/to/gems/passenger-4.0.10
PassengerDefaultRuby /path/to/ruby-1.9.2-p320/ruby
PassengerSpawnMethod direct
但仍然以看似相同的频率发生相同的错误。
=== 编辑 2 ===
我也绝望地尝试在系统 1.8 ruby 下安装乘客 4.0.10,结果相同。还有什么我可以做的还是我应该假设乘客还没有准备好更新?我可以在我的代码中查找可能导致此问题的任何内容吗?我检查了mysql错误日志,什么都没有。任何人都可以建议其他值得一看的东西吗?至于前进,我不打算花更多时间在这上面,我将在周末在 ruby 1.9 下测试生产站点,然后硬着头皮将它们全部移到乘客 3 下。
=== 编辑 3 ===
我现在已经设置了乘客,所以乘客 4 下的每个应用程序只有一个乘客流程。仍然存在这些错误!所以不是产卵/多访问问题。我看不到乘客弄乱了与数据库的应用程序连接,但乘客是我唯一要改变的东西。我正在为我的 rails 应用程序使用标准的 msyql2 gem。失败的请求是较大的选择查询(大约一秒才能完成)。