Dla tych z Was, którzy korzystają z backendów Go w środowisku produkcyjnym:
Jaki jest Twój stos / konfiguracja do uruchamiania aplikacji internetowej Go?
Nie widziałem zbyt wiele na ten temat poza ludźmi używającymi standardowego pakietu biblioteki net / http do podtrzymywania działania serwera. Czytałem używając Nginx do przekazywania żądań do serwera Go - nginx z Go
Wydaje mi się to trochę kruche. Na przykład serwer nie uruchomiłby się automatycznie po ponownym uruchomieniu komputera (bez dodatkowych skryptów konfiguracyjnych).
Czy istnieje solidniejsza konfiguracja produkcyjna?
Pomijając moje zamiary - planuję serwer zaplecza REST oparty na Go dla mojego następnego projektu i chcę się upewnić, że Go będzie opłacalne do uruchomienia projektu na żywo, zanim zainwestuję w niego zbyt dużo.
źródło
Odpowiedzi:
Programy Go mogą nasłuchiwać na porcie 80 i bezpośrednio obsługiwać żądania HTTP. Zamiast tego możesz chcieć użyć odwrotnego proxy przed swoim programem Go, aby nasłuchiwał na porcie 80 i łączył się z twoim programem na porcie, powiedzmy, 4000. Jest wiele powodów, dla których warto to zrobić: nie trzeba uruchamiać Twój program Go jako root, obsługujący inne witryny / usługi na tym samym hoście, zakończenie SSL, równoważenie obciążenia, logowanie itp.
Używam HAProxy z przodu. Każdy zwrotny serwer proxy może działać. Nginx to również świetna opcja (znacznie bardziej popularna niż HAProxy i zdolna do więcej).
HAProxy jest bardzo łatwy w konfiguracji, jeśli przeczytasz jego dokumentację ( wersja HTML ). Mój cały
haproxy.cfg
plik dla jednego z moich projektów Go, na wypadek gdybyś potrzebował ponta początkowego.Nginx jest jeszcze łatwiejszy.
Jeśli chodzi o kontrolę usług, program Go uruchamiam jako usługę systemową. Myślę, że każdy to robi. Na moim serwerze działa Ubuntu, więc używa Upstart. Umieściłem to na
/etc/init/myapp.conf
Upstart, aby kontrolować mój program:Kolejnym aspektem jest wdrożenie. Jedną z opcji jest wdrożenie poprzez wysłanie pliku binarnego programu i niezbędnych zasobów. To całkiem świetne rozwiązanie IMO. Ja korzystam z drugiej opcji: kompilacja na serwerze. (Przełączę się na wdrażanie z plikami binarnymi, gdy skonfiguruję tak zwany system „ciągłej integracji / wdrażania”).
Mam mały skrypt powłoki na serwerze, który pobiera kod dla mojego projektu ze zdalnego repozytorium Git, buduje go za pomocą Go, kopiuje pliki binarne i inne zasoby do
~/myapp/
oraz ponownie uruchamia usługę.Ogólnie rzecz biorąc, całość nie różni się zbytnio od jakiejkolwiek innej konfiguracji serwera: musisz mieć sposób na uruchomienie kodu i obsługę żądań HTTP. W praktyce Go okazał się bardzo stabilny w tym zakresie.
źródło
nginx dla:
nginx sprawia, że jest to bardzo łatwe i chociaż dzięki temu możesz obsługiwać bezpośrednio z Go
net/http
, jest dużo „ponownego wymyślania koła” i rzeczy takie jak globalne nagłówki HTTP wymagają pewnych schematów, których prawdopodobnie możesz uniknąć.kierownik do zarządzania moim plikiem binarnym Go. Ubuntu Upstart (o czym wspomniał Mostafa) jest również dobry, ale lubię supervisor, ponieważ jest stosunkowo niezależny od dystrybucji i jest dobrze udokumentowany.
Nadzorca, dla mnie:
źródło
Dla tych, którzy chcą, aby prosta aplikacja go działała jako demon, użyj systemd (obsługiwanego przez wiele dystrybucji Linuksa) zamiast Upstart.
Utwórz plik usługi pod adresem
Wchodzić
Następnie włącz i uruchom usługę
systemd ma oddzielny system kronikowania, który umożliwia śledzenie dzienników w celu łatwego rozwiązywania problemów.
źródło
Możesz powiązać swój plik binarny z gniazdem do uprzywilejowanych portów domeny internetowej (numery portów mniejsze niż 1024) za pomocą
setcap
setcap 'cap_net_bind_service=+ep' /path/to/binary
sudo
jako niezbędnesetcap
setcap
dokumentacjacap_net_bind_service
dokumentacjaźródło