2013-07-16 2 views
13

ich folgende Fehlermeldung erhalten bei dem Versuch, „cap production unicorn:startkann nicht auf Port 80 binden, aber ohne Probleme auf die aktuelle Shell Arbeiten laufen

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) 

Ausführen des folgenden Befehls manuell funktioniert ohne Probleme, laufen . Was könnte das Problem hier sein?

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

Antwort

8

Sie benötigen Root-Zugriff zu niedrigeren Ports zu binden, wie Port 80. Der Befehl rvmsudo wird im Root-Kontext ausgeführt und funktioniert daher.

Cap Task wird in einem normalen Benutzerkontext ausgeführt (wahrscheinlich deploy) abhängig von Ihrer Konfiguration. Sie sollten sudo function hinzufügen, um cap deploy user bereitzustellen, und sicherstellen, dass Ihre cap-Task sudo zum Starten von unicorn verwendet.

7

Antwort von @Iuri G. gibt Ihnen Grund und mögliche Lösung.

Ich habe einen anderen Vorschlag, außer Sie haben sehr zwingenden Grund Unicorn mit Port 80 zu betreiben, ändern Sie das zu einem höheren Port (> 1024), wie 3000. Dies wird Ihr Problem lösen.

Wenn es sich um eine Anwendung handelt, die öffentlich zugänglich ist, ist es zu einfach, Unicorn zu überwältigen und Ihre Anwendung für Endbenutzer nicht verfügbar zu machen. In einem solchen Fall setzen Sie Unicorn hinter einen Proxy (wie Nginx). Der Proxy wird auf Port 80 und Unicorn auf einem höheren Port sein.

1

Ich nehme an, dass Sie Ubuntu als Produktionsserver ausführen. Auf dem Server müssen Sie Ihre sudoers Datei bearbeiten:

erster Typ select-editor und wählen Sie nano (oder einen anderen Editor Sie mit komfortabel fühlen)

Dann am Ende der Datei, bevor der include Linie, fügen Sie diese Zeile :

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

Sie müssen deployer von dem Benutzernamen mit Capistrano ersetzen, die Sie verwenden, und /path/to/your/unicorn_rails mit seinem richtigen Pfad zu ersetzen. Auf diese Weise kann der Benutzer des Deplosers "sudo unicorn_rails" ausführen, ohne dass ein Kennwort eingegeben werden muss.

Schließlich Ihre unicorn:start Capistrano Aufgabe bearbeiten und rvmsudo vor Ihrer Befehlszeile, das Einhorn starten hinzufügen:

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

@Bejamin sowohl die Befehle für mich perfekt – krs

4

In meiner Entwicklung

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

Wenn es nicht Sie diese stattdessen versuchen funktioniert Umgebung, mit RubyMine, stieß ich kürzlich darauf.

I verwendet SSH-Port zu umleiten 80 bis 8080.

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

Arbeitete nicht funktioniert! Denken Sie nur daran, dass der Tunnel noch leben wird, bis Sie ihn töten/den Computer neu starten. – fgblomqvist

Verwandte Themen