Ruby on rails 如果空闲,Rails将停止响应
我有这个问题已经有一段时间了,并且搜索了很多关于这个问题的信息,但是似乎没有什么能解决我的问题 我有一个应用程序运行在RubyonRails上,使用NGINX和UNICORN以及Docker 如果我运行应用程序(docker compose up),网站可以完美地运行几分钟。如果网站闲置5到10分钟,我发送另一个请求,rails应用程序将停止响应,并从Unicorn处暂停 奇怪的是,我开发的每个应用程序都有相同的问题,这些应用程序唯一的共同点就是Gemfile 到目前为止,我发现当请求被发送时,NGINX接收到这个请求,将它传递给Unicorn,Unicorn接收到它并传递给ruby。。。没有回答,独角兽给了我502个错误的请求 我真的很迷茫 这是我的NGINX配置文件: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 到目前为止,我发现当请求被发送时,
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