我在RubyOnRails中有一个应用程序,由CDN服务后面的NGINX服务器代理。 CDN有一个限制,如果响应的第一个字节没有在60秒内到达,CDN服务器响应:
Error 503 first byte timeout
问题是,我确实有一些需要在Rails上处理超过60秒的请求。 有没有办法破解这个响应,在响应完成处理之前发送几个字节? 怎么样?
编辑1 :
我知道60年代已经很久了,我们正在想办法避免这种情况。 不过,我需要一个临时解决scheme,让60年代的请求工作。 即使我使用Ajax,一些Ajax调用也需要60多秒,而且会陷入同样的问题。 tcp_nopush或tcp_nodelay选项不起作用,我认为这是因为nginx正在等待rails应用程序响应,以知道它应该发送什么标题。 所以,也许这个解决scheme是我需要在RubyOnRails请求/响应周期内破解的
超过60秒的请求是相当长的时间。 您可能想要查看您的应用程序。 长时间的页面加载时间可能会有很多访问者退出您的应用程序。 您可能想要考虑像AJAX或websockets那样asynchronous加载数据。
第一个字节的时间通常应用于标题,而不是响应主体。 客户端应该在早期收到头文件。 你确定这是你的CDN超时请求吗? NGinx也会超时你的请求。 检查的一个好方法是用curl:
curl -I -H "Host: <domain>" http://<ip of proxy>/request/uri
(使用您的代理的真实IP,而不是CDN IP)
-I选项会显示响应标题,这样你可以很好地指出nginx返回的错误代码(如果有的话)。 你也可以看到你是否接收到请求标题和需要多长时间,因为这是tcp的第一个字节所指的。
如果您没有快速收到标题,请尝试使用:
http { tcp_nopush off; tcp_nodelay on; # force socket to send buffer }
如果出现网关超时错误或类似情况,请尝试以下configuration选项:
http { keepalive_timeout 300; proxy_connect_timeout 300; proxy_read_timeout 300; proxy_send_timeout 300; }