Konfiguracja aplikacji webowej Golang production

Dla tych z was biegających wróć do produkcji:

Jaki jest Twój stos / konfiguracja dla uruchomienia aplikacji webowej Go?

Nie widziałem wiele w tym temacie poza ludźmi używającymi standardowej biblioteki net / http do utrzymywania serwera działającego. Czytam używając Nginx do przekazywania żądań do serwera Go - nginx z Go

To wydaje mi się trochę kruche. Na przykład serwer nie uruchomi się automatycznie, jeśli komputer zostanie ponownie uruchomiony (bez Dodatkowe skrypty konfiguracyjne).

Czy istnieje solidniejsza konfiguracja produkcyjna?

Na bok o moim zamiarze-planuję out Go powered REST backend server dla mojego następnego projektu i chcę się upewnić, że Go będzie realne dla uruchomienia projektu na żywo, zanim zainwestuję zbyt dużo w niego.

Author: Chaseph, 2013-07-03

4 answers

Programy Go mogą nasłuchiwać na porcie 80 i obsługiwać żądania HTTP bezpośrednio. Zamiast tego możesz użyć odwrotnego serwera proxy przed programem Go, aby nasłuchiwał na porcie 80 i łączył się z programem na porcie, powiedzmy, 4000. Istnieje wiele powodów, dla których warto to zrobić: brak konieczności uruchamiania programu Go jako root, Obsługa innych stron internetowych/usług na tym samym hoście, zakończenie SSL, równoważenie obciążenia, logowanie itp.

Używam HAProxy z przodu. Każde odwrotne proxy może działać. Nginx jest również świetną opcją (znacznie bardziej popularną niż HAProxy i zdolną zrobić więcej).

HAProxy jest bardzo łatwy w konfiguracji, jeśli czytasz jego dokumentację (wersja HTML ). Cały mój plik haproxy.cfg dla jednego z moich projektów Go znajduje się poniżej, na wypadek, gdybyś potrzebował startowego Ponta.

global
        log     127.0.0.1       local0
        maxconn 10000
        user    haproxy
        group   haproxy
        daemon

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        retries 3
        timeout connect 5000
        timeout client  50000
        timeout server  50000

frontend http
        bind :80
        acl  is_stats  hdr(host)       -i      hastats.myapp.com
        use_backend    stats   if      is_stats
        default_backend        myapp
        capture        request header Host     len     20
        capture        request header Referer  len     50

backend myapp
        server  main    127.0.0.1:4000

backend stats
       mode     http
       stats    enable
       stats    scope   http
       stats    scope   myapp
       stats    realm   Haproxy\ Statistics
       stats    uri     /
       stats    auth    username:password
Nginx jest jeszcze łatwiejszy. Jeśli chodzi o kontrolę usług, uruchamiam mój program Go jako usługę systemową. Myślę, że każdy tak robi. Mój serwer działa na Ubuntu, więc używa Upstartu. Umieściłem to na /etc/init/myapp.conf aby Upstart kontrolował mój program:
start on runlevel [2345]
stop on runlevel [!2345]

chdir /home/myapp/myapp
setgid myapp
setuid myapp
exec ./myapp start 1>>_logs/stdout.log 2>>_logs/stderr.log

Innym aspektem jest wdrożenie. Jedną z opcji jest wdrożenie poprzez wysłanie pliku binarnego programu i niezbędnych zasobów. Jest to całkiem świetne rozwiązanie IMO. Używam innej opcji: kompilowanie 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 do mojego projektu ze zdalnego repozytorium Git, buduje go za pomocą Go kopiuje pliki binarne i inne zasoby do ~/myapp/ i uruchamia ponownie usługę.

Ogólnie rzecz biorąc, cała sprawa nie różni się zbytnio od żadnej innej konfiguracji serwera: musisz mieć sposób na uruchamianie kodu i obsługiwanie żądań HTTP. W praktyce Go okazał się bardzo stabilny dla tych rzeczy.

 128
Author: Mostafa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-03 09:33:41

Nginx dla:

  • Reverse HTTP proxy to my go application
  • statyczna obsługa plików
  • zakończenie SSL
  • nagłówki HTTP (Cache-Control, et. al)
  • dzienniki dostępu (a tym samym wykorzystanie rotacji logów systemowych)
  • przepisuje (nagie do www, http: / / do https://, itp.)

Nginx sprawia, że jest to bardzo proste i chociaż możesz obsługiwać bezpośrednio z Go dzięki net/http, Jest wiele "wymyślania koła" i rzeczy takich jak globalne nagłówki HTTP / align = "left" /

Supervisord do zarządzania moim go binary. Upstart Ubuntu (jak wspomniał Mostafa) też jest dobry, ale podoba mi się, ponieważ jest stosunkowo rozproszony i jest dobrze udokumentowany.

Superwizor, dla mnie:

  • uruchamia mój go binary w razie potrzeby
  • podnosi po wypadku
  • przechowuje moje zmienne środowiskowe (klucze auth sesji, itp.) jako część jednej konfiguracji.
  • uruchamia moje DB (aby upewnić się mój go binary nie działa bez niego)
 55
Author: elithrar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-04 03:38:55

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

  1. to polecenie musi zostać eskalowane. sudo w razie potrzeby
  2. każda nowa wersja programu spowoduje powstanie nowego pliku binarnego, który będzie musiał zostać ponownie autoryzowany przez setcap

setcap dokumentacja

cap_net_bind_service dokumentacja

 4
Author: Emperor_Earth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-13 18:17:03

Dla tych, którzy chcą prostą aplikację go działa jako demon, użyj systemd (obsługiwane przez wiele dystrybucji Linuksa) zamiast Upstart.

Utwórz plik serwisowy w

touch /etc/systemd/system/my-go-daemon.service

Enter

[Unit]
Description=My Go App

[Service]
Type=simple
WorkingDirectory=/my/go/app/directory
ExecStart=/usr/lib/go run main.go 

[Install]
WantedBy=multi-user.target

Następnie włącz i uruchom usługę

systemctl enable my-go-daemon
systemctl start my-go-daemon
systemctl status my-go-daemon

Systemd ma oddzielny system dziennikarski, który pozwoli Ci śledzić dzienniki dla łatwego rozwiązywania problemów.

 3
Author: mixdev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-26 23:20:05