블로그로 돌아가기

Ubuntu 22.04에서 Nginx를 사용하여 Go 웹 애플리케이션 배포하기

Ubuntu 22.04에서 Nginx를 사용하여 Go 웹 애플리케이션 배포하기

Go은 오픈 소스 범용 프로그래밍 언어입니다. 이 언어는 Python의 생산성에서 영감을 받았으며, C의 성능을 제공합니다. 원래 Google이 코드베이스에서 겪고 있던 문제(코드 복잡성 및 긴 컴파일 시간)를 해결하기 위해 개발했습니다. 다른 현대 프로그래밍 언어와 마찬가지로 Go는 모든 종류의 목적에 적합합니다. 예를 들어 웹 개발, 명령줄 스크립팅, 네트워킹 서버 앱, 프론트엔드 개발 등에 활용될 수 있습니다.

이 가이드에서는 Ubuntu 22.04 LTS에 간단한 Go 웹 애플리케이션을 배포하는 단계를 안내합니다. 또한 트래픽 부하를 처리하기 위해 Nginx 역방향 프록시(reverse proxy)를 구현할 것입니다.

사전 요구 사항

이 가이드에 설명된 단계를 수행하려면 다음 구성 요소가 미리 구성되어 있어야 합니다.

도메인 이름으로 서비스에 액세스해야 하는 경우, 서버를 가리키는 FQDN이 있어야 합니다. 이 경우 SSL로 Nginx를 보호하는 것이 좋습니다. 자세한 내용은 Ubuntu에서 Let’s Encrypt로 Nginx를 보호하는 방법에 대한 튜토리얼.

1단계 – Go 웹 앱 만들기

도메인에 액세스할 때 화면에 “Hello World”를 출력하는 간단한 Go 웹 앱을 빌드할 것입니다. 또한, 이 앱은 <domain>/greet/<username>.

에 액세스할 때 사용자에게 인사말을 건넵니다. 먼저 $GOPATH 아래에 새 프로젝트를 생성합니다. 프로젝트 디렉터리를 생성합니다:

Go Web Application Make Dir

현재 디렉터리를 변경합니다:

Go Web Application Change Dir

그런 다음 프로젝트를 시작합니다:

Go Web Application Init Project

다음으로, main.go 파일을 생성합니다. 이 파일은 Go 애플리케이션의 루트 역할을 하며 웹 앱의 소스 코드를 담게 됩니다:

VS Code에서 프로젝트를 엽니다:

다음 코드를 main.go 파일에 붙여넣습니다::

Go Web Application Main Go

방금 만든 Go 프로그램을 간단히 살펴보겠습니다.

  • 이 프로그램에서 package main 구문은 애플리케이션의 진입점 역할을 합니다. 또한 Go 컴파일러에 이 파일을 공유 라이브러리가 아닌 실행 파일로 컴파일하도록 지시합니다.
  • The import 문은 프로그램이 작동하는 데 필요한 모든 추가 모듈을 가져옵니다. 여기서는 fmt (텍스트 출력용) 및 net/http (웹 서버 애플리케이션용) 패키지를 가져왔습니다.
  • Using the function http.HandleFunc 함수를 사용하여 두 개의 라우트를 설정했습니다.
    • 첫 번째 라우트 /func main.
    • 내에서 상위 라우트 역할을 합니다. 두 번째 라우트 /greet/ URL 매개변수(이 경우 문자열)를 허용합니다. 그런 다음 해당 문자열이 인사말 메시지와 함께 표시됩니다.
      • URL Path 은(는) 다음 뒤의 값을 저장하는 데 사용됩니다. /greet/. 그런 다음 이 값은 name URL 매개변수로 전달됩니다.
    • The http.ListenAndServe 함수는 웹 서버를 시작합니다. 여기서는 다음 포트를 수신 대기하고 있습니다. 9990.

이제 프로그램이 준비되었으므로 파일을 실행 파일로 컴파일합니다:

Go 컴파일러는 파일과 동일한 이름의 실행 파일을 생성합니다. 출력을 확인해 보세요:

Go Web Application ls -lh

2단계 – 백그라운드 실행을 위한 systemd 유닛 파일 구성

지금까지는 현재 사용자가 시스템에서 로그아웃하면 Go 웹 앱의 실행이 중단됩니다. 이는 웹 서버로서는 좋지 않은 설계입니다. 이 문제를 해결하기 위해 사용자가 서버에서 로그아웃하더라도 백그라운드에서 계속 실행되도록 systemd 유닛 파일을 생성할 것입니다. 이를 통해 구성을 프로덕션 등급 배포에 한 걸음 더 가깝게 만들 수 있습니다.

전용 systemd 파일을 생성합니다. goweb.service 경로 아래에: /lib/systemd/system:

유닛 파일에 다음 스니펫을 추가합니다:

go web service

여기서,

  • 변수 ExecStart 은(는) 프로젝트 디렉터리( $GOPATH/go-web)에 위치한 메인 실행 파일을 통한 서비스의 진입점을 나타냅니다. $GOPATH을(를) 언급하는 대신 실행 파일의 전체 경로를 입력했다는 점에 유의하세요. 이는 $GOPATH 변수가 사용자에게만 보이기 때문입니다.
  • 변수 Restart은(는) 프로그램 실행이 중단될 경우 systemd가 수행할 작업을 알려줍니다. 값 always은(는) 프로그램 실행이 중단될 때마다 systemd 가 프로그램을 재시작하도록 지시합니다.
  • 변수 RestartSec은 systemd가 프로그램 재시작을 시도하기 전에 특정 시간 동안 대기하도록 지시합니다. 여기서는 값이 5s (5초)로 설정되어 있습니다.
  • 구문 WantedBy=multi-user.target은(는) systemd 가 서비스를 활성화할 상태를 지정합니다.

파일을 저장하고 편집기를 닫습니다. 서비스를 시작합니다:

go web start

서비스가 정상적으로 실행 중인지 확인합니다:

go web status

출력 결과에서 알 수 있듯이 애플리케이션이 정상적으로 실행 중입니다. 이제 Nginx를 역방향 프록시(reverse proxy)로 사용할 준비가 되었습니다.

3단계 – Nginx를 역방향 프록시로 구성

이제 Nginx가 역방향 프록시로 작동하도록 서버 블록을 생성할 것입니다. 웹 앱은 역방향 프록시를 통해 인터넷에 노출됩니다(추가적인 성능 및 보안을 위해).

현재 활성 디렉터리를 다음으로 변경합니다. sites-available:

cd

이제 애플리케이션을 노출할 도메인 이름으로 파일을 생성합니다. 데모를 위해 다음을 사용합니다. example.com:

 

블록 파일에 다음 코드를 입력합니다:

example.com

여기서는 proxy_pass을(를) 사용하여 서버의 IP 주소(localhost)의 포트 9990.

Nginx 블록을 활성화하려면 파일의 심볼릭 링크(소프트 링크라고도 함)를 sites-enabled 폴더에 생성합니다:

create sym

변경 사항을 적용하려면 Nginx 구성을 다시 로드합니다:

reload nginx

4단계 – 검증

모든 것이 예상대로 진행되었다면, 이제 웹 애플리케이션에 다음에서 액세스할 수 있어야 합니다. localhost:9990 및 우리가 구성한 도메인. 웹 브라우저에서 URL을 엽니다:

Hello World

예상대로 애플리케이션이 화면에 “Hello World”를 출력하고 있습니다. 이것이 기본 라우트의 역할입니다. 다음으로, 다음 URL을 방문하여 두 번째 라우트를 테스트합니다:

Hello Cloud

애플리케이션이 URL에서 받은 매개변수의 이름이 포함된 간단한 인사말 메시지를 성공적으로 반환하고 있습니다.

짜잔! 로컬 서버에 Go 웹 애플리케이션을 성공적으로 배포했습니다!

마치며

이 가이드에서는 Go 표준 라이브러리의 도움을 받아 간단한 Go 웹 애플리케이션을 배포하는 방법을 시연했습니다. 또한 Nginx를 사용하여 역방향 프록시를 배포했습니다. 시연은 로컬 서버에서 진행되었지만, 공개 서버의 경우 강력히 권장되는 사항은 SSL 인증서를 적용하여 인터넷에 안전하게 노출하는 것입니다. 더 많은 Go 프로그래밍을 보시려면, 다음 튜토리얼을 확인해 보세요: Go 프로그램 빌드 및 설치.

즐거운 컴퓨팅 되세요!

author

Pranay Kapgate

작성자 · CloudSigma

Preslav Dobrev는 CloudSigma의 크리에이티브 디자이너로서, 전통적이고 혁신적인 마케팅 채널을 활용하여 일관된 비즈니스 정체성을 구축하는 데 중점을 두고 있습니다. 그는 영향력 있는 브랜드 내러티브를 창출하기 위해 예술적 비전과 전략적 마케팅을 결합하는 데 능숙합니다.

댓글

아직 댓글이 없습니다. 첫 번째로 작성해 보세요.