Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如果空闲,Rails将停止响应_Ruby On Rails_Nginx_Unicorn - Fatal编程技术网

Ruby on rails 如果空闲,Rails将停止响应

Ruby on rails 如果空闲,Rails将停止响应,ruby-on-rails,nginx,unicorn,Ruby On Rails,Nginx,Unicorn,我有这个问题已经有一段时间了,并且搜索了很多关于这个问题的信息,但是似乎没有什么能解决我的问题 我有一个应用程序运行在RubyonRails上,使用NGINX和UNICORN以及Docker 如果我运行应用程序(docker compose up),网站可以完美地运行几分钟。如果网站闲置5到10分钟,我发送另一个请求,rails应用程序将停止响应,并从Unicorn处暂停 奇怪的是,我开发的每个应用程序都有相同的问题,这些应用程序唯一的共同点就是Gemfile 到目前为止,我发现当请求被发送时,

我有这个问题已经有一段时间了,并且搜索了很多关于这个问题的信息,但是似乎没有什么能解决我的问题

我有一个应用程序运行在RubyonRails上,使用NGINX和UNICORN以及Docker

如果我运行应用程序(docker compose up),网站可以完美地运行几分钟。如果网站闲置5到10分钟,我发送另一个请求,rails应用程序将停止响应,并从Unicorn处暂停

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

到目前为止,我发现当请求被发送时,NGINX接收到这个请求,将它传递给Unicorn,Unicorn接收到它并传递给ruby。。。没有回答,独角兽给了我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;
  }
}
这是我的独角兽配置

@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
这是GEM文件(没有问题)


我听说过unicorn存在这样的问题,如果一个站点在大约(平均)30分钟内没有被访问,那么下一个查询将超时,并且它将在所有打开的worker上超时。我不知道为什么会这样。 我希望下面的链接可以帮助您


事实上,这是我的Linux服务器的防火墙和位于另一台服务器上的DB的问题。我所做的是将DB服务器与rails应用程序放在同一台机器上。另一种修复方法是更改服务器机器的防火墙规则。我还没做过,也不知道该怎么做。看起来这个问题只发生在MySQL上。

您将MySQL移动到同一台服务器的修复方案也解决了我的问题,但这不适合我的生产环境,因此我深入研究了该设置的不同之处

事实证明,这与应用程序堆栈或配置无关,而是NAT超时杀死了我的会话

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

修复是在Rails服务器上的操作系统级别进行的:将TCP keepalive间隔降低到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,您应该更改下面的注册表值

HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
中的所有
DWORD
s:

KeepAliveInterval = 30 
KeepAliveTime = 120 
TcpMaxDataRetransmissions = 8

你试过多调试一下吗?比如直接启动您的rails服务器(rails的产品)并访问该服务器,或者尝试类似于独角兽的passenger或puma?如果备选方案仍然出现问题,那么肯定会缩小范围,你不这么认为吗?:)我试过彪马,结果更糟。应用程序在几分钟后开始变慢并崩溃,使得用户再次进入网站。这很奇怪。。。当您启动“rails服务器产品”并直接通过访问它时,会发生什么情况?由于该项目是与docker合作的,我现在正试图使其直接运行rails日志中的错误来自web控制台。尝试将ip添加到白名单,并查看HPPNS读取您的链接的内容,这似乎是linux上具有DB连接的防火墙的问题。但它是docker映像的linux还是我服务器的linux?答案不清楚我该怎么做。
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
sudo sysctl net.ipv4.tcp_keepalive_time = 120     
sudo sysctl net.ipv4.tcp_keepalive_intvl = 30 
sudo sysctl net.ipv4.tcp_keepalive_probes = 8
KeepAliveInterval = 30 
KeepAliveTime = 120 
TcpMaxDataRetransmissions = 8