안녕하세요, 프로그래밍 초보 바바바입니다.
Oracle Cloud에서 golang으로 웹서버 운영하는 방법 관련 질문드립니다.
예전에(지금도 가능한지 모르겠습니다만) Oracle Cloud, free tie(무료)로 사용 가능하다고 해서 가입해서 조금 세팅(기본 networ setting과 linux 우분투? 및 golang 설치) 해 둔 것이 있습니다.
위 우분투 환경에서 웹서버 구동하게 끔 golang으로 만든 실행파일을 실행시키면 웹서버가 구동되는 걸로 알고 있는데요,
보통 이렇게 하는건지 아니면 다른 방법이 더 있는건지 궁금합니다(어느 방법이 더 권장되는 건지도요).
웹에서 검색해 본 결과 아래와 같은 '다른' 방법 같이 보이는 것이 있더군요.
https://docs.oracle.com/en/cloud/paas/app-container-cloud/getting-started-go-accs/
꼭 oracle cloud 가 아니더라도(gcp, aws) 이러한 류의 서비스를 이용하여 golang 으로 웹서버를 구축할 때
보통 어떻게 하는 건지 궁금합니다.
위에서도 언급한 바와 같이, 제가 아는 건 golang으로 웹서버 프로그램을 만든 다음 그 실행파일을 shell 상에서 실행시키는 방법 뿐입니다(그 프로그램이 계속 실행됨).
언제가? 어디선가? daemon으로 만들어서 어쩌고 저쩌고 얘기를 들은 것 같기도 합니다만 확실치 않네요.
가르침 부탁드립니다.
감사합니다.
예제1 : /usr/bin/application ( 일회성 )
예제2 : /usr/bin/application & ( app이 대기상태로 돌지만 이를 백그라운드로 돌리면서 다른작업을 할 수 있게 하죠 )
위의 단점은 혹시라도 app 이 크래시 나거나 작동을 멈추면 다시 실행을 수동으로 해줘야 하는데요.
저는 보통 systemd 서비스로 app 을 만들어서 systemctl start application 처럼 실행을 합니다. 그러면 백그라운드로 돌면서 혹시 라도 app이 크래시 나더라도 systemd 가 알아서 자동으로 리스타트 하게 해줍니다. 물론 그에 대한 기본 셋팅은 해줘야 하지만요. 아마 이 방법이 가장 일반적인 방법일겁니다.
golang이면 alpine 리눅스나 스크래치 이미지 위에다가도 올릴수 있어서 도커 이미지로 만들어도 용량 증가도 크지 않습니다
어쨋든 best practice 기준으로 주요 부분만 설명드리겠습니다.
1. 단순 퍼포먼스는 (go 기준) 그대로 쓰는게 가장 빠르겠지만, 그럼에도 nginx 등의 웹서버를 앞에 붙이는게 권장됩니다.
https 지원, 정적파일 서빙, 로깅, 각종 설정파일과 플러그인들... 다 쓰지 않아도 let's encrypt(https) 와의 조합 때문에서라도 사용하는게 좋죠.
혹시 로드밸런서 등을 앞에 붙이신다면 없어도 됩니다.
2. 서버 실행 자체는 그냥 쉘로 들어가서 띄울수도, & 등으로 데몬화 시킬수도, tmux/screen 등으로 실행시킬 수도 있겠지만 상태 관리나 자동실행, 중앙화된 로깅 등의 이유로 마찬가지로 systemd 등을 이용해서 데몬화(daemonize) 하는게 권장됩니다.
윗분들이 docker 쓰라는게 일종의 이 작업을 하는건데,,, 상황에 따라 장단점이 있고 취향차이라 생각합니다.
다만 다른 기능 이용하지 않고 단순히 자동 시작 정도의 이유로 도커를 쓰는건 추천드리고 싶지 않네요....
3. nginx - go 의 연결
이것도 방법이 다양한데,,, 사실 go 같은 언어는 크게 상관없습니다. python 같은 언어는 퍼포먼스 문제로 중간에 gateway interface를 통해 프로세스 관리자를 하나 더 두기도 하거든요...
여튼,
nginx 가 직접 go 프로그램을 실행시키는 방법(cgi)과 go를 데몬 등으로 따로 실행해두고 리버스 프록시로 연결하는 방법(그냥 고 실행시키면 열리는 포트(ex 5000) 를 nginx 에서 80-> 5000 으로 연결)이 있습니다.
go 의 경우 coroutine 등의 특성 때문에, cgi 사용시 퍼포먼스가 저하되기도 하고, cgi 자체를 요즘엔 잘 안쓰는 것 같습니다.
데몬화 등을 통해 응답 대기의 경우엔 unix socket(파일로 생김)을 이용하는게 아주 조금 더 빠르긴 한데, 그 성능 향상 폭이 크지 않고 LB 를 이용한다거나 nginx 가 다른 서버라거나 라면 unix socket 을 사용하지 못하기 때문에 보통은 그냥 tcp 포트로 엽니다.