서버 인증서 적용기5. gitlab 대용량 repository clone불가 현상

1. 개요

서버 인증서 적용기 마지막 챕터이다. 이전 챕터까지 완료하고 모두 정상적으로 동작하는 것처럼 보였다.

그러나 또다시 이슈가 발생했다..(ㅜㅜ) 대용량 레파지토리에서만 발생하는 이슈였는데, 이번 포스트는 그에 관련된 내용이다.


2. gitlab 대용량 repository clone 이슈

2.1. Git clone에러

먼저, 대용량 레파지토리에서 발생한 이슈는 다음과 같다. 정체모를 RPC failed에러가 계속해서 발생했다.

Cloning into 'large-repository'...
remote: Counting objects: 20248, done.
remote: Compressing objects: 100% (10204/10204), done.
error: RPC failed; curl 18 transfer closed with outstanding read data remaining
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed


2.2. 임시 해결

먼저 찾은 첫번째 해결책은 clone 및 fetch 시 depth를 주는 방식이었다.

다음과 같이 depth를 주게되면, 한번에 전체 레파지토리를 다운로드 받지 않으므로 대용량 관련 이슈에서 벗어날 수 있다.

$ git clone http://github.com/large-repository --depth 1
$ cd large-repository
$ git fetch --depth=100


2.3. Nginx 설정 변경

그렇지만 depth로 해결하기엔 너무 불편함이 많아 다른 방법을 찾아야겠다고 결심했다.

먼저 이전에는 전혀 발생하지 않았던 이슈라 Reverse proxy서버단의 문제일 것이라고 추측했고, Nginx관련 설정을 여기저기 서치해보기 시작했다.

그러다 찾은 것이 버퍼 관련 설정이었고, nginx.conf에 해당 설정을 추가한 후 해당 이슈는 더 이상 발생하지 않았다. 전체 설정은 서버 인증서 적용기3의 2.3에서 확인할 수 있다.

proxy_request_buffering off;
proxy_buffering off;

먼저 proxy_request_buffering는 요청 관련 버퍼 설정, proxy_buffering는 응답 관련 버퍼 설정이다. Nginx는 데이터 송수신 시 바로 전달하지 않고 내부 버퍼에 저장하는데, 해당 설정들을 비활성화하게되면 즉시 전달하게 된다.

레파지토리의 데이터를 버퍼에 저장해두고 읽어오던 도중, 커넥션이 끊겼던 것으로 보인다. 이건 버퍼를 off시키는 것으로 해당 이슈는 마무리했다.


3. 결론

이렇게 5개 챕터로 도메인+인증서 적용은 완료됐다. 적용한 이후로 이슈없이 사용하고 있으니, 앞으로도 수정할 일은 없을 것으로 보인다…

한번 이렇게 해봤으니 다음부터는 좀 더 익숙하게 할 수 있을 것 같다. :)