0

問題:thinの再起動中に行われたすべての要求により、502BadGatewayエラーが発生します。

コードの変更をサーバーにデプロイするとき、新しい変更を有効にするには、thinを再起動する必要があります。私のthinconfigymlは次のようになります:

chdir: /var/www/appname
servers: 6
environment: production
onebyone: true
wait: 30
no-epoll: true
address: 0.0.0.0
port: 3000
timeout: 30
log: log/thin.log
pid: tmp/pids/thin.pid
max_conns: 1024
max_persistent_conns: 512
require: []
daemonize: true

私の理解では、プロパティ「onebyone」は、要求に応答するために少なくとも1つのサーバーが常に使用可能であることを確認します。ただし、すべてのサーバーの再起動が完了するまでに要求を行うと、502BadGatewayエラーまたは504GatewayTimeoutが発生します。新しいコードを本番環境にプッシュした後、リクエストが常に適切に処理されるようにするにはどうすればよいですか?

アップデート

薄いログはこのエラーを示しています:

/usr/local/lib/ruby/gems/1.9.1/gems/eventmachine-0.12.10/lib/eventmachine.rb:572:in `start_tcp_server': no acceptor (RuntimeError)
    from /usr/local/lib/ruby/gems/1.9.1/gems/eventmachine-0.12.10/lib/eventmachine.rb:572:in `start_server'
    from /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.3.1/lib/thin/backends/tcp_server.rb:16:in `connect'
    from /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.3.1/lib/thin/backends/base.rb:53:in `block in start'
    from /usr/local/lib/ruby/gems/1.9.1/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `call'
    from /usr/local/lib/ruby/gems/1.9.1/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `run_machine'
    from /usr/local/lib/ruby/gems/1.9.1/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `run'
    from /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.3.1/lib/thin/backends/base.rb:61:in `start'
    from /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.3.1/lib/thin/server.rb:159:in `start'
    from /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.3.1/lib/thin/controllers/controller.rb:86:in `start'
    from /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.3.1/lib/thin/runner.rb:185:in `run_command'
    from /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.3.1/lib/thin/runner.rb:151:in `run!'
    from /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.3.1/bin/thin:6:in `<top (required)>'
    from /usr/local/bin/thin:19:in `load'
    from /usr/local/bin/thin:19:in `<main>'

で再起動していますsudo thin -C /etc/thin/appname.yaml restart

何が起こっているのかというと、thinはポート3000でリッスンしようとしているようですが、前のThinプロセスはまだそのポートで実行されていますか?なぜこれが起こるのでしょうか?

4

1 に答える 1

1

Thinが停止すると、Nginxとの通信中にソケットファイルが削除され、正常に起動すると再作成されます。Thinを停止しても、NGinxは引き続きWebリクエストをリッスンしています。その時点でNginxにリクエストが行われると、おっしゃるようにエラーが発生します。これは、Thinが正しく起動できなかったか、ケースのソケットにバインドできなかったことを意味します。それはあなたが停止して開始するのが速すぎることを意味している可能性があります。

このようなキャップタスクは正常に機能するはずです。

task :restart do
  sudo "bundle exec thin restart -C thin.yml"
end

onebyoneを削除しても、これはまだ問題ですか?

また、この記事は、ThinとCapistranoでローリングリスタートを実装するのに非常に役立つことがわかりました-http ://pointatstar.wordpress.com/2011/01/17/rolling-restart-for-thin-cluster-via-capistrano/

個人的には、ローリングリスタートが組み込まれているUnicornを使用しています。これはRailsCastでカバーされていました-http ://railscasts.com/episodes/373-zero-downtime-deployment

于 2012-11-11T09:59:30.897 に答える