2015-06-30 11 views
10

Mam problemy z miksem i MIX_ENV=prod z mix phoenix.server, w którym nie można uruchomić. Uruchamianie wszystkich najnowszych (Elixir 1.0.5, Phoenix 0.14.0) oprócz Erlanga (17.x, 17.3, myślę) na Ubuntu Linode'a 14.04.MIX_ENV = prod na serwerze Phoenix ulega awarii po uruchomieniu z portem = 80

$ MIX_ENV=prod PORT=80 mix phoenix.server 
{"Kernel pid terminated",application_controller,"{application_start_failure,elirc_site,{{shutdown,{failed_to_start_child,'Elixir.ElircSite.Endpoint',{shutdown,{failed_to_start_child,'Elixir.Phoenix.Endpoint.Server',{shutdown,{failed_to_start_child,{ranch_listener_sup,'Elixir.ElircSite.Endpoint.HTTP'},{shutdown,{failed_to_start_child,ranch_acceptors_sup,{{badmatch,{error,eacces}},[{ranch_acceptors_sup,init,1,[{file,\"src/ranch_acceptors_sup.erl\"},{line,30}]},{supervisor,init,1,[{file,\"supervisor.erl\"},{line,243}]},{gen_server,init_it,6,[{file,\"gen_server.erl\"},{line,306}]},{proc_lib,init_p_do_apply,3,[{file,\"proc_lib.erl\"},{line,239}]}]}}}}}}}}},{'Elixir.ElircSite',start,[normal,[]]}}}"} 

W szczególności uważam, że jest to część śladu.

{{badmatch,{error,eacces}},[{ranch_acceptors_sup,init,1,[{file,\"src/ranch_acceptors_sup.erl\"},{line,30}]} 

Odpowiedz

5

Wygląda na to, że serwer próbuje połączyć się z ograniczonym portem (mniej niż 1024) bez uprawnień roota. Spróbuj użyć wyższego portu, takiego jak domyślny 4000 dla Phoenix. Jeśli musi być na porcie 80, uruchom go jako root lub (lepiej) proxy za pomocą nginx.

+4

Zazwyczaj nie ma potrzeby uruchamiania Phoenix za nginxem. :) –

+0

Dobrze. Jest to tylko lepsze, jeśli nie chcesz uruchamiać kodu poziomu aplikacji jako root, ale absolutnie potrzebujesz portu 80/443 (co, jak sądziłem, mogło mieć miejsce w tym przypadku). –

+4

Można również zrobić NAT do portu przy użyciu iptables (lub zapory preferencji). Np iptables -t nat -A WYJŚCIE -d myhostname -p tcp --dport 80 -j PRZEKIEROWANIE --to porty 8080 && iptables -t nat -A PREROUTING -d myhostname -p TCP --dport 80 -j REDIRECT - do-portów 8080 – diogovk

4

Jak zauważył Nick Meharry, próbujesz uruchomić proces serwera Phoenix na porcie tradycyjnie używanym w systemie Unix, z którym może kojarzyć się tylko root (niskie porty (< 1024)).

Uruchomienie procesu jako root nie jest zalecane ze względów bezpieczeństwa - osoba atakująca, która przejmie ten proces, może uzyskać uprawnienia administratora do całego systemu operacyjnego.

Bezpieczniej jest obejść ten problem, uruchamiając serwer na wysokim porcie (na przykład 4000) i używając prostej reguły iptables przekazać połączenia z portu 80 do portu 4000. Należy pamiętać, że każdy użytkownik tego komputera może powiąż z portem 4000 - dzięki temu utracisz dodatkową ochronę przed niskimi portami.

Innym rozwiązaniem jest, aby niektóre programy (mix, elixir) do wiązania się z portów poniżej 1024 pomocą CAP_NET_BIND_SERVICE Linux rdzeni własność (dostępny od 2.6.24), które mogą być ustawione setcap. Ale nadal każdy użytkownik może korzystać z tych plików wykonywalnych, chyba że są one dostępne tylko dla określonego użytkownika, używając odpowiednich praw dostępu do plików.

4

widzę następujące opcje:

  1. Użyj Apache/nginx z przodu jako serwer proxy dla Phoenix działa na wyższym portu za nim Stwórca eliksiru, powiedział, że zwykle nie ma potrzeby, aby to zrobić w ten wątek. Jeśli potrzebujesz już nginxa do czegoś innego (np. Do uruchamiania WP lub wyświetlania statycznych obrazów), to po prostu zrób to.
  2. Uruchom jako root prosty, ale bardzo zły pomysł z perspektywy bezpieczeństwa.
  3. Tabele adresów IP - proste i skuteczne, ale łamie się ipv6
  4. Użyj polecenia setcap, aby nadać określonym plikom binarnym uprawnienia do otwierania niższych portów.

Lubię opcję 4.

w celu uruchomienia mix phoenix.server i podobne polecenia, trzeba uruchomić setcap na BEAM binarny. Możesz go znaleźć, krótko uruchamiając serwer jako root i wykonując ps -ef | grep beam. W moim systemie, to /usr/lib/erlang/erts-8.1/bin/beam.smp, więc wpadłem:

sudo setcap CAP_NET_BIND_SERVICE=+eip /usr/lib/erlang/erts-8.1/bin/beam.smp

Teraz serwer może być uruchomiony na zwykłym portem z poleceniami wymieszać. Następnie, prawdopodobnie będziesz chciał wdrożyć rzeczywiste wydanie eliksiru i uruchomić go jako usługę. Ta sama strategia działa. Użyj setcap w binarnie utworzonej wersji.Dla mojej aplikacji było:

sudo setcap CAP_NET_BIND_SERVICE=+eip /home/ubuntu/myapp/_build/prod/rel/myapp/erts-8.1/bin/run_erl

Teraz dorobkiewicz lub Systemd skrypt można uruchomić serwer, too.

+1

Dla mnie musiałem użyć 'setcap' na/beam not /beam.smp. Pomaga to w testowaniu, jeśli zadziałało: uruchom 'iex', następnie': gen_tcp.listen (80, []) '. Powinien spowodować coś takiego: '{: ok, # Port <0.1426>}' – Vantalk

Powiązane problemy