Не удается привязать к порту 80, но запуск в текущей оболочке работает без каких-либо проблем

Я получаю следующую ошибку при попытке запустить " cap production unicorn:start ",

F, [2013-07-12T04:36:18.134045 #28998] FATAL -- : error adding listener addr=0.0.0.0:80
/home/ec2-user/apps/foo_prod/shared/bundle/ruby/2.0.0/gems/unicorn-4.6.3/lib/unicorn/socket_helper.rb:147:in 'initialize': Permission denied - bind(2) (Errno::EACCES)

Выполняя следующую команду вручную, работает без каких-либо проблем. Что может быть проблемой здесь?

rvmsudo unicorn_rails -c config/unicorn/production.rb -D --env production

Ответ 1

Вам нужен root-доступ для привязки к более низким портам, таким как порт 80. Команда rvmsudo выполняется в корневом контексте, и поэтому она работает.

Задача Cap выполняется в обычном пользовательском контексте (возможно, развертывается) в зависимости от вашей конфигурации. Вы должны добавить способность sudo ограничить развертывание пользователя и убедиться, что ваша задача cap использует sudo для запуска unicorn.

Ответ 2

Ответ @Iuri G. дает вам разум и возможное решение.

У меня есть другое предложение, если у вас нет чрезвычайно веских оснований для запуска Unicorn с портом 80, измените его на более высокий порт (> 1024), например 3000. Это решит вашу проблему.

Если это приложение, которое открыто для публики, слишком просто подавить Unicorn и сделать ваше приложение недоступным для конечных пользователей. В таком случае поставите Единорог за прокси (например, Nginx). Прокси-сервер будет находиться на порту 80 и Unicorn на более высоком порту.

Ответ 3

В моей среде разработки, используя RubyMine, я столкнулся с этим в последнее время.

Я использовал SSH для перенаправления портов 80 на 8080.

sudo ssh -t -L 80:127.0.0.1:8080 [email protected]

Ответ 4

Я предполагаю, что вы используете Ubuntu в качестве производственного сервера. На вашем сервере вам нужно отредактировать файл sudoers:

Первый тип select-editor и выберите nano (или другой редактор, с которым вы чувствуете себя комфортно)

Затем в нижней части файла перед линией include добавьте следующую строку:

%deployer ALL=(ALL)NOPASSWD:/path/to/your/unicorn_rails

Вам нужно заменить deployer именем пользователя, которое вы используете с capistrano, и заменить /path/to/your/unicorn_rails своим правильным путем. Это позволит вашему пользователю развертывателя "sudo unicorn_rails" без запроса пароля.

Наконец, отредактируйте своего unicorn:start задачу capistrano и добавьте rvmsudo перед вашей командной строкой, которая начнет единорог:

rvmsudo unicorn_rails -c config/unicorn/production.rb -D --env production

Если он не работает, вы можете попробовать это вместо этого

bundle exec sudo unicorn_rails -c config/unicorn/production.rb -D --env production