Foreman/Puma在开发环境中未使用指定的端口

14

我在application.yml中将端口设置为3000(由figaro管理环境变量)rails s使用端口3000,但是当我运行foreman start(Heroku推荐的方式)时,我会得到以下输出

14:53:23 web.1  | started with pid 24425
14:53:23 web.1  | [24425] Puma starting in cluster mode...
14:53:23 web.1  | [24425] * Version 2.11.1 (ruby 2.2.0-p0), codename: Intrepid Squirrel
14:53:23 web.1  | [24425] * Min threads: 5, max threads: 5
14:53:23 web.1  | [24425] * Environment: development
14:53:23 web.1  | [24425] * Process workers: 2
14:53:23 web.1  | [24425] * Preloading application
14:53:24 web.1  | WARNING: Skipping key "PORT". Already set in ENV.
14:53:25 web.1  | [24425] * Listening on tcp://0.0.0.0:5000
14:53:25 web.1  | [24425] Use Ctrl-C to stop
14:53:25 web.1  | [24425] - Worker 0 (pid: 24426) booted, phase: 0
14:53:25 web.1  | [24425] - Worker 1 (pid: 24427) booted, phase: 0

Procfile

web: bundle exec puma -C config/puma.rb

config/puma.rb

workers Integer(ENV['WEB_CONCURRENCY'] || 2)
threads_count = Integer(ENV['MAX_THREADS'] || 5)
threads threads_count, threads_count

preload_app!

rackup      DefaultRackup
port        ENV['PORT']     || 3000
environment ENV['RACK_ENV'] || 'development'

on_worker_boot do
  ActiveRecord::Base.establish_connection
end

config/application.yml

PORT: "3000"
  • Rails 4.2.0
  • Foreman 0.78.0
  • Ruby 2.2.0p0
  • Puma 2.11.1

你的问题是为什么你的配置文件不能正常工作以及如何设置 'foreman start' 默认使用 3000 端口,还是想知道如何能够使用端口 3000 来运行 'foreman'?如果是后者,你可以通过在 Procfile 中添加 '-p $PORT' 来实现内联:web: bundle exec puma -p $PORT -C config/puma.rb。然后,你可以使用: foreman start -p 3000 - Sid
1
后者应该解决我的问题,但前者是我的实际问题,为什么foreman没有使用3000端口? - Voska
另外,我尝试内联添加“-p $PORT”,但没有起作用,它仍然使用端口5000,“foreman start -p 3000”可以工作,但是如何在没有命令行选项的情况下使其工作? - Voska
1
我自己没有尝试过,但是如果你在Procfile中使用了web: bundle exec puma -p ${PORT:-3000} -e ${RACK_ENV:-development} -C config/puma.rb,那么你应该可以只使用foreman start - Sid
@sid 看上去应该是可以工作的,但我看到使用了端口5000。我确定 $PORT 没有值。 - justingordon
3个回答

10

普马港口上的神秘问题已解决。

将此打印内容放入您的config/puma.rb文件中。

然后您会发现,尽管在您的ENV中没有设置,但某种方式端口神秘地设置为5000。

底部修复方法。

puma_port = ENV['PORT'] || 3000
puts "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
puts "puma_port is #{puma_port}"
puts "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ”

那会打印出

16:49:28 web.1  | ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
16:49:28 web.1  | puma_port is 5000
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

接着将这行代码加入你的 Procfile 中(不是用于 Heroku 的那个)。我有一个叫做 Procfile.dev 的文件。

web: PORT=3000 bundle exec puma -C config/puma.rb

我用这个命令来运行它:

foreman start -f Procfile.dev

原来Foreman会将$PORT变量设置为5000、5100、5200等,对于Procfile中的每一行,如果它尚未设置。目前还没有任何文档记录这一点,但是在深入研究其源代码后,似乎就是这样。因此,要么将PORT作为环境变量填充,要么在config/puma.rb中硬编码puma端口,或者像本答案中提到的那样,在Procfile行的开头硬编码端口。 - Qqwy

4
请在 .foreman 文件中使用以下内容:
port: 3000

或者一个包含以下内容的 .env 文件:
PORT=3000

任何一种都可以,然后你只需使用foreman start即可。

2

port ENV['PORT'] || 3000

这行代码意味着你将首先尝试使用ENV['PORT'],如果不存在,则会回退到使用3000作为端口号。所以,在foreman启动之前,你是否定义了PORT环境变量?config/application.yml环境变量只会在rails服务器启动后加载,因此在此处定义端口号是无用的。
你可以尝试在项目目录的根目录中添加

PORT=3000.env文件中。

来源:https://devcenter.heroku.com/articles/getting-started-with-rails5#procfile

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接