2013-10-04 4 views
5

Ich versuche eine Möglichkeit zu finden, meinen Produktions-Rails-Server an Port 80 zu binden, ohne den gesamten Server mit Root-Rechten ausführen zu müssen. Meine Frage ist im Grunde die gleiche wie "Is there a way for non-root processes to bind to "privileged" ports (<1024) on Linux?", außer dass ich dies mit Rails machen muss. Gegenwärtig verlangen die ersten beiden Antworten in der Frage, auf die ich verwiesen habe, dass ich dem Ruby-Interpreter die Berechtigung CAP_NET_BIND_SERVICE (wahrscheinlich keine gute Idee) gewähre oder Root-Privilegien nach dem Start des Servers verlasse (welche I'm not sure is possible with Ruby). Irgendwelche Ideen?Binden eines Rails-Servers an Port 80 unter Linux, ohne ihn als root auszuführen

+1

Haben Sie die Möglichkeit, einen herkömmlichen Webserver auf Port 80 auszuführen und die Anforderungen an einen Rails-Server weiterzuleiten, der auf einem anderen Port ausgeführt wird? Zum Beispiel: [nginx] (http://wiki.nginx.org/Main) ausführen und Anfragen an [thin] (http://code.macournoyer.com/thin/) oder [Einhorn] (http: // unicorn.bogomips.org/) läuft auf einem nicht-privilegierten Port. –

+0

Die Chancen, die Sie tatsächlich wollen, sind extrem niedrig. Thin, Mongrel, Puma, Unicorn oder was auch immer hinter einem Nicht-Ruby-Server in normalen Nutzungsmustern stehen sollte. Siehe [diese Frage] (http://stackoverflow.com/questions/15469598/why-thin-behind-nginx). – colinm

+0

Ja, das ist das erste Mal, dass ich tatsächlich versucht habe, eine Produktionsanwendung selbst ohne die Hilfe von jemand anderem zu implementieren, um den Server für mich einzurichten, oder ein PaaS wie Heroku; also besteht eine gute chance, dass ich nicht weiß, dass ich will. Wenn Sie eine ausführliche Antwort posten möchten, die eine Alternative zum Binden von Thin an Port 80 vorschlägt (wie nginx, wie Jim in seinem Kommentar sagte), würde ich das als gültige Antwort akzeptieren. – Ajedi32

Antwort

4

Also im Grunde ist die Antwort, die Sie nicht tun. Es ist möglich, dass es einige wirklich hacky Wege gibt, dies zu tun, aber die Chancen, dass Sie das wirklich tun wollen, sind äußerst gering. Führen Sie stattdessen Rails an einem nicht privilegierten Port aus, und richten Sie einen echten Webserver wie nginx ein, um ihn an Rails weiterzuleiten.

Als super-einfachen Beispiel mit nginx können Sie eine Konfigurationsdatei verwenden, die etwa wie folgt aussieht:

upstream rails_server { 
    server localhost:3000; 
} 

server { 
    listen 80; 

    location/{ 
    root /home/deploy_user/rails_app/public; 
    try_files $uri @missing; 
    } 

    location @missing { 
    proxy_pass http://rails_server; 
    proxy_set_header Host $http_host; 
    proxy_redirect off; 
    } 
} 

Diese Lösung ist auch eine bessere langfristige, denn es macht Ihre Infrastruktur flexibler. Wenn Sie beispielsweise Ihre Anwendung auf mehrere Computer aufrüsten möchten, können Sie nginx als Load-Balancer verwenden und Anforderungen an eine ganze Reihe von Rails-Servern weiterleiten, die auf verschiedenen Computern ausgeführt werden.

Verwandte Themen