2013-10-04 13 views
5

Próbuję znaleźć sposób na powiązanie mojego serwera Rails produkcyjnego z portem 80 bez konieczności uruchamiania całego serwera z uprawnieniami roota. Moje pytanie jest w zasadzie takie samo jak "Is there a way for non-root processes to bind to "privileged" ports (<1024) on Linux?", z tym że muszę to zrobić z Railsami. Obecnie dwie pierwsze odpowiedzi na pytanie, do którego się odwołałem, wymagają ode mnie zgody na tłumaczenie CAP_NET_BIND_SERVICE dla interpretera Ruby (prawdopodobnie nie jest to dobry pomysł) lub przywrócenia uprawnień roota po uruchomieniu serwera (który I'm not sure is possible with Ruby). Jakieś pomysły?Powiązanie serwera Rails z portem 80 w systemie Linux bez uruchamiania go jako root

+1

Czy masz możliwość uruchomienia tradycyjnego serwera WWW na porcie 80 i przesłania żądań do serwera Railsowego działającego na innym porcie? Na przykład, uruchamianie [nginx] (http://wiki.nginx.org/Main) i kierowanie żądań do [thin] (http://code.macournoyer.com/thin/) lub [unicorn] (http: // unicorn.bogomips.org/) działa na porcie nieuprzywilejowanym. –

+0

Szanse na to, że rzeczywiście chcesz to zrobić, są bardzo niskie. Thin, Mongrel, Puma, Unicorn lub cokolwiek innego powinny znajdować się za serwerem nie-Ruby w normalnych wzorcach użytkowania. Zobacz [to pytanie] (http://stackoverflow.com/questions/15469598/why-thin-behind-nginx). – colinm

+0

Tak, po raz pierwszy naprawdę próbowałem wdrożyć aplikację produkcyjną bez pomocy kogoś, kto skonfigurował dla mnie serwer lub PaaS jak Heroku; więc jest duża szansa, że ​​nie wiem, czego chcę. Jeśli chcesz umieścić szczegółową odpowiedź sugerującą alternatywę dla wiązania cienkiego na porcie 80 (jak nginx, jak Jim powiedział w swoim komentarzu), zaakceptowałbym to jako poprawną odpowiedź. – Ajedi32

Odpowiedz

4

W zasadzie odpowiedź brzmi: nie. Możliwe, że jest jakiś naprawdę odrażający sposób, aby to zadziałało, ale szanse, że tak naprawdę chcesz to zrobić są wyjątkowo niskie. Zamiast tego uruchom Railsy na nieuprawnionym porcie i skonfiguruj prawdziwy serwer WWW, taki jak nginx, aby przekazywać do Rails.

Jako przykład super proste, z nginx można użyć pliku konfiguracyjnego, który wygląda mniej więcej tak:

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; 
    } 
} 

To rozwiązanie jest również lepsze długoterminowe, ponieważ sprawia, że ​​infrastruktura bardziej elastyczne. Na przykład, jeśli chcesz skalować swoją aplikację na wiele komputerów, możesz użyć nginx jako load-balancer i przekazać żądania do całej gamy serwerów Railsowych uruchomionych na różnych komputerach.

Powiązane problemy