티스토리 뷰
[Spring] Spring Cloud Config 사용 시의 주의사항 및 500 에러 (Internal Server Error)
망나니개발자 2022. 7. 4. 10:00이번에는 Spring Cloud Config 사용 시의 주의사항 중 하나인 baseDir 설정에 대해 알아보겠습니다.
1. Spring Cloud Config 사용 시의 주의사항(baseDir 설정)
[ Spring Cloud Config Server의 동작 방식 ]
Spring Cloud Config Server는 기본적으로 파일 저장소를 클론하여 관리한다. 그래서 클라이언트가 설정 정보를 요청하면 클론받은 디렉토리의 파일들을 읽어 값을 반환한다. 별도의 설정이 없다면 클론받은 폴더는 config-repo-<randomId>의 형태로 시스템의 임시 저장소에 쓰여진다고 공식 문서에 설명되어 있다. 예를 들어 리눅스 환경이라면 /tmp/config-repo-<randomId>에 저장된다.
[ 문제 상황 및 해결 방안 ]
문제 상황 (500 Internal Server Error)
Spring Cloud Config Server를 운영하다보니 주기적으로 특정 시간이 지나면 500 에러가 발생하기 시작하였다.
![]() |
로그를 살펴보니 파일을 클론받은 repo를 찾을 수 없다는 것인데, 그 원인은 OS로 사용중인 CentOS 때문이였다. 스택오버플로우에서 찾아보니 CentOS는 주기적으로 /tmp 를 지켜보고, 자동으로 청소하는 Cron이 등록되어 있다고 한다. 그래서 특정 시간이 지나도 사용되지 않는 파일 및 디렉토리들이 삭제된다는 것이다.
2022-06-30 19:17:01,090 ERROR org.apache.juli.logging.DirectJDKLog [http-nio-8888-exec-2] Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalStateException: Cannot load environment] with root cause
org.eclipse.jgit.errors.RepositoryNotFoundException: repository not found: /tmp/config-repo-5689147535204177175
at org.eclipse.jgit.lib.BaseRepositoryBuilder.build(BaseRepositoryBuilder.java:627)
at org.eclipse.jgit.api.Git.open(Git.java:93)
at org.eclipse.jgit.api.Git.open(Git.java:73)
at org.springframework.cloud.config.server.environment.JGitEnvironmentRepository$JGitFactory.getGitByOpen(JGitEnvironmentRepository.java:782)
at org.springframework.cloud.config.server.environment.JGitEnvironmentRepository.openGitRepository(JGitEnvironmentRepository.java:638)
at org.springframework.cloud.config.server.environment.JGitEnvironmentRepository.createGitClient(JGitEnvironmentRepository.java:613)
at org.springframework.cloud.config.server.environment.JGitEnvironmentRepository.refresh(JGitEnvironmentRepository.java:296)
at org.springframework.cloud.config.server.environment.JGitEnvironmentRepository.getLocations(JGitEnvironmentRepository.java:262)
at org.springframework.cloud.config.server.environment.MultipleJGitEnvironmentRepository.getLocations(MultipleJGitEnvironmentRepository.java:139)
at org.springframework.cloud.config.server.environment.AbstractScmEnvironmentRepository.findOne(AbstractScmEnvironmentRepository.java:55)
at org.springframework.cloud.config.server.environment.MultipleJGitEnvironmentRepository.findOneFromCandidate(MultipleJGitEnvironmentRepository.java:188)
at org.springframework.cloud.config.server.environment.MultipleJGitEnvironmentRepository.findOne(MultipleJGitEnvironmentRepository.java:173)
at org.springframework.cloud.config.server.environment.CompositeEnvironmentRepository.findOne(CompositeEnvironmentRepository.java:64)
at org.springframework.cloud.config.server.environment.EnvironmentEncryptorEnvironmentRepository.findOne(EnvironmentEncryptorEnvironmentRepository.java:61)
at org.springframework.cloud.config.server.environment.EnvironmentController.getEnvironment(EnvironmentController.java:134)
at org.springframework.cloud.config.server.environment.EnvironmentController.defaultLabel(EnvironmentController.java:110)
해결 방안 (baseDir 설정)
스프링 클라우드 공식 문서에서는 이미 이와 관련된 내용을 Warning으로 다루고 있다. 아래의 내용을 보면 OS에 따라서 주기적으로 임시 디렉토리가 삭제될 수 있으니, basedir을 설정해주라는 것이다.
![]() |
즉, 설정 파일을 클론받는 위치를 직접 지정해서 임시 디렉토리에 받지 말라는 것이다. 그러므로 Config Server의 설정 파일에서 다음과 같이 baseDir을 설정해주면 문제가 해결된다. 아래에서는 프로젝트 폴더 하위의 repo 폴더에 클론받도록 해두었다.
server:
port: 8888
spring:
cloud:
config:
server:
git:
default-label: master
uri: https://github.com/MangKyu/spring-cloud-config-sample
search-paths: test-cloud-config-file/**
basedir: ./repo
이번에는 Spring Cloud Config를 사용하면서 주의할 점에 대해 알아보았습니다. 전체 소스 코드는 깃 허브를 참고해주세요! 추가로 혹시 피드백 주실 부분 있으면 환영하겠습니다. 감사합니다:)
관련 포스팅
- Spring Cloud Config 도입하기 및 private 레포지토리 SSL로 연결 설정 예시
- Spring Cloud Config 설정 파일 내용을 갱신하는 방법, Spring Cloud Bus 없이 자동 갱신하기
- Spring Cloud Config 사용 시의 주의사항 및 500 에러 (Internal Server Error)