ruby Puma服务器:Facing Address already in use error while starting two instances on different ports on my local machine(在本地计算机的不同端口上启动两个示例时,出现Facing Address already in use错误)

sy5wg1nm  于 2023-05-06  发布在  Ruby
关注(0)|答案(1)|浏览(118)

我试图在我的开发机器上启动Puma服务器的两个示例(一个API和另一个WebApp)(通过基于hanami gem的应用程序),但无法成功启动WebApp的服务器。API服务器正常启动,但WebApp服务器显示错误Address already in use - bind(2) for "127.0.0.1" port 9293
请在下面找到服务器启动日志。
API应用程序日志

jignesh@jignesh-Latitude-7290:~/hanami_projects/my_api_app$ bundle exec hanami server --port=2400
13:59:36 - INFO - Using Guardfile at /......./my_api_app/Guardfile.
13:59:36 - INFO - Puma starting on port 2400 in development environment.
13:59:36 - INFO - Guard is now watching at '/......./my_api_app'
[15170] Puma starting in cluster mode...
[15170] * Puma version: 6.2.1 (ruby 3.1.2-p20) ("Speaking of Now")
[15170] *  Min threads: 5
[15170] *  Max threads: 5
[15170] *  Environment: development
[15170] *   Master PID: 15170
[15170] *      Workers: 2
[15170] *     Restarts: (✔) hot (✖) phased
[15170] * Preloading application
[15170] * Listening on http://0.0.0.0:2400
[15170] Use Ctrl-C to stop
[15170] * Starting control server on http://127.0.0.1:9293
[15170] * Starting control server on http://[::1]:9293
[15170] - Worker 0 (PID: 15177) booted in 0.0s, phase: 0
[15170] - Worker 1 (PID: 15179) booted in 0.0s, phase: 0
[15170] ! Terminating timed out worker (worker failed to check in within 60 seconds): 15177
[15170] - Worker 0 (PID: 25100) booted in 0.0s, phase: 0

WebApp日志

jignesh@jignesh-Latitude-7290:~/hanami_projects/my_web_app$ bundle exec hanami server
15:32:31 - INFO - Using Guardfile at /......./my_web_app/Guardfile.
15:32:32 - INFO - Puma starting on port 2300 in development environment.
15:32:32 - INFO - Guard is now watching at '/......./my_web_app'
[25763] Puma starting in cluster mode...
[25763] * Puma version: 6.2.2 (ruby 3.1.2-p20) ("Speaking of Now")
[25763] *  Min threads: 5
[25763] *  Max threads: 5
[25763] *  Environment: development
[25763] *   Master PID: 25763
[25763] *      Workers: 2
[25763] *     Restarts: (✔) hot (✖) phased
[25763] * Preloading application
[25763] * Listening on http://127.0.0.1:2300
[25763] Use Ctrl-C to stop
/home/jignesh/.rvm/gems/ruby-3.1.2@my_web_app/gems/puma-6.2.2/lib/puma/binder.rb:335:in `initialize': Address already in use - bind(2) for "127.0.0.1" port 9293 (Errno::EADDRINUSE)
    from /home/jignesh/.rvm/gems/ruby-3.1.2@my_web_app/gems/puma-6.2.2/lib/puma/binder.rb:335:in `new'
    from /home/jignesh/.rvm/gems/ruby-3.1.2@my_web_app/gems/puma-6.2.2/lib/puma/binder.rb:335:in `add_tcp_listener'
    from /home/jignesh/.rvm/gems/ruby-3.1.2@my_web_app/gems/puma-6.2.2/lib/puma/binder.rb:329:in `block in add_tcp_listener'
    from /home/jignesh/.rvm/gems/ruby-3.1.2@my_web_app/gems/puma-6.2.2/lib/puma/binder.rb:328:in `each'
    from /home/jignesh/.rvm/gems/ruby-3.1.2@my_web_app/gems/puma-6.2.2/lib/puma/binder.rb:328:in `add_tcp_listener'
    from /home/jignesh/.rvm/gems/ruby-3.1.2@my_web_app/gems/puma-6.2.2/lib/puma/binder.rb:164:in `block in parse'
    from /home/jignesh/.rvm/gems/ruby-3.1.2@my_web_app/gems/puma-6.2.2/lib/puma/binder.rb:147:in `each'
    from /home/jignesh/.rvm/gems/ruby-3.1.2@my_web_app/gems/puma-6.2.2/lib/puma/binder.rb:147:in `parse'
    from /home/jignesh/.rvm/gems/ruby-3.1.2@my_web_app/gems/puma-6.2.2/lib/puma/runner.rb:78:in `start_control'
    from /home/jignesh/.rvm/gems/ruby-3.1.2@my_web_app/gems/puma-6.2.2/lib/puma/cluster.rb:410:in `run'
    from /home/jignesh/.rvm/gems/ruby-3.1.2@my_web_app/gems/puma-6.2.2/lib/puma/launcher.rb:194:in `run'
    from /home/jignesh/.rvm/gems/ruby-3.1.2@my_web_app/gems/puma-6.2.2/lib/puma/cli.rb:75:in `run'
    from /home/jignesh/.rvm/gems/ruby-3.1.2@my_web_app/gems/puma-6.2.2/bin/puma:10:in `<top (required)>'
    from /home/jignesh/.rvm/gems/ruby-3.1.2@my_web_app/bin/puma:25:in `load'
    from /home/jignesh/.rvm/gems/ruby-3.1.2@my_web_app/bin/puma:25:in `<main>'
    from /home/jignesh/.rvm/gems/ruby-3.1.2@my_web_app/bin/ruby_executable_hooks:22:in `eval'
    from /home/jignesh/.rvm/gems/ruby-3.1.2@my_web_app/bin/ruby_executable_hooks:22:in `<main>'

下面是Puma配置文件app/config/puma.rb。在这两种应用中,配置是相同的。

# frozen_string_literal: true

max_threads_count = ENV.fetch("HANAMI_MAX_THREADS", 5)
min_threads_count = ENV.fetch("HANAMI_MIN_THREADS") { max_threads_count }
threads min_threads_count, max_threads_count

port        ENV.fetch("HANAMI_PORT", 2300)
environment ENV.fetch("HANAMI_ENV", "development")
workers     ENV.fetch("HANAMI_WEB_CONCURRENCY", 2)

on_worker_boot do
  Hanami.shutdown
end

preload_app!

因此,对于我的WebApp,我尝试根据https://github.com/puma/puma/issues/2113中的建议对my_web_app/config/puma.rb进行以下更改

#port        ENV.fetch("HANAMI_PORT", 2300)
bind        "tcp://127.0.0.1:2300"

但没找到
探索更多我发现一些更多的资源在以下位置
https://github.com/puma/puma/issues/782https://github.com/puma/puma/issues/1022https://github.com/puma/puma/pull/1318
但我不知道我该怎么办
有人能帮我解决这个问题吗?
以下是我的/etc/hosts的内容,以防万一

127.0.0.1   localhost
127.0.1.1   jignesh-Latitude-7290
127.0.0.1 api.some_api.local

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

谢谢

sbtkgmzw

sbtkgmzw1#

当puma启动时,它有两个监听端口:HTTP服务器和控制服务器。您正在为HTTP服务器而不是控制服务器配置不同的端口。这会导致您看到的错误,因为第二个服务器正试图在已使用的端口上启动控制服务器。
检查控制/状态服务器上的文档:
Puma有一个内置的状态和控制应用程序,可用于查询和控制Puma。

$ puma --control-url tcp://127.0.0.1:9293 --control-token foo

Puma将在本地主机端口9293上启动控制服务器。对控制服务器的所有请求都需要包含控制令牌(在本例中为token=foo)作为查询参数。这允许简单的身份验证。查看Puma::App::Statusstatus.rb以查看状态应用程序可用的内容。
因此,答案是您需要使用--control-url选项启动第二个应用程序,例如:

bundle exec puma --port=2400

和/或

bundle exec puma --control-url tcp://127.0.01:9294 --port=2300

但是为了清楚起见,我建议您在命令行上为每个选项专门定义所有选项,然后我会颠倒顺序,以便您知道9293用于2300,因为它们都有39294用于2400,因为它们都有4

bundle exec puma --control-url tcp://127.0.01:9293 --port=2300
bundle exec puma --control-url tcp://127.0.01:9294 --port=2400

puma.rb中没有允许设置此选项的选项,因此必须从命令行配置此选项。您目前使用的是bundle exec hanami ...而不是bundle exec puma ...,因此有两种可能的路径使此标志起作用:
1.你运行bundle exec hanami --control-url ...,它成功地将这些标志传递给Puma(但我不知道这是否会工作,因为我没有一个hanami应用程序来测试它)
1.您运行bundle exec puma --control-url ...并必须配置puma.rb以加载您的hanami应用程序(在How to configure Puma for a Hanami Application?的答案中解释)
我建议先尝试#1,如果不起作用,再看看#2。
无论哪种方式,定义--control-url标志都将解决此错误。

相关问题