【问题标题】:Keep getting 504 Gateway Time-out after deploying on ec2 using rubber使用橡胶在 ec2 上部署后不断收到 504 网关超时
【发布时间】:2012-03-13 00:19:32
【问题描述】:

我使用橡胶 gem 在 ec2 上部署我的应用程序。 我按照这里的说明进行操作:http://ramenlab.wordpress.com/2011/06/24/deploying-your-rails-app-to-aws-ec2-using-rubber/.
该过程似乎成功完成,但是当我尝试使用该应用程序时,我不断收到 504 网关超时。 为什么会发生这种情况,我该如何解决?

【问题讨论】:

  • 您如何尝试使用该应用程序?是否打开了正确的 TCP/IP 端口?在 AWS Web 控制台或命令行中检查 :)
  • 我运行了 cap deploy:check 并且没问题,所以我认为一切正常,是否有更好的检查方法?
  • 老实说,我从未在 Rails 上使用过 ruby​​,但您是否查看过 AWS Web 控制台中的安全设置并确认正确的端口已打开?对我来说听起来像是防火墙问题
  • 遇到同样的问题。似乎是在 deploy:restart 之后出现 504 消息......真的很烦人
  • 这发生在我身上一次,然后服务器似乎已经启动并且下一个请求通过就好了。有没有办法在 capistrano 完成所有告诉服务器继续旋转或其他什么的东西后进行回调?

标签: ruby-on-rails deployment amazon-ec2 passenger


【解决方案1】:

Matthew Conway 的回答(转贴在下面):https://groups.google.com/forum/?fromgroups#!searchin/rubber-ec2/504/rubber-ec2/AtEoOf-T9M0/zgda0Fo1qeIJ

注意:即使使用此代码,您也需要执行以下操作:

> 上限部署:更新

> FILTER=app01,app02 cap deploy:restart

> FILTER=app03,app04 cap deploy:restart


我认为这是一个 Rails 应用程序?众所周知,rails 堆栈的加载速度很慢,因此加载时间的延迟可能就是您所看到的。乘客应该通过零停机时间功能 v3 来改善这一点,但他们似乎已经违背了这一点,并且只会在未来某个未定义的时间点将其作为某些未定义的付费版本的一部分提供。

我所做的是拥有多个应用服务器实例并依次重新启动它们,这样我就可以继续在其中一个上提供流量,而其他实例正在重新启动。不适用于单个实例,但大多数生产设置无论如何都需要多个实例以实现冗余/可靠性。这目前不是橡胶的一部分,但我让它为我的应用程序部署脚本设置,并将在某个时候将其合并 - 我的配置如下所示。

马特

rubber-passenger.yml:

roles:
  passenger:
    rolling_restart_port: "#{passenger_listen_port}"

  web_tools:
    rolling_restart_port: "#{web_tools_port}"

部署-apache.rb:

on :load do
  rubber.serial_task self, :serial_restart, :roles => [:app, :apache] do
    rsudo "service apache2 restart"
  end
  rubber.serial_task self, :serial_reload, :roles => [:app, :apache] do
    # remove file checked by haproxy to take server out of pool, wait some
    # secs for haproxy to realize it
    maybe_sleep = " && sleep 5" if RUBBER_ENV == 'production'
    rsudo "rm -f #{previous_release}/public/httpchk.txt #{current_release}/public/httpchk.txt#{maybe_sleep}"

    rsudo "if ! ps ax | grep -v grep | grep -c apache2 &> /dev/null; then service apache2 start; else service apache2 reload; fi"

    # Wait for passenger to startup before adding host back into haproxy pool
    logger.info "Waiting for passenger to startup"

    opts = get_host_options('rolling_restart_port') {|port| port.to_s}
    rsudo "while ! curl -s -f http://localhost:$CAPISTRANO:VAR$/ &> /dev/null; do echo .; done", opts

    # Touch the file so that haproxy adds this server back into the pool.
    rsudo "touch #{current_path}/public/httpchk.txt#{maybe_sleep}"
  end
end

after "deploy:restart", "rubber:apache:reload"


desc "Starts the apache web server"
task :start, :roles => :apache do
  rsudo "service apache2 start"
  opts = get_host_options('rolling_restart_port') {|port| port.to_s}
  rsudo "while ! curl -s -f http://localhost:$CAPISTRANO:VAR$/ &> /dev/null; do echo .; done", opts
  rsudo "touch #{current_path}/public/httpchk.txt"
end

【讨论】:

  • 有趣!那么,对于“众所周知,Rails 堆栈的加载速度非常慢”,我们通常是在说几分钟还是几小时......?
【解决方案2】:

我遇到了同样的错误并解决了问题。 这是“haproxy”超时。它是由 Rubber 安装的负载平衡器。 设置为 30000ms,你应该在橡胶配置文件中更改它。

祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-05
    • 2012-08-20
    • 2015-10-20
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 2012-06-11
    • 2013-01-29
    相关资源
    最近更新 更多