puma start 导致“已经有一个服务器绑定到:<socket>”错误

dja*_*o09 5 ruby-on-rails puma server

我一直无法可靠地重现这个问题,所以我将描述正在发生的事情,并希望你们中的一位聪明的美洲狮孩子可以帮助我。

我总是在部署过程结束时停止并启动 puma。我运行pumactl -F <config_path> stop,它可以工作,然后是 command puma -q -d -e staging -C <config_path>,有时(并非总是)会导致以下错误:

[12802] Puma starting in cluster mode... 
[12802] * Version 2.11.3 (ruby 2.1.2-p95), codename: Intrepid Squirrel
[12802] * Min threads: 2, max threads: 4
[12802] * Environment: staging
[12802] * Process workers: 2
[12802] * Phased restart available 
[12802] * Listening on unix:///<app_dir>/tmp/puma/sockets/puma.sock 
<ruby_path>/2.1.0/gems/puma-2.11.3/lib/puma/binder.rb:284:in `add_unix_listener': There is already a server bound to: <app_dir>/tmp/puma/sockets/puma.sock (RuntimeError)
<ruby_path>/2.1.0/gems/puma-2.11.3/lib/puma/binder.rb:124:in `block in parse'
<ruby_path>/2.1.0/gems/puma-2.11.3/lib/puma/binder.rb:82:in `each'
<ruby_path>/2.1.0/gems/puma-2.11.3/lib/puma/binder.rb:82:in `parse'
<ruby_path>/2.1.0/gems/puma-2.11.3/lib/puma/cluster.rb:325:in `run'
<ruby_path>/2.1.0/gems/puma-2.11.3/lib/puma/cli.rb:216:in `run'
<ruby_path>/2.1.0/gems/puma-2.11.3/bin/puma:10:in `<top (required)>'
<ruby_path>/2.1.0/bin/puma:23:in `load'
<ruby_path>/2.1.0/bin/puma:23:in `<main>'
Run Code Online (Sandbox Code Playgroud)

如果我之后尝试再次运行相同的 puma start 命令,它会起作用。

这是我的美洲狮配置:

#!/usr/bin/env puma

directory "<app_dir>/current"
rackup "<app_dir>/current/config.ru"
environment "staging"

pidfile "<app_dir>/tmp/puma/pid"
state_path "<app_dir>/tmp/puma/state"
activate_control_app "<app_dir>/tmp/puma/sockets/pumactl.sock"

stdout_redirect "<app_dir>/shared/log/puma.error.log", "<app_dir>/shared/log/puma.access.log", true

threads 2,4

bind "unix:///<app_dir>/tmp/puma/sockets/puma.sock"

workers 2
Run Code Online (Sandbox Code Playgroud)

我的问题:

  1. 我怎样才能重现这个错误?
  2. 我该如何解决?这是 puma 的问题还是我的配置问题?

dja*_*o09 1

而不是运行这两个命令...

pumactl -F <config_path> stop
puma -q -d -e <env> -C <config_path>
Run Code Online (Sandbox Code Playgroud)

只需使用重新启动命令:

pumactl -F <config_path> restart
Run Code Online (Sandbox Code Playgroud)

解释

puma 自述文件有一个关于重新启动的部分,其中没有提到依次调用停止和启动命令。由于该用例不受支持,因此对restartpuma 服务器使用既定方法很可能会解决此问题。

笔记

我无法一致地重现此 puma 错误,因此我无法 100% 确认使用pumactl restart修复了问题。(尽管 puma 缺乏对pumactl stopfollow by的支持puma暗示了它确实如此。)如果有人在使用受支持的时仍然遇到此问题pumactl restart,请告诉我,以便我可以修改此答案。