我正在将旧的 Rails 和 PostgreSQL 应用程序从 2.1 升级到 Rails 3(通过成功的中间 2.3.11 步骤)。
最后,当我让所有 Rspecs 顺利运行时,我安装了 Mongrel 1.2.0.pre2 并启动并运行 - 一切正常。即使是具有 100 个并发用户的 JMeter 测试用例也通过了 OK。
但是当我对 Unicorn 进行同样的尝试时!服务器,当我自己使用它时它工作正常,但是当我使用 JMeter 加载它时,它从 JMeter 尝试 POST 登录的那一刻开始出现 100% 的错误。同时,当我检查某些特定页面时,它会给我这样的奇怪错误:
undefined method `eq' for nil:NilClass
在终端我得到以下输出(但只有几次):
message type 0x43 arrived from server while idle
message type 0x5a arrived from server while idle
WARNING: there is already a transaction in progress
编辑:这似乎是共享 PGconnect
对象的问题,所以我删除了一些以前的文本
我发现 PostgreSQL docs指定 PGconn
对象不得在发出并发请求的线程之间共享。
是 unicorn !还是 AR 在同一 PGconn
对象中混合来自不同线程的请求?
数据库.yml:
production:
adapter: postgresql
encoding: unicode
database: ***
username: ***
password: ***
host: 127.0.0.1
我什至尝试添加它无济于事:
allow_concurrency: true
unicorn session :
worker_processes 8
working_directory "/full/path/to/app"
listen '/tmp/app.sock', :backlog => 512
timeout 30
pid "/full/path/to/app/tmp/pids/puppetmaster_unicorn.pid"
preload_app true
if GC.respond_to?(:copy_on_write_friendly=)
GC.copy_on_write_friendly = true
end
规范:
- Rails 3.0.6(因为部署环境)
- unicorn ! 4.1.1
- Nginx 1.0.5
- PG gem 0.11.0
- PostgreSQL 9.0.4
- Mac OS X 10.7.2
如果 Rails 版本是罪魁祸首,我当然可以升级到最新版本。我刚开始了解服务提供商的内容。
最佳答案
重要的是不要在进程之间共享数据库连接。当您使用 preload_app 运行 Rails 时,Rails 将在 unicorn master fork workers 之前建立 AR 连接。示例 unicorn.conf.rb 建议在 before_fork Hook 中断开 AR 连接。 AR 将自动重新建立新连接,因为每个工作人员都需要它后 fork 。
摘自 http://unicorn.bogomips.org/examples/unicorn.conf.rb :
before_fork do |server, worker|
# the following is highly recomended for Rails + "preload_app true"
# as there's no need for the master process to hold a connection
defined?(ActiveRecord::Base) and
ActiveRecord::Base.connection.disconnect!
# ...
end
关于ruby-on-rails-3 - unicorn !和 PostgreSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8262803/