2015-02-25 4 views
6

У меня недавно возникли проблемы с моими AWS EC2 экземплярами. Проблема в том, что я не могу ударить по серверам Rails через общедоступный IP-адрес, но я могу ударить по localhost, и сервер ответит.Не удается подключиться к серверу Rails, работающему на EC2, из общедоступного IP

Вот что я делаю:

  • Создать новый экземпляр EC2 (t2.micro, убунт свободного уровня)
  • группы безопасности имеет порт 22, 80, 3000 открыто для всех (0.0.0.0)
  • SSH к экземпляру EC2, установить рельсы (я использую this для установки)
  • Start рельсов сервера после установки, он работает на порту 3000
  • запустить «Wget локального хоста: 3000» и возвращает index.html , ура!
  • перейдите в мой веб-браузер, введите EC2-экземпляр общедоступного IP и порт 3000 (IP: 3000), говорит, что он не может подключиться :(
  • kill rails server, перезапустить его на порт 80, wget работает, т подключить через публичные IP
  • как проверить вменяемость, установить Nginx и запустить его, и можно увидеть стартовую страницу Nginx на порт 80 через публичные IP ... так запутано ...

так Я думаю, что это имеет какое-то отношение к тому, как я устанавливаю Rails, но я пробовал другие методы, кроме использования этого сценария установки, но сталкиваюсь с той же проблемой ... Я даже попытался создать enti полагайтесь на новую учетную запись AWS на всякий случай, если я испортил настройки в моей первоначальной учетной записи, но не повезло. Я ранее был в состоянии получить рельсы, работающие на экземплярах EC2, просто отлично (на самом деле у меня есть экземпляры EC2, которые используют ту же группу безопасности, что и сейчас, на моей учетной записи AWS и могут просто поразить эти публичные IP-адреса), но теперь я просто ударяю головой против стены ... любая помощь будет принята с благодарностью!

EDIT: На данный момент я настроил nginx на мой сервер rails ... по крайней мере, это работает на данный момент ... хотя мне все еще интересно, почему я не могу попасть прямо на сервер rails напрямую.

+0

Вы, вероятно, также необходимо открыть брандмауэр Ubuntu, чтобы позволить порт 80 и/или 3000. http://serverfault.com/ Вопросы/574491/open-port-80-on-ubuntu-aws – infused

+0

Я запустил 'uufw status', и он говорит, что он неактивен. Выходной сигнал 'iptables -L' выглядит следующим образом: ' root @ ip-172-31-3-171:/home/ubuntu/blah # iptables -L Цепочка INPUT (политика ACCEPT) целевая цель opt opt ​​источника ACCEPT tcp - где угодно, tcp dpt: http: – spacemonkeys

ответ

11

Проверьте, прослушиваются ли рельсы на 0.0.0.0 или 127.0.0.1, по умолчанию используется только для прослушивания только на localhost.

-b, --binding=IP     Binds Rails to the specified IP. 
           Default: localhost 

Ruby on Rails 4.2 Release Notes Из:

В связи с изменением в стойку, рельсы сервер в настоящее время прослушивает локальный вместо 0.0.0.0 по умолчанию. Это должно иметь минимальное влияние на стандартный рабочий процесс разработки, поскольку как http://127.0.0.1:3000, так и http://localhost:3000 будут по-прежнему работать по-прежнему на вашей собственной машине.

+3

Запуск 'bundle exec rails server -b 0.0.0.0' фактически решил мою проблему! Теперь я могу поразить свой сервер просто отлично, не используя nginx ... Было ли изменение привязки по умолчанию в недавнем выпуске Rail? Неделю назад у меня не было этой проблемы ... – spacemonkeys

+0

Это изменилось некоторое время назад? Я не помню, что мне пришлось установить этот вариант раньше. –

1

Если вы используете «рельсы сервер» и хотите использовать по умолчанию порт 3000, то используйте ниже:

sudo rails server -b 0.0.0.0 

можно обращаться как http://[public_ip]:3000.

Если вы хотите использовать его в качестве URL без порта используйте ниже для запуска сервера:

sudo rails server -p 80 -b 0.0.0.0 

Вы просто получить доступ к нему, как http://[public_ip].

0

Я запускал сервер рельсов по умолчанию по умолчанию 3000 на моем экземпляре AWS Ubuntu и разрешил этот порт в группе безопасности, входящий раздел, но все же мне не удалось получить доступ к моему приложению, используя это.
http://public_ip:3000

Я искал много, и это answer помогло мне. Объяснение ответа. Мы должны сделать брандмауэр гибким, чтобы наш брандмауэр разрешил порт 3000.

Вы можете использовать эту команду, чтобы проверить, разрешен ли этот порт на брандмауэре или нет.

$ sudo iptables -L | grep :3000 

Если вы ничего не видите, значит, мы должны позволить его с помощью этой команды.

$ sudo iptables -A INPUT -p tcp --dport 3000 -j ACCEPT 

Это работает для меня, чтобы мои рельсы приложение доступа на порт 3000.