Ruby on rails Nginx+;独角兽&x2B;在任何tcp连接空闲之前,Rails不允许超过6个请求
我在RubyonRails中有一个应用程序,它与unicorn和nginx一起运行。我有几个请求需要一些时间来处理,因为数据库很大 在6点之前,我可以毫不延迟地浏览我的申请。当我运行Ruby on rails Nginx+;独角兽&x2B;在任何tcp连接空闲之前,Rails不允许超过6个请求,ruby-on-rails,ruby,nginx,tcp,Ruby On Rails,Ruby,Nginx,Tcp,我在RubyonRails中有一个应用程序,它与unicorn和nginx一起运行。我有几个请求需要一些时间来处理,因为数据库很大 在6点之前,我可以毫不延迟地浏览我的申请。当我运行netstat-n | grep'CONNECTED'时,它说 unix 3 [ ] STREAM CONNECTED 37992166 /home/user/myapp/shared/sockets/unicorn.sock unix 3 [ ]
netstat-n | grep'CONNECTED'
时,它说
unix 3 [ ] STREAM CONNECTED 37992166 /home/user/myapp/shared/sockets/unicorn.sock
unix 3 [ ] STREAM CONNECTED 37989365 /home/user/myapp/shared/sockets/unicorn.sock
unix 3 [ ] STREAM CONNECTED 37993053 /home/user/myapp/shared/sockets/unicorn.sock
unix 3 [ ] STREAM CONNECTED 37992166 /home/user/myapp/shared/sockets/unicorn.sock
unix 3 [ ] STREAM CONNECTED 37989335 /home/user/myapp/shared/sockets/unicorn.sock
unix 3 [ ] STREAM CONNECTED 37993083 /home/user/myapp/shared/sockets/unicorn.sock
当我运行netstat-n | grep'CONNECTING'
时,它没有显示任何内容
但是在6次请求之后,当我再次运行同一个命令时,除了上面的命令外,它说
unix 3 [ ] STREAM CONNECTING 37989334 /home/user/myapp/shared/sockets/unicorn.sock
unix 3 [ ] STREAM CONNECTING 37993089 /home/user/myapp/shared/sockets/unicorn.sock
即使当我试图从Firefox发送请求时,它也会添加到连接中东西,如果我没有错的话,等待tcp释放
请帮助我如何解决此错误。谢谢
这就是我的unicorn.rb
的样子
working_directory "/home/user/myapp/current"
pid "/home/user/myapp/shared/pids/unicorn.pid"
stderr_path "/home/user/myapp/shared/log/unicorn.log"
stdout_path "/home/user/myapp/shared/log/unicorn.log"
listen "/home/user/myapp/shared/sockets/unicorn.sock", backlog: 64
worker_processes 6
preload_app true
timeout 600
before_fork do |server, worker|
defined?(ActiveRecord::Base) &&
ActiveRecord::Base.connection.disconnect!
# Quit the old unicorn process
old_pid = "#{server.config[:pid]}.oldbin"
if File.exists?(old_pid) && server.pid != old_pid
begin
Process.kill("QUIT", File.read(old_pid).to_i)
rescue Errno::ENOENT, Errno::ESRCH
# someone else did our job for us
end
end
end
after_fork do |server, worker|
if defined?(ActiveRecord::Base)
config = ActiveRecord::Base.configurations[Rails.env] ||
Rails.application.config.database_configuration[Rails.env]
config['pool'] = ENV['DB_POOL'] || ENV['RAILS_MAX_THREADS'] || 10
ActiveRecord::Base.establish_connection(config)
end
end
Unicorn是一个单线程应用服务器。这意味着:单个unicorn工作进程在任何时候只能处理一个请求
由于您已在unicorn.rb
中将worker\u进程数配置为6,因此这就是您的应用程序可以处理的并发请求的确切数量
要解决这个问题,您可以增加工作进程的数量,或者(如果您的应用程序支持多线程)使用不同的应用程序服务器,允许在一个进程中使用多个线程,然后每个线程都可以处理单个请求。这种部署的常见应用服务器是和。Unicorn是单线程应用服务器。这意味着:单个unicorn工作进程在任何时候只能处理一个请求
由于您已在unicorn.rb
中将worker\u进程数配置为6,因此这就是您的应用程序可以处理的并发请求的确切数量
要解决这个问题,您可以增加工作进程的数量,或者(如果您的应用程序支持多线程)使用不同的应用程序服务器,允许在一个进程中使用多个线程,然后每个线程都可以处理单个请求。这种部署的常见应用程序服务器是和。你的unicorn.rb是什么样子的?用unicorn.rb
和Rails.application.config.database_配置['production']['pool']
报告更新了我的问题(在你的生产节点上)它表示为nil,这就是为什么在下一行中添加了单独的池。另外,当我将工作人员从6人改为20人时,它现在正在接受20人的请求。那么,当我是唯一一个创建20个请求的人时,这会阻止其他用户的请求吗?你的unicorn.rb是什么样子的?用unicorn.rb
和Rails.application.config.database_配置['production']['pool']
报告更新了我的问题(在你的生产节点上)它表示为nil,这就是为什么在下一行中添加了单独的池。另外,当我将工作人员从6人改为20人时,它现在正在接受20人的请求。那么,当我是唯一一个创建20个请求的人时,这会阻止其他用户的请求吗