Theme:

개발 서버에서 인터넷이 차단되어 Maven Central에 접근할 수 없다면, 라이브러리 의존성은 어떻게 해결할까요?

Nexus Repository Manager(이하 Nexus)는 Sonatype에서 개발한 사설 아티팩트 저장소 관리 도구입니다. 외부 공개 저장소의 프록시 역할과 내부 라이브러리 배포/관리 역할을 동시에 수행합니다.


왜 사설 저장소가 필요한가

도입 이유설명
** 외부망 차단 환경 대응**보안 정책상 개발 서버에서 인터넷 접근이 불가한 경우, Nexus가 Maven Central을 대신하여 라이브러리를 제공합니다
** 라이브러리 캐싱**한 번 다운로드한 외부 라이브러리를 Nexus에 캐싱하여, 동일 라이브러리를 반복 다운로드하지 않아도 됩니다. 빌드 속도가 향상되고 외부 저장소 장애에도 영향을 받지 않습니다
** 내부 아티팩트 관리**팀에서 개발한 공통 라이브러리를 Nexus에 배포하면, 다른 프로젝트에서 Maven 의존성으로 가져다 쓸 수 있습니다
** 버전 관리 일관성**Release와 Snapshot을 분리하여 관리함으로써, 안정 버전과 개발 버전을 명확히 구분할 수 있습니다

정리하면, Nexus는 "외부 라이브러리를 안전하게 받아오고, 내부 라이브러리를 체계적으로 배포하는 허브" 역할을 합니다.


사전 준비: JDK 설치

Nexus 3.x는 내부적으로 Jetty 기반의 Java 애플리케이션으로 동작하기 때문에, JDK 11 이상 이 설치되어 있어야 합니다.

Sonatype 공식 문서에서는 JDK 11을 권장합니다. JDK 8도 지원하지만, 보안 패치와 성능 최적화 측면에서 JDK 11 이상을 사용하는 것이 좋습니다.

BASH
# OpenJDK 11 설치 (Rocky Linux / RHEL 계열)
sudo yum install java-11-openjdk

# 설치 확인
java -version

Nexus 설치

1. Nexus 다운로드 및 압축 해제

BASH
# 최신 버전 다운로드
wget https://download.sonatype.com/nexus/3/latest-unix.tar.gz

# 설치 디렉터리에 압축 해제
tar -xzf latest-unix.tar.gz -C /svc/nexus

압축을 해제하면 두 개의 디렉터리가 생성됩니다.

디렉터리용도
nexus-3.x.x-xx/Nexus 실행 바이너리, 설정 파일이 위치하는 애플리케이션 디렉터리
sonatype-work/nexus3/저장소 데이터, 로그, 캐시 등 런타임 데이터가 저장되는 데이터 디렉터리

업그레이드 시 nexus-3.x.x-xx/ 디렉터리만 교체하면 됩니다. sonatype-work/에 저장된 데이터는 유지됩니다.


2. 실행 계정 설정

Nexus를 root가 아닌 전용 계정으로 실행하는 것이 보안상 권장됩니다. nexus.rc 파일에서 실행 계정을 지정합니다.

BASH
# ${NEXUS_HOME}/nexus-3.x.x-xx/bin/nexus.rc
run_as_user="nexus"  # Nexus 전용 실행 사용자 지정

root로 Nexus를 실행하면 보안 취약점 발생 시 시스템 전체가 위험해질 수 있습니다. 반드시 전용 계정을 생성하여 사용합니다.


3. 실행 포트 변경

Nexus의 기본 포트는 8081이지만, 다른 서비스와 충돌을 피하기 위해 변경할 수 있습니다.

BASH
# ${NEXUS_HOME}/nexus-3.x.x-xx/etc/nexus-default.properties

## DO NOT EDIT - CUSTOMIZATIONS BELONG IN $data-dir/etc/nexus.properties
##
# Jetty section
application-port=40000       # Nexus가 바인딩할 HTTP 포트
application-host=0.0.0.0     # 모든 네트워크 인터페이스에서 접근 허용
nexus-args=${jetty.etc}/jetty.xml,${jetty.etc}/jetty-http.xml,${jetty.etc}/jetty-requestlog.xml
nexus-context-path=/         # 컨텍스트 경로 (/ = 루트)

# Nexus section
nexus-edition=nexus-pro-edition
nexus-features=\
 nexus-pro-feature

주요 설정 항목은 다음과 같습니다.

항목기본값설명
application-port8081Nexus 웹 UI 및 API 접근 포트
application-host0.0.0.0바인딩할 호스트. 0.0.0.0이면 모든 인터페이스에서 접근 가능
nexus-context-path/URL 경로 접두사. /nexus로 변경하면 http://host:port/nexus로 접근

4. systemd 서비스 등록

서버 재부팅 시 Nexus가 자동으로 시작되도록 systemd 서비스로 등록합니다.

BASH
# /etc/systemd/system/nexus.service

[Unit]
Description=nexus service
After=network.target          # 네트워크가 올라온 후 시작

[Service]
Type=forking                  # Nexus가 백그라운드 프로세스로 실행되므로 forking 타입
LimitNOFILE=65536             # 파일 디스크립터 제한 (저장소 파일이 많으므로 충분히 설정)
ExecStart=/svc/nexus/nexus-3.x.x-xx/bin/nexus start
ExecStop=/svc/nexus/nexus-3.x.x-xx/bin/nexus stop
User=nexus                    # nexus.rc에 지정한 실행 계정과 동일하게 설정
Restart=on-abort              # 비정상 종료 시 자동 재시작

[Install]
WantedBy=multi-user.target    # 멀티유저 모드에서 자동 시작

서비스를 등록하고 시작합니다.

BASH
# systemd 데몬 리로드 (서비스 파일 변경 반영)
systemctl daemon-reload

# 부팅 시 자동 시작 등록
systemctl enable nexus.service

# 서비스 시작
systemctl start nexus.service

# 상태 확인
systemctl status nexus.service

설치 후 확인

로그 확인

Nexus 시작 후 정상 동작 여부는 로그 파일에서 확인할 수 있습니다.

BASH
# Nexus 로그 파일 경로
tail -f /svc/nexus/sonatype-work/nexus3/log/nexus.log

Started Sonatype Nexus 메시지가 출력되면 정상 기동된 것입니다. 최초 기동에는 수 분이 소요될 수 있습니다.

웹 UI 접속

브라우저에서 http://<서버IP>:40000으로 접속하면 Nexus 웹 UI를 확인할 수 있습니다.


보안 설정 (필수)

최초 설치 후 반드시 수행해야 하는 보안 설정입니다. 기본 상태로 운영하면 누구나 관리자 권한으로 접근할 수 있습니다.

항목조치
기본 관리자 비밀번호 변경최초 비밀번호는 sonatype-work/nexus3/admin.password 파일에 저장되어 있습니다. 로그인 후 즉시 변경합니다
Anonymous Access 비활성화관리자 설정에서 익명 접근을 비활성화하여, 인증된 사용자만 저장소에 접근할 수 있도록 합니다
** 방화벽 설정**Nexus 포트(40000)에 대해 허용된 IP 대역만 접근 가능하도록 방화벽 규칙을 설정합니다

서버 IP, 계정, 비밀번호 등 민감 정보는 반드시 비공개로 관리해야 합니다.


주의할 점

LimitNOFILE 미설정

Nexus는 저장소에 수만 개의 아티팩트 파일을 관리합니다. systemd 서비스 파일에서 LimitNOFILE=65536을 설정하지 않으면, 파일 디스크립터 부족으로 요청이 거부되는 현상이 발생할 수 있습니다. 운영 중 갑자기 Too many open files 에러가 나온다면 이 설정을 확인합니다.

sonatype-work 디렉토리 백업

Nexus 업그레이드 시 nexus-3.x.x-xx/ 디렉토리만 교체하면 되지만, sonatype-work/nexus3/에 저장된 데이터를 실수로 삭제하면 모든 저장소 데이터를 잃게 됩니다. 업그레이드 전 반드시 sonatype-work/ 디렉토리를 백업합니다.

root 실행 금지

nexus.rc에서 run_as_user를 설정하지 않고 root로 실행하면, 보안 취약점 발생 시 시스템 전체가 위험해집니다. 반드시 전용 계정(nexus)을 생성하여 실행합니다.


정리

단계명령 / 설정
JDK 설치yum install java-11-openjdk
Nexus 다운로드wget + tar/svc/nexus
실행 계정 설정nexus.rcrun_as_user="nexus"
포트 변경nexus-default.propertiesapplication-port
systemd 등록/etc/systemd/system/nexus.service 작성
서비스 시작systemctl enable --now nexus.service
보안 설정기본 비밀번호 변경, Anonymous Access 비활성화, 방화벽
댓글 로딩 중...