繁体   English   中英

Nginx + Unicorn + Rails不允许超过6个请求,直到任何tcp连接免费

[英]Nginx + Unicorn + Rails not allowing more than 6 request until any tcp connection is free

我在Ruby on Rails中有一个与unicorn和nginx一起运行的应用程序。 由于巨大的数据库,我有一些请求需要一些时间来处理。

直到6请求,我才能够不延迟地浏览我的应用程序。 当我运行netstat -n | grep 'CONNECTED' 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' 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发送请求,它也会添加到CONNECTING事物中,如果我没有记错,请等到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是单线程应用程序服务器。 这意味着:单个独角兽工作者进程在任何时候都只能处理一个请求。

既然你已经配置了worker_processes数到6在unicorn.rb ,那是你的应用程序可以处理的并发请求的确切数目。

为了解决这个问题,您可以增加工作进程的数量,或者(如果您的应用程序支持多线程)使用不同的应用程序服务器,该服务器允许在一个进程中使用多个线程,然后每个线程可以处理一个请求。 用于这种部署的常见应用服务器是PumaPassenger

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM