GitLab Workhorse
GitLab v19.2요약
GitLab Workhorse는 리소스 집약적이고 오래 실행되는 요청을 처리하기 위해 설계된 GitLab용 스마트 리버스 프록시입니다. Workhorse 앞에 다른 리버스 프록시 서버를 둘 수 있지만 NGINX만 지원됩니다.
GitLab Workhorse는 리소스 집약적이고 오래 실행되는 요청을 처리하기 위해 설계된 GitLab용 스마트 리버스 프록시입니다.
Workhorse는 Puma 앞에 위치하며 GitLab Rails로 향하거나 Rails에서 나오는 모든 HTTP 요청을 가로챕니다.
Rails는 요청을 Workhorse에 위임하고, Workhorse는 파일 다운로드 및 업로드, HTTP를 통한 git 푸시/풀, HTTP를 통한 git 아카이브 다운로드 등 리소스 집약적인 HTTP 요청을 처리하는 책임을 담당합니다.
이를 통해 리소스 활용을 최적화하고 요청 처리 효율성을 향상시킵니다.
GitLab 스택에서의 역할#
Workhorse 앞에 다른 리버스 프록시 서버를 둘 수 있지만 NGINX만 지원됩니다.
소스에서 GitLab을 설치할 때 Apache와 같은 다른 리버스 프록시를 사용하는 것도 가능하지만 지원되지는 않습니다.
gitlab.com과 같은 많은 GitLab 인스턴스에서는 CloudFlare 같은 CDN이 NGINX 앞에 위치합니다.
HTTP 요청을 처리하고 HTTP 응답을 반환하는 모든 Rails 컨트롤러 및 기타 코드는 GitLab Workhorse를 통해 프록시됩니다. Workhorse는 대부분의 리버스 프록시와 달리 GitLab Rails와 긴밀하게 결합되어 있으며, 다른 대부분의 리버스 프록시는 보다 범용적입니다. 필요한 경우 Workhorse는 GitLab Rails가 작업을 효율적으로 오프로드하기 위해 의존하는 HTTP 헤더를 수정합니다.
기능 및 동작#
요청 처리#
-
Workhorse는 주로 수신 요청에 대한 패스스루 역할을 하며, 처리를 위해 요청을 Rails로 전달합니다. 본질적으로 대부분의 요청에 최소한의 개입만 수행하여 간결한 요청 처리 파이프라인을 유지합니다.
-
특정 유형의 요청, 특히 리소스 집약적이거나 특수한 처리가 필요한 요청(예: 대용량 파일 업로드)의 경우 Workhorse는 더 적극적인 역할을 합니다. Rails의 지시를 받으면 Workhorse는 Gitaly와 직접 상호작용하거나 Rails에서 파일 업로드 처리를 오프로드하는 등의 특수 작업을 실행합니다.
Gitaly와 관련된 Workhorse의 새로운 기능을 개발할 때는 Gitaly 버전 호환성 요구사항에 관한 가이드라인을 따라야 합니다.
특수 작업 처리#
-
Workhorse는 Rails의 응답을 기반으로 특정 요청을 가로채고 사전 정의된 작업을 실행할 수 있습니다. 여기에는 Gitaly와의 상호작용, 대용량 데이터 블롭 관리, 필요에 따른 요청 처리 로직 변경이 포함됩니다.
-
Workhorse는 파일 업로드를 효율적으로 관리할 수 있습니다. 파일 업로드 프로세스를 가로채고, Rails가 지시하는 대로 필요한 작업(파일을 임시 저장하거나 오브젝트 스토리지에 업로드하는 등)을 수행한 후, 프로세스가 완료되면 Rails에 알립니다.
Rails API와의 통합#
Workhorse는 Rails API에 대한 프록시 역할을 하며, 특히 컨테이너 레지스트리 서비스와의 상호작용이 필요한 컨텍스트에서 그렇습니다. 이 설정은 리버스 프록시로 동작하여 Rails에 대한 직접적인 부하를 최소화함으로써 고부하 서비스를 처리하는 Workhorse의 방식을 잘 보여줍니다.
아키텍처 고려사항#
기능 확장#
-
단순성 유지: 특정 서비스(예: 컨테이너 레지스트리)의 직접 처리를 포함하도록 Workhorse의 기능을 확장하면서도, 단순성과 효율성을 유지하는 것이 중요합니다. Workhorse는 복잡한 제어 로직을 포함해서는 안 되며, Rails의 지시에 따라 작업을 실행하는 데 집중해야 합니다.
-
서비스 구현 및 데이터 마이그레이션: Workhorse에 새로운 기능을 구현할 때는 데이터 마이그레이션 전략과 서비스 연속성을 신중하게 고려해야 합니다.
데이터 관리 및 운영 무결성#
-
Workhorse의 아키텍처는 가비지 컬렉션 및 데이터 마이그레이션을 포함한 효율적인 데이터 관리 전략을 지원합니다. Workhorse의 역할은 복잡한 데이터 조작이나 제어 로직(이는 Rails의 영역으로 남아 있음)에 직접 관여하지 않고 고성능 운영을 지원하는 것입니다.
-
백그라운드 처리나 오래 실행되는 작업이 필요한 경우, 별도의 서비스나 Sidekiq job 큐를 사용하고 Workhorse와 Rails가 협력하여 작업 실행과 데이터 무결성을 관리하는 것이 권장됩니다.
Workhorse는 gitlab-org/gitlab/workhorse의 Rails 모노리포 하위 폴더에 포함되어 있습니다.
학습 리소스#
-
Workhorse 문서 (이 페이지)
Workhorse 설치#
GitLab Workhorse를 설치하려면 Go 1.18 이상과 GNU Make가 필요합니다.
/usr/local/bin에 설치하려면 make install을 실행하세요.
make install
/foo/bin에 설치하려면 PREFIX 변수를 설정하세요.
make install PREFIX=/foo
FreeBSD 같은 일부 운영 체제에서는 make 대신 gmake를 사용해야 할 수 있습니다.
일부 기능은 빌드 태그에 의존하므로, 이를 활성화하려면 반드시 Workhorse 구성을 확인하세요.
런타임 의존성#
Workhorse는 업로드된 이미지에서 EXIF 데이터(민감한 정보가 포함될 수 있음)를 제거하기 위해 ExifTool을 사용합니다. GitLab을 설치한 방법에 따라:
-
Linux 패키지를 사용하여 설치한 경우, 이미 준비되어 있습니다. CentOS Minimal을 사용하는 경우
perl패키지를 설치해야 할 수 있습니다:yum install perl. -
소스에서 설치한 경우,
exiftool이 설치되어 있는지 확인하세요:
# Debian/Ubuntu
sudo apt-get install libimage-exiftool-perl
# RHEL/CentOS
sudo yum install perl-Image-ExifTool
코드 테스트#
다음 명령으로 테스트를 실행합니다:
make clean test
GitLab Workhorse의 각 기능에는 해당 기능이 올바른 요청에서 '작동'하고 다른 요청에는 영향을 미치지 않는다는 것을 검증하는 통합 테스트가 있어야 합니다. 특정 동작에 대한 패키지 수준 테스트도 있으면 더 좋지만, 개발 중에는 높은 수준의 통합 테스트가 최우선 순위가 되어야 합니다.
기능이 통합 테스트만으로 커버되어도 괜찮습니다.