Go 프로그램은 포트 80에서 수신 대기하고 HTTP 요청을 직접 처리 할 수 있습니다. 대신 Go 프로그램 앞에 역방향 프록시를 사용하여 포트 80에서 수신하고 4000과 같은 포트에서 프로그램에 연결할 수 있습니다. 후자를 수행하는 데는 여러 가지 이유가 있습니다. Go 프로그램을 루트로, 동일한 호스트에서 다른 웹 사이트 / 서비스 제공, SSL 종료, 부하 분산, 로깅 등
나는 앞에서 HAProxy 를 사용 합니다. 모든 역방향 프록시가 작동 할 수 있습니다. Nginx는 또한 훌륭한 옵션입니다 (HAProxy보다 훨씬 인기 있고 더 많은 작업을 수행 할 수 있음).
HAProxy는 문서 ( HTML 버전 ) 를 읽으면 구성하기가 매우 쉽습니다 . haproxy.cfg
시작 지점이 필요한 경우 내 Go 프로젝트 중 하나에 대한 전체 파일이 다음과 같습니다.
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는 훨씬 더 쉽습니다.
서비스 제어와 관련하여 Go 프로그램을 시스템 서비스로 실행합니다. 모두가 그렇게한다고 생각합니다. 내 서버는 Ubuntu를 실행하므로 Upstart를 사용합니다. /etc/init/myapp.conf
Upstart가 내 프로그램을 제어하기 위해 이것을 넣었습니다 .
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
또 다른 측면은 배포입니다. 한 가지 옵션은 프로그램의 바이너리 파일과 필요한 자산을 전송하여 배포하는 것입니다. 이것은 꽤 훌륭한 솔루션 IMO입니다. 다른 옵션 인 서버에서 컴파일을 사용합니다. (소위 "지속적인 통합 / 배포"시스템을 설정할 때 바이너리 파일을 사용한 배포로 전환하겠습니다.)
원격 Git 저장소에서 내 프로젝트의 코드를 가져 와서 Go로 빌드하고 바이너리 및 기타 자산을에 복사 ~/myapp/
하고 서비스를 다시 시작 하는 작은 셸 스크립트가 서버 에 있습니다.
전반적으로 모든 것이 다른 서버 설정과 크게 다르지 않습니다. 코드를 실행하고 HTTP 요청을 처리 할 방법이 있어야합니다. 실제로 Go는 이러한 작업에 대해 매우 안정적인 것으로 입증되었습니다.