首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果Idle,Rails停止响应

如果Idle,Rails停止响应
EN

Stack Overflow用户
提问于 2016-02-05 12:04:41
回答 3查看 1.2K关注 0票数 12

我遇到这个问题已经有一段时间了,并对此进行了大量的搜索,但似乎没有什么能解决我的问题。

我有一个应用程序运行在Rails和NGINX和独角兽与Docker的一切。

如果我运行应用程序(docker-组合),网站将完美地运行几分钟。如果网站闲置大约5到10分钟,我发送另一个请求,rails应用程序停止响应,给出时间从Unicorn。

奇怪的是,我开发的每个应用程序都有相同的问题,这些应用程序唯一的共同点就是Gemfile。

到目前为止,我发现当请求被发送时,NGINX收到这个请求,将它传递给Unicorn,Unicorn接收到它,然后传递给ruby.这没有回答,然后Unicorn给了我502坏请求。

我真的迷上了这条路。

这是我的NGINX配置文件:

代码语言:javascript
复制
upstream applicationName {
    # Path to Puma SOCK file, as defined previously
    server unix:/tmp/applicationName.sock fail_timeout=0;
}

server {
  listen 80;
  server_name dev.applicationName.com.br;

  location / {
    autoindex on;
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header Host $host;
    # time out settings
    proxy_connect_timeout 159s;
    proxy_send_timeout   600;
    proxy_read_timeout   600;
    proxy_buffer_size    64k;
    proxy_buffers     16 32k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;
    proxy_pass_header Set-Cookie;
    proxy_redirect     off;
    proxy_hide_header  Vary;
    proxy_set_header   Accept-Encoding '';
    proxy_ignore_headers Cache-Control Expires;
    proxy_set_header   Referer $http_referer;
    proxy_set_header   Host   $host;
    proxy_set_header   Cookie $http_cookie;
    proxy_set_header   X-Real-IP  $remote_addr;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://applicationName;
  }
}

这是我的独角兽配置

代码语言:javascript
复制
@dir = File.expand_path(File.dirname(__FILE__)) + "/.."

worker_processes 2
working_directory @dir

timeout 10

listen File.join('/tmp/applicationName.sock')

preload_app true# if ENV['RAILS_ENV'] != 'development'

GC.respond_to?(:copy_on_write_friendly=) and
  GC.copy_on_write_friendly = true

check_client_connection false

before_fork do |server, worker|
  Signal.trap 'TERM' do
    puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
    Process.kill 'QUIT', Process.pid
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.connection.disconnect!
end

after_fork do |server, worker|
  Signal.trap 'TERM' do
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.establish_connection
end

这是Gemfile (没有问题)

代码语言:javascript
复制
source 'https://rubygems.org'
gem 'rails', '4.2.4'
gem 'unicorn-rails', '~> 2.2'
gem 'pg'
gem 'mysql2', '~> 0.3.18'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.1.0'
gem 'duktape'
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 2.0'
gem 'bootstrap-sass'
gem 'devise'
gem 'simple_form'
gem 'minitest'
gem "paperclip", "~> 4.3"
gem 'aws-sdk', '< 2.0'
gem 'mail_form', '~> 1.5.0.rc'
gem 'sendgrid-ruby'
gem 'zopim_rails'
gem 'meta-tags'
gem 'ckeditor'
gem 'slick_rails'

group :development do
  gem 'better_errors'
  gem 'binding_of_caller', :platforms=>[:mri_20]
  gem 'quiet_assets'
  gem 'rails_layout'
  gem 'spring-commands-rspec'
  gem 'web-console', '~> 2.0'
  gem 'spring'
end
group :production do
  gem 'therubyracer'
end
group :development, :test do
  gem 'factory_girl_rails'
  gem 'faker'
  gem 'pry-rails'
  gem 'pry-rescue'
  gem 'rspec-rails'
  gem 'rubocop'
  gem 'byebug'
end

group :test do
  gem 'capybara'
  gem 'database_cleaner'
  gem 'launchy'
  gem 'selenium-webdriver'
end

当发生错误时,服务器上的日志显示如下:

代码语言:javascript
复制
nginx_1 | 172.17.0.1 - - [05/Feb/2016:12:52:41 +0000] "GET /products HTTP/1.1" 502 574 "http://dev.nutrimais.com.br/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36"
web_1   | E, [2016-02-05T12:52:41.551728 #1] ERROR -- : reaped #<Process::Status: pid 9 SIGKILL (signal 9)> worker=0

在发展日志上:

代码语言:javascript
复制
Started GET "/products" for 127.0.0.1 at 2016-02-05 12:52:18 +0000
Cannot render console from 127.0.0.1! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-01-22 16:01:00

实际上,我的Linux服务器和位于另一台服务器上的DB的防火墙存在问题。我所做的是将DB服务器带到与rails应用程序相同的机器上。另一种解决方法是改变服务器机器的防火墙规则。我还没那么做,也不知道该怎么做。看起来这个问题只发生在MySQL上。

票数 0
EN

Stack Overflow用户

发布于 2018-02-14 09:52:26

您将MySQL移动到同一台服务器的修复也为我解决了这个问题,但这不适合我的生产环境,所以我更深入地研究了与该设置的区别所在。

结果发现,这与应用程序栈或配置无关,而是一个NAT超时正在扼杀我的会话。

我的服务器在Azure上,我的数据库在AWS中。Azure在出站连接上有4分钟不可配置的NAT超时时间。这意味着,如果数据库连接空闲超过4分钟,Azure就会默默地关闭端口映射,Rails应用程序试图发送的任何流量都会悄悄地进入黑洞。

修复是在Rails服务器的OS级别上按这个水珠进行的:将TCP保持活动间隔降到NAT超时的一半,并将保持活动间隔和重传调整为新的保持活动间隔的适当值。

对于Linux,您应该按照以下方式更改这些内核变量:

代码语言:javascript
复制
sudo sysctl net.ipv4.tcp_keepalive_time = 120     
sudo sysctl net.ipv4.tcp_keepalive_intvl = 30 
sudo sysctl net.ipv4.tcp_keepalive_probes = 8

对于Windows,您应该更改下面的注册表值。

所有DWORDHKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

代码语言:javascript
复制
KeepAliveInterval = 30 
KeepAliveTime = 120 
TcpMaxDataRetransmissions = 8
票数 1
EN

Stack Overflow用户

发布于 2016-02-11 07:20:25

我听说过独角兽的这类问题,如果一个站点在30分钟内没有被访问,那么下一个查询就会超时,并且它会超时所有的工作人员打开。我不知道为什么会发生这种情况。我希望这个折叠式链接能帮到你

http://bogomips.org/unicorn-public/CAKM1sPNRsES6H6ByK6bO9Djwa8WvYV6HJ-rEaHopRUYBVFfuhg@mail.gmail.com/t/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35223805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档