Как получить доступ к гостевому порту 3000 с хоста?

Вот мой Vagrantfile:

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|
config.vm.box = "ubuntu-14.04-x64"

# Sync'd folders
config.vm.synced_folder ".",           "/vagrant",  disabled: true
config.vm.synced_folder "~/work",      "/home/vagrant/work", create: true
config.vm.synced_folder "~/apt-archives", "/var/cache/apt/archives/", create: true

# Ubuntu VM
config.vm.define "ubuntu" do |ubuntu|
ubuntu.vm.provision "shell", path: "provision.sh", privileged: false
ubuntu.vm.network "forwarded_port", guest: 3000, host: 8080   # http
ubuntu.vm.network "private_network", ip: "10.20.30.100"
ubuntu.vm.hostname = "ubuntu"

# VirtualBox Specific Stuff
# https://www.virtualbox.org/manual/ch08.html
config.vm.provider "virtualbox" do |vb|

  # Set more RAM
  vb.customize ["modifyvm", :id, "--memory", "2048"]

  # More CPU Cores
  vb.customize ["modifyvm", :id, "--cpus", "2"]

end # End config.vm.provider virtualbox
end # End config.vm.define ubuntu
end

Например, когда я запускаю приложение rails, используя порт 3000, с гостевой машины я получаю доступ к http://localhost:3000.

Но я пытаюсь получить доступ к приложению через браузер хоста.

Ни одно из нижеприведенных не сработало:

http://10.20.30.100:8080

https://10.20.30.100:8080

http://10.20.30.100:3000

https://10.20.30.100:3000

Браузер на хосте показывает: ERR_CONNECTION_REFUSED


person Askar    schedule 09.06.2015    source источник
comment
Вы пробовали этот serverfault.com? / questions / 516110 /   -  person Pardeep Dhingra    schedule 09.06.2015
comment
Спасибо, но у меня это не сработало.   -  person Askar    schedule 09.06.2015


Ответы (1)


По соображениям безопасности Rails 4.2 ограничивает удаленный доступ в режиме разработки. Это делается путем привязки сервера к «localhost», а не к «0.0.0.0» ....

Чтобы получить доступ к Rails, работающему на виртуальной машине (например, созданной Vagrant), вам необходимо изменить привязку IP Rails по умолчанию обратно на «0.0.0.0».

См. Ответы на следующем Вопрос о StackOverflow, предлагается несколько различных подходов.

Идея состоит в том, чтобы запустить Rails с помощью следующей команды:

rails s -b 0.0.0.0

Или жестко закодировав привязку к приложению Rails (что мне показалось менее желательным):

# add this to config/boot.rb
require 'rails/commands/server'
module Rails
  class Server
    def default_options
      super.merge(Host:  '0.0.0.0')
    end
  end
end

Лично я, вероятно, согласился бы с предложением использовать foreman и Procfile:

# Procfile in Rails application root
web:     bundle exec rails s -b 0.0.0.0

Я считаю, что это позволит упростить синхронизацию развертывания.

person Myst    schedule 09.06.2015