Подтвердить что ты не робот

Rails перестает отвечать, если Idle

У меня была эта проблема некоторое время и много об этом потрудилась, но, похоже, проблема не решена.

У меня есть приложение, работающее в Ruby on Rails с NGINX и UNICORN с Docker.

Если я запустил приложение (доклер-компостирование), веб-сайт отлично работает в течение нескольких минут. Если веб-сайт остается бездействующим в течение 5-10 минут, и я посылаю другой запрос, приложение rails перестает отвечать на запросы, отдавая время от Unicorn.

Странная часть заключается в том, что каждое приложение, которое я разрабатываю, имеет одну и ту же проблему, и единственное, что есть в этих приложениях, - это Gemfile.

То, что я нашел до сих пор, заключается в том, что когда запрос отправляется, NGINX получает этот запрос, передает его в Единорог, Единорог получает его и переходит к рубину... который не отвечает, а затем Единорог дает мне 502 плохой запрос.

Я действительно потерялся в этом.

это мой конфигурационный файл NGINX:

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;
  }
}

И это мой конфигуратор unicorn

@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 (ничего страшного)

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

Журнал на сервере показывает мне это, когда происходит ошибка:

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

И в журнале разработки:

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
4b9b3361

Ответ 1

На деле это проблема с брандмауэром моего Linux-сервера и БД, который находится на другом сервере. То, что я сделал, приносит сервер БД на тот же самый компьютер, что и мое приложение для рельсов. Другой способ исправить это - изменить правила брандмауэра серверной машины. Я этого не сделал и не знаю, как это сделать. Похоже, эта проблема возникает только с MySQL.

Ответ 2

Ваше исправление перемещения MySQL на тот же сервер также устранило проблему для меня, но это не подходит для моей производственной среды, поэтому я углубился в то, что изменило эту настройку.

Оказалось, что это ничего не связано со стеком приложений или конфигурацией, но тайм-аут NAT, который убивал мои сеансы.

У меня был сервер на Azure и моя база данных в AWS. Azure имеет 4-х минутный неконфигурируемый тайм-аут NAT для исходящих соединений. Это означает, что если соединение с базой данных простаивало более 4 минут, Azure просто молчала бы сопоставление портов и любой трафик, который приложение Rails пыталось отправить вниз, этот порт молча пошел в черную дыру.

Исправление было за этот blob на уровне ОС на сервере Rails: отмените интервал keepalive TCP на половину таймаута NAT и отрегулируйте интервал keepalive и повторные передачи на соответствующие значения для нового интервала keepalive.

Для Linux вы должны изменить эти переменные ядра следующим образом:

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 вы должны изменить значения реестра ниже.

Все DWORD в HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters:

KeepAliveInterval = 30 
KeepAliveTime = 120 
TcpMaxDataRetransmissions = 8

Ответ 3

Я слышал о таких проблемах с единорогом, что если на сайт не будет доступен примерно (средний) 30 минут, следующий запрос будет тайм-аут, и он будет тайм-аут для всех открытых рабочих. Я не знаю, почему это происходит. Я надеюсь, что следующая ссылка может помочь вам

http://bogomips.org/unicorn-public/[email protected]om/t/