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.
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.
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)
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
- to polecenie musi zostać eskalowane.
sudo
w razie potrzeby - każda nowa wersja programu spowoduje powstanie nowego pliku binarnego, który będzie musiał zostać ponownie autoryzowany przez
setcap
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.
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