Rails4.2开发服务器默认绑定ip如何修改?
How to change the default binding ip of Rails 4.2 development server?
将我们团队的rails应用程序升级到4.2后,如release note所述,rails server
绑定的默认ip从[=14=更改为localhost
].
我们用 Vagrant 开发,希望开发服务器可以直接从主机上的浏览器访问。
以后不用每次都输入rails s -b 0.0.0.0
了,不知道有没有更优雅的方案,让我们仍然可以像rails s
一样简单的启动服务器。也许:
- 配置文件
rails s
读取我可以在哪里修改默认绑定ip(不使用-c
)
- 使用 vagrant 进行端口转发(尝试但失败,请参阅下面遇到的问题)
- 一个 monkey patch to rack,它改变了默认的绑定 ip
这背后的真正目标是我希望我们的团队能够顺利升级,避免由于缺少 -b 0.0.0.0
部分而导致人们不得不不断重启 rails 服务器的故障.
我尝试了 vagrant 端口转发,但是当我在主机上访问 localhost:3000
时仍然得到 Connection Refused
。我试过的两条配置线是:
config.vm.network "forwarded_port", guest: 3000, host: 3000
config.vm.network "forwarded_port", guest: 3000, guest_ip: '127.0.0.1', host: 3000
在官方文档中没有找到任何相关说明。任何帮助将不胜感激。
您可以使用 foreman 到 运行 a Procfile
与您的自定义命令:
# Procfile in Rails application root
web: bundle exec rails s -b 0.0.0.0
现在启动您的 Rails 应用程序:
foreman start
foreman 的好处是您可以将其他应用程序添加到 Procfile(如 sidekiq、mailcatcher)。
工头的坏处是你必须训练你的团队运行foreman start
而不是rails s
。
我在这里遇到了同样的问题,今天我找到了更好的解决方案。只需将此代码附加到您的 config/boot.rb,它应该可以与 vagrant 一起使用。
require 'rails/commands/server'
module Rails
class Server
def default_options
super.merge(Host: '0.0.0.0', Port: 3000)
end
end
end
ps:它基于:this answer
如果您将默认选项放在 config/boot.rb
上,那么 rake 和 rails 的所有命令属性都会失败(例如:rake -T
或 rails g model user
) ! 因此,将此附加到 bin/rails
行 require_relative '../config/boot'
之后,代码仅针对 rails 服务器命令执行:
if ARGV.first == 's' || ARGV.first == 'server'
require 'rails/commands/server'
module Rails
class Server
def default_options
super.merge(Host: '0.0.0.0', Port: 3000)
end
end
end
end
bin/rails
文件如下所示:
#!/usr/bin/env ruby
APP_PATH = File.expand_path('../../config/application', __FILE__)
require_relative '../config/boot'
# Set default host and port to rails server
if ARGV.first == 's' || ARGV.first == 'server'
require 'rails/commands/server'
module Rails
class Server
def default_options
super.merge(Host: '0.0.0.0', Port: 3000)
end
end
end
end
require 'rails/commands'
遇到同样的问题。找到博客 Make Rails 4.2 server listens to all interfaces.
将以下内容添加到 config/boot.rb
require 'rails/commands/server'
module Rails
class Server
alias :default_options_bk :default_options
def default_options
default_options_bk.merge!(Host: '0.0.0.0')
end
end
end
这是我正在使用的一个更简单的解决方案。我已经 like/need dotenv and puma-heroku,所以如果使用这些对你不起作用那么这可能不适合你。
/config/puma.rb
plugin :heroku
Gemfile
gem 'dotenv-rails', groups: [:development, :test]
.env
PORT=8080
现在我可以用 rails s
开始开发和生产了。
切换到Puma并在config/puma.rb
中指定port
,例如:
port ENV.fetch("PORT") { 3000 }
显然它将绑定到指定端口的 0.0.0.0:https://github.com/puma/puma/issues/896
对于带有 Puma 3.12.1 的 Rails 5.1.7,所选答案不起作用,但我通过将以下内容添加到我的 config/puma.rb
文件中来完成它:
set_default_host '0.0.0.0' # Note: Must come BEFORE defining the port
port ENV.fetch('PORT') { 3000 }
我通过检查 dsl file 确定了这一点。它在该文件上使用 instance_eval
,因此可能还有其他方法可以做到这一点,但这对我来说似乎是最合理的。
如果您使用docker或其他工具管理环境变量,您可以将HOST
环境变量设置为您需要绑定的IP。
示例:
HOST=0.0.0.0
如果您使用 Docker 或 .env
如果您使用工头,请将其添加到 docker.env
文件。
对于 Puma 的 Rails 5,所选答案无效。你可能会得到这样的错误:cannot load such file -- rails/commands/server
为了获得正确的解决方案,请将以下内容添加到 config/puma.rb
:
bind 'tcp://0.0.0.0:3000'
将我们团队的rails应用程序升级到4.2后,如release note所述,rails server
绑定的默认ip从[=14=更改为localhost
].
我们用 Vagrant 开发,希望开发服务器可以直接从主机上的浏览器访问。
以后不用每次都输入rails s -b 0.0.0.0
了,不知道有没有更优雅的方案,让我们仍然可以像rails s
一样简单的启动服务器。也许:
- 配置文件
rails s
读取我可以在哪里修改默认绑定ip(不使用-c
) - 使用 vagrant 进行端口转发(尝试但失败,请参阅下面遇到的问题)
- 一个 monkey patch to rack,它改变了默认的绑定 ip
这背后的真正目标是我希望我们的团队能够顺利升级,避免由于缺少 -b 0.0.0.0
部分而导致人们不得不不断重启 rails 服务器的故障.
我尝试了 vagrant 端口转发,但是当我在主机上访问 localhost:3000
时仍然得到 Connection Refused
。我试过的两条配置线是:
config.vm.network "forwarded_port", guest: 3000, host: 3000
config.vm.network "forwarded_port", guest: 3000, guest_ip: '127.0.0.1', host: 3000
在官方文档中没有找到任何相关说明。任何帮助将不胜感激。
您可以使用 foreman 到 运行 a Procfile
与您的自定义命令:
# Procfile in Rails application root
web: bundle exec rails s -b 0.0.0.0
现在启动您的 Rails 应用程序:
foreman start
foreman 的好处是您可以将其他应用程序添加到 Procfile(如 sidekiq、mailcatcher)。
工头的坏处是你必须训练你的团队运行foreman start
而不是rails s
。
我在这里遇到了同样的问题,今天我找到了更好的解决方案。只需将此代码附加到您的 config/boot.rb,它应该可以与 vagrant 一起使用。
require 'rails/commands/server'
module Rails
class Server
def default_options
super.merge(Host: '0.0.0.0', Port: 3000)
end
end
end
ps:它基于:this answer
如果您将默认选项放在 config/boot.rb
上,那么 rake 和 rails 的所有命令属性都会失败(例如:rake -T
或 rails g model user
) ! 因此,将此附加到 bin/rails
行 require_relative '../config/boot'
之后,代码仅针对 rails 服务器命令执行:
if ARGV.first == 's' || ARGV.first == 'server'
require 'rails/commands/server'
module Rails
class Server
def default_options
super.merge(Host: '0.0.0.0', Port: 3000)
end
end
end
end
bin/rails
文件如下所示:
#!/usr/bin/env ruby
APP_PATH = File.expand_path('../../config/application', __FILE__)
require_relative '../config/boot'
# Set default host and port to rails server
if ARGV.first == 's' || ARGV.first == 'server'
require 'rails/commands/server'
module Rails
class Server
def default_options
super.merge(Host: '0.0.0.0', Port: 3000)
end
end
end
end
require 'rails/commands'
遇到同样的问题。找到博客 Make Rails 4.2 server listens to all interfaces.
将以下内容添加到 config/boot.rb
require 'rails/commands/server'
module Rails
class Server
alias :default_options_bk :default_options
def default_options
default_options_bk.merge!(Host: '0.0.0.0')
end
end
end
这是我正在使用的一个更简单的解决方案。我已经 like/need dotenv and puma-heroku,所以如果使用这些对你不起作用那么这可能不适合你。
/config/puma.rb
plugin :heroku
Gemfile
gem 'dotenv-rails', groups: [:development, :test]
.env
PORT=8080
现在我可以用 rails s
开始开发和生产了。
切换到Puma并在config/puma.rb
中指定port
,例如:
port ENV.fetch("PORT") { 3000 }
显然它将绑定到指定端口的 0.0.0.0:https://github.com/puma/puma/issues/896
对于带有 Puma 3.12.1 的 Rails 5.1.7,所选答案不起作用,但我通过将以下内容添加到我的 config/puma.rb
文件中来完成它:
set_default_host '0.0.0.0' # Note: Must come BEFORE defining the port
port ENV.fetch('PORT') { 3000 }
我通过检查 dsl file 确定了这一点。它在该文件上使用 instance_eval
,因此可能还有其他方法可以做到这一点,但这对我来说似乎是最合理的。
如果您使用docker或其他工具管理环境变量,您可以将HOST
环境变量设置为您需要绑定的IP。
示例:
HOST=0.0.0.0
如果您使用 Docker 或 .env
如果您使用工头,请将其添加到 docker.env
文件。
对于 Puma 的 Rails 5,所选答案无效。你可能会得到这样的错误:cannot load such file -- rails/commands/server
为了获得正确的解决方案,请将以下内容添加到 config/puma.rb
:
bind 'tcp://0.0.0.0:3000'