Nexus 설치

문성하·2024년 2월 13일
0

환경 구성

virtual Machine Spec

  • CPU/MEM : 8Core / 16GB

  • OS : Ubuntu 22.04.3 Server

  • Disk : 300GB

전제조건

  • Ubuntu 22.04 서버.

  • sudo/administrator가 활성화된 루트가 아닌 사용자.

  • Ubuntu 서버 IP 주소를 가리키는 도메인 이름(프로덕션용).

Nexus 설치 전 환경 설정

jdk 설치

jdk 설치 전 apt update를 진행합니다.

sudo apt update
sudo apt-get update

jdk 8 버전을 다운로드 합니다.

sudo apt install -y openjdk-8-jdk

java -version 을 통해 설치가 잘 되었는지 확인합니다.

설정

Nexus 설치를 위해 새로운 전용 Linux 사용자를 생성합니다.

sudo useradd -d /opt/nexus -s /bin/bash nexus
sudo passwd nexus

하드/소프트 제한에 대해 최대 개방(65536) 설정을 합니다.

다음으로 아래 명령을 사용하여 ulimit를 65536으로 설정합니다.

ulimit -n 65536

위 명령어는 일시적 적용이므로, 아래 단계를 통해 영구적으로 ulimit 설정이 가능합니다.

ulimit를 영구적으로 설정하려면 nano 편집기를 사용하여 새 구성 파일 /etc/security/limits.d/nexus.con을 만드십시오.

sudo nano /etc/security/limits.d/nexus.conf

파일에 다음 구성을 추가합니다. 이 예에서는 값이 65536인 특정 사용자 넥서스에 대한 ulimit를 설정합니다.

nexus - nofile 65536

ulimit -a를 통해 설정이 적용되었는지 확인합니다.

Nexus 설치

설치

Nexus Repository Manager 패키지를 다운로드

wget https://download.sonatype.com/nexus/3/nexus-3.41.1-01-unix.tar.gz

파일을 압축해제

nexus-3.41.1-01 디렉토리 : Nexus 패키지의 기본 디렉토리이고

sonatype-work 디렉토리 : Nexus의 기본 작업 디렉토리입니다.

tar xzf nexus-3.41.1-01-unix.tar.gz

기본 설정

디렉토리를 /opt로 이동

Nexus 패키지 디렉토리는 /opt/nexus이고 Nexus 작업 디렉토리는 /opt/sonatype-work입니다.

mv nexus-3.41.1-01 /opt/nexus
mv sonatype-work /opt/

마지막으로 아래 chown 명령을 통해 두 디렉토리의 소유권을 사용자 및 그룹 넥서스로 변경합니다.

chown -R nexus:nexus /opt/nexus /opt/sonatype-work

/opt/nexus/bin/nexus.rc 파일 설정

run_as_user 옵션의 주석을 제거하고 값을 nexus로 변경

run_as_user="nexus"

최대 힙 메모리 변경 ( 필요 시 진행)

다음으로 nano 편집기를 사용하여 /opt/nexus/bin/nexus.vmoptions 구성 파일을 열어 Nexus의 최대 힙 메모리를 설정합니다.

sudo vi /opt/nexus/bin/nexus.vmoptions
-Xms1024m
-Xmx1024m
-XX:MaxDirectMemorySize=1024m

-XX:ActiveProcessorCount=4

기본 옵션으로 진행 - 5line은 추후 설명

Nexus를 SystemD 서비스로 실행

아래 명령어를 통해 nexus 실행 가능

# /opt/nexus/bin 
./nexus start

systemd 서비스 파일로 Nexus를 실행하면 systemctl 명령을 통해 nexus 프로세스를 관리할 수 있습니다.

nexus 설정

sudo vi /etc/systemd/system/nexus.service

파일에 다음 구성을 추가합니다.

[Unit]
Description=nexus service
After=network.target

[Service]
Type=forking
LimitNOFILE=65536
ExecStart=/opt/nexus/bin/nexus start
ExecStop=/opt/nexus/bin/nexus stop
User=nexus
Restart=on-abort

[Install]
WantedBy=multi-user.target

daemon-reload를 통해 시스템 관리자를 다시 로드

sudo systemctl daemon-reload

nexus.service를 시작하고 활성화합니다.

Nexus Repository Manager는 이제 로컬 IP 주소 127.0.0.1에서 기본 포트 8081로 시작합니다. 또한 nexus.service는 시스템 부팅 시 자동으로 실행됩니다.

sudo systemctl enable nexus.service
sudo systemctl start nexus.service

마지막으로 다음 명령을 실행하여 nexus.service를 확인하고 서비스가 실행 중인지 확인합니다.

sudo systemctl status nexus.service

localhost로 배포, ubuntu server os에서 배포했기 때문에 접속을 위해 hosts파일을 수정합니다.

# vi /etc/hosts

192.168.31.xxx moon6.ps3-osc.shop

Nexus Private Repository 사용

로그인

  • id : admin

  • pw : 하단 확인

비밀번호를 확인합니다.

cat /opt/sonatype-work/nexus3/admin.password 

현재는 http 5000 port로 테스트 → 이후 https로 변경

Nexus 설정

  • Blob Stores 생성
  • repository 생성 - docker hosted
  • Realms 추가 - docker token

vm 설정

  • docker daemon.json - insecure옵션으로 https 무시

현재 설정한 private registry는 기본적으로 인증되지 않은 저장소이고, HTTPS 통신을 사용하는것도 아니기에, docker daemon에서 해당 서버로의 접근을 차단한다.

그렇기에 docker daemon 설정을 변경하여 해당 서버로의 통신을 허가해야 한다.

Nexus Private Repository - HTTPS 설정

docker daemon 설정의 insecure-registries 옵션을 수정하여 docker 엔진이 안전하지 않은 private registry에 접근할 수 있도록 허가했다. 이를 https로 변환하는 작업을 수행한다.

Repository의 https: 5001포트를 열어줍니다.

앞서 nexus가 구동되고 있는 시스템에는 Java가 설치되어 있다.

그렇다면 keytool 이라는 Java KeyStore 기반 인증서를 관리할 수 있는 도구가 같이 설치되었을 것이다.

이걸 이용하여 nexus repository에서 사용할 KeyStore를 생성한다.

아래와 같은 명령을 통해 KeyStore를 생성한다.

cd /cert
openssl pkcs12 -export -out nexus.p12 -inkey server.key -in server.crt

keytool -importkeystore -srckeystore nexus.p12 -srcstoretype pkcs12 -destkeystore keystore.jks -deststoretype pkcs12

생성한 파일을 nexus의 경로에 복제

cp keystore.jks /opt/nexus/etc/ssl/keystore.jks

nexus 설정 변경

우선 nexus의 기본 설정 파일에서 HTTPS PORT를 지정하고, HTTPS 설정을 불러오도록 지정해야 한다.

  • application-port → 주석처리
  • application-port-ssl=8443
  • jetty-http.xml → jetty-https.xml
vi /opt/nexus/etc/nexus-default.properties

nexus-default.properties 파일을 수정 한 뒤 KeyStore의 적용을 위해 /opt/nexus/etc/jetty/jetty-https.xml 파일을 수정

vi /opt/nexus/etc/jetty/jetty-https.xml
  • 30 line~ password 변경

nexus 재시작

systemctl restart nexus.service 

daemon.json에 있는 파일을 삭제해줍니다. - insecure-registries제거

docker login 시도

docker login moon6.ps3-osc.shop:5001

version2 nexus reverse proxy

Nexus가 시스템 서비스로 실행되면 이제 Nexus에 대한 역방향 프록시를 설정할 수 있습니다.

리버스 프록시로 Nexus 실행

Nexus Repository Manager는 127.0.0.1에서 기본 포트 8081로 실행 중입니다. 네트워크 외부에서 액세스할 수 있도록 하려면 표준 HTTP/HTTPS 포트에서 실행되는 Nginx 역방향 프록시를 사용합니다.

apt 명령을 실행하여 Nginx 웹 서버를 Ubuntu 시스템에 설치합니다.

sudo apt install -y nginx

Nginx가 설치되면 다음 systemctl 명령을 실행하여 nginx 서비스를 확인하고 확인합니다. nginx 서비스가 활성화되고 시스템 부팅 시 자동으로 실행되는 것을 볼 수 있습니다. 그리고 nginx 서비스의 상태가 실행 중입니다.

sudo systemctl is-enabled nginx
sudo systemctl status nginx

새 서버 블록 구성 /etc/nginx/sites-available/nexus을 만듭니다.

sudo vi /etc/nginx/sites-available/nexus

다음 Nginx 구성을 파일에 추가하고 도메인 이름을 변경해야 합니다.

upstream nexus3 {
  server 127.0.0.1:8081;
}

server {
    listen 80;
    server_name moon6.ps3-osc.shop;
    
    location / {
        proxy_pass http://nexus3/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forward-Proto http;
        proxy_set_header X-Nginx-Proxy true;

        proxy_redirect off;
    }
}

다음으로 다음 명령을 실행하여 sites-enabled 디렉토리에 대한 구성 파일의 심볼릭 링크를 생성하여 Nexus에 대한 서버 블록 구성을 활성화합니다. 그런 다음 Nginx 구성을 확인하여 Nginx가 올바르게 구성되었는지 확인합니다.

sudo ln -s /etc/nginx/sites-available/nexus /etc/nginx/sites-enabled/

sudo nginx -t

Nginx 구성이 제대로 구성된 경우 "test is successfull"과 같은 출력 메시지가 표시되어야 합니다.

마지막으로 다음 명령을 실행하여 Nginx 서비스를 다시 시작하고 Nexus에 대한 새 서버 블록 구성을 적용합니다.

sudo systemctl restart nginx

이제 Nginx 웹 서버를 Ubuntu 시스템의 Nexus Repository Manager에 대한 리버스 프록시로 설정했습니다. 이제 도메인 이름을 통해 Nexus 설치에 액세스할 수 있습니다.

https 적용

구매했던 pem 파일을 다운로드하고, 이를 key, crt형태로 변환합니다.

openssl rsa  -in _wildcard_.xxx.key.pem -text >  server.key
openssl x509 -inform PEM -in _wildcard_xxxx.crt.pem -out server.crt


mkdir /cert
cp server.* /cert

이전에 구성했던 /etc/nginx/sites-available/nexus 파일을 변환합니다.

sudo vi /etc/nginx/sites-available/nexus
upstream nexus3 {
  server 127.0.0.1:8081;
}

server {
    listen 443 ssl;
    
    server_name moon6.ps3-osc.shop;

    ssl_certificate /cert/server.crt;
    ssl_certificate_key /cert/server.key;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDHE+AESGCM:ECDHE+AES256:ECDHE+AES128:!aNULL:!MD5:!DSS:!DH:!CAMELLIA:!AESCCM;

    location / {
        proxy_pass http://nexus3/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forward-Proto http;
        proxy_set_header X-Nginx-Proxy true;

        proxy_redirect off;
    }
}
sudo ln -s -f /etc/nginx/sites-available/nexus /etc/nginx/sites-enabled/

sudo nginx -t

nexus 재시작

sudo systemctl restart nginx

0개의 댓글