관리 메뉴

거니의 velog

리눅스 개발환경 세팅 본문

etc 이슈

리눅스 개발환경 세팅

Unlimited00 2025. 4. 15. 09:56

실무에서는 프로젝트 성격·배포 파이프라인 구성에 따라 좀 더 합리적인 순서를 정해놓고 설치·셋업을 진행합니다. 모든 구성요소가 서로 어느 정도 독립적이기 때문에, 순서가 바뀌어도 동작 자체는 가능합니다. 다만, 아래와 같은 실무적 추천 순서가 있습니다.


1. OS 환경 & 기초 도구 세팅

  • 리눅스 업데이트 (yum update, apt-get update 등)
  • 필수 패키지/라이브러리 설치 (Java, gcc, openssl, wget 등)
  • 방화벽 설정, 네트워크 설정 확인
  • 이 부분은 가장 먼저 해야, 이후 각종 서버와 도구 설치 시 충돌이 적습니다.
sudo ufw status

sudo ufw allow 9876
sudo ufw allow 9877
sudo ufw allow 9878
sudo ufw allow 9879
sudo ufw allow 9880
sudo ufw allow 9881

#apache tomcat 연결
sudo ufw allow 8009/tcp


#테스트후 was 직접 접근은 차단
sudo ufw deny 9880/tcp
sudo ufw deny 8009/tcp

sudo ufw reload

sudo netstat -tuln | grep 9881

자세한 설명:

  1. sudo ufw status
    • **ufw(Ubuntu Firewall)**의 현재 상태(활성화 여부, 규칙 등)를 확인하는 명령어입니다.
    • 이 명령어를 통해, 현재 어떤 포트가 열려있는지, 방화벽 정책이 어떤지 등을 확인할 수 있습니다.
  2. sudo ufw allow 9876, sudo ufw allow 9877, sudo ufw allow 9878, sudo ufw allow 9879, sudo ufw allow 9880, sudo ufw allow 9881
    • ufw 방화벽에서 9876, 9877, 9878, 9879, 9880, 9881 포트를 열어주는(Allow) 설정입니다.
    • 기본적으로 Linux 서버에서 필요한 서비스(프로그램)들이 해당 포트를 통해 외부와 통신할 수 있도록 허용해줍니다.
  3. sudo ufw allow 8009/tcp
    • Apache Tomcat에서 AJP(Apache JServ Protocol) 등을 사용할 때 기본적으로 8009 포트를 사용하는데, 이를 허용합니다.
    • tcp 프로토콜로 외부에서 접속할 수 있게 허용한다는 의미입니다.
  4. sudo ufw deny 9880/tcp, sudo ufw deny 8009/tcp
    • 앞서 허용했던 9880/tcp와 8009/tcp를 이제 차단(deny)하겠다는 설정입니다.
    • 테스트가 끝났으므로 WAS에 대한 직접 접속은 방지하고, 프록시나 다른 방식으로만 접근하도록 하겠다는 의도입니다.
  5. sudo ufw reload
    • ufw 방화벽 규칙을 다시 로드(reload)하여, 방금 설정한 규칙들을 적용합니다.
  6. sudo netstat -tuln | grep 9881
    • netstat 명령어를 사용하여 TCP/UDP 포트 별 Listen 상태를 확인하고, 그 결과 중에 9881이라는 문자열이 포함된 부분만 grep으로 필터링합니다.
    • 9881 포트가 실제로 열려 있고, 어떤 프로세스가 사용 중인지 여부 등을 확인할 수 있습니다.
    • -tuln 옵션:
      • -t: TCP 소켓 정보만 표시
      • -u: UDP 소켓 정보만 표시
      • -l: Listening 중인 소켓만 표시
      • -n: 호스트명 대신 IP, 포트번호 등 숫자로 된 정보를 표시

2. 버전 관리 시스템(SVN) & 빌드 도구(Maven)

  1. SVN(Subversion) 서버
    • 코드 버전을 관리하기 위해 필요
    • 이미 다른 서버에서 운용 중이면 건너뛸 수 있음
  2. Maven
    • Java 프로젝트 빌드·관리
    • 로컬 개발/빌드 환경에서 먼저 설치 후, 서버(젠킨스 등)에서도 사용
    • mvn -v로 설치 검증
보통 SVN을 먼저 설치 후 Maven을 설치해도 되고, 반대로 해도 문제는 없습니다.
Maven을 설치해둔 뒤, 바로 레포지토리를 연결하거나, SVN에서 코드를 가져와 빌드할 때 필요하므로 
같은 시점에 진행하는 경우가 많습니다.
sudo apt update
sudo apt install build-essential libapr1-dev libaprutil1-dev liblz4-dev libutf8proc-dev zlib1g-dev

# 최신 버전의 Subversion 다운로드
cd /poa/data
wget http://archive.apache.org/dist/subversion/subversion-1.14.3.tar.gz
tar -xzvf subversion-1.14.3.tar.gz
cd subversion-1.14.3

cd /poa/data
wget https://www.sqlite.org/2015/sqlite-amalgamation-3081101.zip
unzip sqlite-amalgamation-3081101.zip

mv sqlite-amalgamation-3081101 /poa/data/subversion-1.14.3/sqlite-amalgamation

cd /poa/data/subversion-1.14.3
./configure --prefix=/poa/svn
make
sudo make install

export PATH=/poa/svn/bin:$PATH

svn --version

sudo ss -tulnp | grep 9876

sudo /poa/svn/bin/svnadmin create /poa/svn/poarepo

/poa/svn/bin/svnserve -d -r /poa/svn/poarepo --listen-port 9876

sudo nano /etc/systemd/system/svn.service

sudo systemctl daemon-reload
sudo systemctl enable svn
sudo systemctl restart svn
sudo systemctl status svn

sudo chmod -R 777 /poa/svn/poarepo

svn://10.100.100.137:9876/poa-web

자세한 설명

  1. 패키지 업데이트 및 설치
    • apt update 명령어로 패키지 리스트를 최신 상태로 갱신합니다.
    • Subversion(이하 SVN)을 소스에서 빌드하기 위해 필요한 라이브러리와 헤더 파일(build-essential, libapr1-dev 등)을 설치합니다.
  2. Subversion 소스 다운로드
    • /poa/data 디렉터리로 이동 후, Subversion 1.14.3 버전의 소스 코드를 다운로드합니다.
    • 다운로드한 tar.gz 파일을 압축 해제하고, 그 디렉터리로 이동합니다.
  3. SQLite 다운로드
    • Subversion은 내부적으로 SQLite를 사용합니다.
    • 적절한 버전의 SQLite 코드(sqlite-amalgamation-3081101)를 다운로드해 압축을 풉니다.
  4. SQLite를 Subversion 디렉터리에 이동
    • Subversion 빌드 시 참고할 수 있도록, SQLite 소스 코드를 Subversion 소스 트리 내의 sqlite-amalgamation 디렉터리로 이동합니다.
  5. Subversion 빌드 및 설치
    • configure 스크립트를 이용하여 빌드 환경을 설정합니다. --prefix=/poa/svn 옵션은 Subversion이 /poa/svn 경로에 설치되도록 하는 설정입니다.
    • make 명령어로 소스 코드를 빌드한 뒤, sudo make install으로 실제 파일들을 /poa/svn 디렉터리에 설치합니다.
  6. 환경변수 설정
    • PATH 환경변수에 Subversion 실행 파일들이 들어있는 /poa/svn/bin 디렉터리를 추가하여, 터미널에서 svn 명령어를 바로 사용할 수 있게 합니다.
  7. Subversion 버전 확인
    • Subversion이 정상적으로 설치되었는지, 그리고 설치된 버전이 맞는지 확인합니다.
  8. 포트 확인
    • ss -tulnp로 현재 열려 있는 TCP/UDP 소켓을 확인하고, grep 9876으로 9876 포트 사용 여부를 확인합니다.
    • Subversion 서버가 이 포트를 사용할 계획이므로 사전에 비어 있는지 등을 확인할 수 있습니다.
  9. SVN 리포지토리 생성
    • /poa/svn/poarepo라는 이름으로 새로운 SVN 리포지토리를 생성합니다.
    • svnadmin create 명령어를 사용하면 SVN 저장소 디렉터리가 만들어지고, 필요한 구조가 생성됩니다.
  10. SVN 서버 실행
    • svnserve를 데몬(-d) 모드로 실행합니다.
    • -r /poa/svn/poarepo 옵션으로 리포지토리 기본 경로를 /poa/svn/poarepo로 지정하고, --listen-port 옵션으로 9876 포트를 사용합니다.
  11. Systemd 서비스 파일 생성 및 설정
    • nano 편집기를 사용하여 /etc/systemd/system/svn.service 파일을 열어, SVN 서버를 systemd 서비스로 등록할 수 있도록 설정 파일을 작성합니다.
    • 일반적으로 svn.service 파일에는 [Unit], [Service], [Install] 섹션 등을 작성해, 위에서 명령했던 svnserve가 systemd로 관리되도록 설정합니다.
  12. Systemd 서비스 리로드 및 활성화
    • daemon-reload로 systemd가 새 서비스 파일을 인식하도록 합니다.
    • enable로 부팅 시 자동으로 SVN 서버가 시작되도록 설정합니다.
    • restart 명령어로 서비스를 재시작하고, status로 현재 상태를 확인합니다.
  13. 리포지토리 권한 설정
    • 리포지토리 디렉터리 전체에 대해 읽기/쓰기/실행 권한을 모두 부여합니다. (테스트 환경에서는 편할 수 있지만, 실제 운영 환경에서는 보안상 문제가 될 수 있으므로 주의가 필요합니다.)
  14. SVN 리포지토리 접근
    • 로컬 네트워크 혹은 서버 환경에서 SVN 클라이언트를 통해 10.100.100.137 서버의 9876 포트로 접근하여, poa-web 리포지토리를 사용할 수 있습니다.
    • 위 주소는 예시이므로 실제 환경에 맞게 변경할 수 있습니다.
wget https://dlcdn.apache.org/maven/maven-3/3.9.4/binaries/apache-maven-3.9.4-bin.tar.gz

sudo tar -zxvf apache-maven-3.9.4-bin.tar.gz -C /poa
sudo mv /poa/apache-maven-3.9.4 /poa/maven


sudo nano /etc/profile.d/maven.sh
 > export M2_HOME=/poa/maven
 > export PATH=$M2_HOME/bin:$PATH

source /etc/profile.d/maven.sh

mvn clean install

자세한 설명

  1. Maven 다운로드
    • Apache Maven의 3.9.4 버전 바이너리 압축 파일(.tar.gz)을 다운로드합니다.
    • Maven은 Java 프로젝트를 관리하고 빌드할 때 널리 사용되는 빌드 툴입니다.
  2. 압축 해제 및 디렉터리 이동
    • 다운로드한 압축 파일을 /poa 경로로 해제합니다(-C /poa).
    • 해제 후 생긴 디렉터리 apache-maven-3.9.4를 /poa/maven으로 이름 변경합니다.
    • 결과적으로 Maven의 설치 경로는 /poa/maven이 됩니다.
  3. 환경 변수 설정 스크립트 작성
    • maven.sh라는 이름의 스크립트 파일을 생성(또는 열기)하여, 다음 내용을 추가합니다:
    • bash
      복사편집
      export M2_HOME=/poa/maven export PATH=$M2_HOME/bin:$PATH
    • /etc/profile.d 내의 스크립트는 로그인 시 자동으로 실행되어 시스템 전역의 환경 변수를 설정할 수 있습니다.
  4. 설정 적용
    • 지금 터미널 세션에서만 즉시 환경 변수를 적용하기 위해 source 명령어를 사용합니다.
    • 이후에는 새로 로그인하거나 새 터미널을 열었을 때도 자동으로 /etc/profile.d/maven.sh가 실행되어 Maven 경로가 잡히게 됩니다.
  5. Maven 프로젝트 빌드
    • Maven 프로젝트 디렉터리 안에서 이 명령을 실행하면, pom.xml 설정에 따라 프로젝트를 클린 빌드(기존 빌드 산출물 제거 후 다시 빌드)하고, 모든 의존성 패키지 다운로드 후 테스트 및 설치 단계를 진행합니다.
    • 프로젝트마다 필요한 라이브러리를 자동으로 내려받고, 컴파일, 패키징, 테스트 등을 일괄적으로 수행합니다.

3. Nexus(혹은 Artifactory 등) 저장소

  • 빌드 결과물을 내부 Repository로 관리하려면 필요
  • Maven이 빌드한 아티팩트(JAR, WAR 등)를 업로드·배포할 저장소이기 때문에
  • SVN, Maven 설치 후 “Nexus에 빌드된 산출물을 배포”하는 구조가 될 수 있습니다.
    • 그래서 보통 SVN, Maven 다음에 Nexus 설치가 논리적으로 이어집니다.
wget https://download.sonatype.com/nexus/3/nexus-3.30.1-01-unix.tar.gz
tar -zxvf nexus-3.30.1-01-unix.tar.gz
sudo mv nexus-3.30.1-01 /poa/nexus
sudo mv sonatype-work /poa/sonatype-work

sudo chown -R poa:poa /poa/nexus
sudo chown -R poa:poa /poa/sonatype-work

sudo nano /poa/nexus/bin/nexus.rc

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

vi /poa/sonatype-work/nexus3/etc/nexus.properties

sudo nano /poa/nexus/etc/nexus-default.properties

sudo systemctl enable nexus
sudo systemctl start nexus
sudo systemctl status nexus

자세한 설명

  1. Nexus 다운로드 및 압축 해제
    • Sonatype Nexus(3.30.1 버전)를 다운로드하고 압축을 풉니다.
    • 압축 해제 후 생성된 nexus-3.30.1-01 디렉터리를 /poa/nexus로, sonatype-work 디렉터리를 /poa/sonatype-work로 이동합니다.
    • 이렇게 하면 Nexus 실행 관련 파일은 /poa/nexus, 데이터(저장소, 설정파일) 등은 /poa/sonatype-work에 위치하게 됩니다.
  2. 소유권 변경
    • Nexus 실행 계정(예: poa)으로 /poa/nexus와 /poa/sonatype-work 디렉터리의 소유권을 변경합니다.
    • 이로써 Nexus가 파일을 읽고 쓸 수 있도록 적절한 권한을 갖게 합니다.
  3. Nexus 설정 파일(nexus.rc) 수정
    • 일반적으로 nexus.rc 파일 안에는 run_as_user 환경변수를 설정하는 내용이 있습니다.
    • 예: run_as_user="poa"
    • Nexus가 어떤 사용자 계정으로 동작할지를 지정할 수 있습니다.
  4. Systemd 서비스 파일 생성(nexus.service)
    • Systemd를 통해 Nexus를 서비스(데몬)로 관리하기 위해 서비스 파일을 작성합니다.
    • 예시 내용(참고용):
    • ini
      복사편집
      [Unit] Description=nexus service After=network.target [Service] Type=forking LimitNOFILE=65536 User=poa Group=poa ExecStart=/poa/nexus/bin/nexus start ExecStop=/poa/nexus/bin/nexus stop Restart=on-abort [Install] WantedBy=multi-user.target
    • 작성 후 저장하면, systemd가 Nexus를 systemctl 명령어로 제어할 수 있게 됩니다.
  5. 포트 및 Nexus 속성 설정(nexus.properties, nexus-default.properties 등)
    • vi /poa/sonatype-work/nexus3/etc/nexus.properties
    • sudo nano /poa/nexus/etc/nexus-default.properties
    • Nexus가 사용할 포트(기본 8081), 호스트 IP, 데이터 디렉터리 위치 등을 이 파일(들)에 설정할 수 있습니다.
    • 예시(기본 포트 변경 시):
    • ini
      복사편집
      application-port=8081 application-host=0.0.0.0
    • 필요에 따라 HTTPS 설정, Reverse Proxy 설정 등을 진행할 때도 이 파일들을 수정합니다.
  6. Nexus 서비스 활성화 및 실행
    • systemctl enable nexus로 서버 부팅 시 자동으로 Nexus가 실행되도록 설정합니다.
    • systemctl start nexus로 Nexus 서비스를 실행하고, systemctl status nexus로 현재 상태를 확인합니다.
    • 실행 후 Nexus 콘솔 로깅(/poa/sonatype-work/nexus3/log) 등을 통해 문제가 없는지 확인할 수 있습니다.

4. CI/CD 툴 (Jenkins)

  • Jenkins가 Maven 빌드를 실행하고, SVN에서 코드를 체크아웃하여 Nexus로 올리는 파이프라인을 구성
  • 따라서 Jenkins 설치 시점에는 SVN, Maven, Nexus가 이미 구축돼 있으면 세팅이 쉬워집니다.
    • Jenkins → SVN(코드 가져오기) → Maven(빌드) → Nexus(결과물 저장)
  • Jenkins 이후에는 DB나 WAS와 연동해서 자동 배포 파이프라인을 확장할 수 있습니다.
wget https://get.jenkins.io/war-stable/latest/jenkins.war -P /poa/

java -jar /poa/jenkins.war --httpPort=9878

sudo nano /etc/systemd/system/jenkins.service

[Unit]
Description=Jenkins Daemon
After=network.target

[Service]
User=poa
WorkingDirectory=/poa
Restart=always
Environment="JAVA_HOME=/poa/java/jdk-17.0.2"
Environment="PATH=/poa/java/jdk-17.0.2/bin:/usr/bin:/bin"
ExecStart=/poa/java/jdk-17.0.2/bin/java -DJENKINS_HOME=/poa/jenkins -jar /poa/jenkins.war --httpPort=9878
Environment="JENKINS_HOME=/poa/jenkins"

[Install]
WantedBy=multi-user.target

sudo systemctl daemon-reload
sudo systemctl start jenkins
sudo systemctl enable jenkins

자세한 설명

  1. Jenkins WAR 파일 다운로드
    • 최신 안정 버전(Stale Release)의 Jenkins WAR 파일을 /poa/ 디렉터리에 다운로드합니다.
  2. Jenkins 수동 실행 (테스트용)
    • 다운로드 받은 jenkins.war를 직접 실행하며, 9878 포트를 통해 접근 가능하도록 설정합니다.
    • 이 상태에서 브라우저로 http://<서버IP>:9878에 접속하면 Jenkins 설치 마법사(초기 설정 페이지)에 접속할 수 있습니다.
    • 단, 이렇게 실행하면 현재 터미널 세션에 종속되므로, 터미널을 닫으면 Jenkins가 중단됩니다.
  3. Systemd 서비스 파일 생성
    • jenkins.service라는 systemd 유닛 파일을 생성(또는 열기)합니다.
    • 작성 예시(사용자 제공 내용):
    • ini
      복사편집
      [Unit] Description=Jenkins Daemon After=network.target [Service] User=poa WorkingDirectory=/poa Restart=always Environment="JAVA_HOME=/poa/java/jdk-17.0.2" Environment="PATH=/poa/java/jdk-17.0.2/bin:/usr/bin:/bin" ExecStart=/poa/java/jdk-17.0.2/bin/java -DJENKINS_HOME=/poa/jenkins -jar /poa/jenkins.war --httpPort=9878 Environment="JENKINS_HOME=/poa/jenkins" [Install] WantedBy=multi-user.target
    • 주요 설정:
      • User=poa: Jenkins 프로세스를 poa 계정으로 실행합니다.
      • WorkingDirectory=/poa: Jenkins 프로세스가 동작할 기본 디렉터리입니다.
      • Restart=always: 프로세스가 종료되면 자동 재시작하도록 설정합니다.
      • Environment: JAVA_HOME, PATH, JENKINS_HOME 등 필수 환경 변수를 설정합니다.
      • ExecStart: Jenkins를 실행하는 실제 명령어입니다. -DJENKINS_HOME=/poa/jenkins 옵션을 통해 Jenkins 홈 디렉터리를 /poa/jenkins로 지정하고, --httpPort=9878로 포트를 설정합니다.
  4. Systemd 데몬 재로드
    • 새로 생성한 jenkins.service 파일을 systemd가 인식할 수 있도록 데몬 정보를 재로드합니다.
  5. Jenkins 서비스 시작 및 활성화
    • Jenkins 서비스를 바로 시작하고, 서버 부팅 시 자동으로 실행되도록 활성화(enable)합니다.
  6. 접속 확인
    • 브라우저에서 http://<서버 IP 또는 도메인>:9878로 접속해서, Jenkins 초기 설정 화면을 확인합니다.
    • 최초 실행 시 /poa/jenkins 폴더 내에 initialAdminPassword 파일이 생성되며, 그 암호를 통해 Administrator 계정 초기 설정을 진행할 수 있습니다.

5. DB (Database)

  • DB가 필요없는 애플리케이션이라면 건너뛸 수 있지만, 실제로는 WAS나 애플리케이션 구동 테스트 시 DB 연결이 필요한 경우가 많습니다.
  • 예시:
    • MariaDB, MySQL, PostgreSQL, Oracle 등 원하는 DB 설치
    • DB 계정·스키마 생성
  • WAS 설치 전에 DB가 준비돼 있으면, WAS 설정 시 JDBC 연동, 환경설정 파일(application.yml, server.xml 등)에서 DB URL을 바로 입력해 테스트할 수 있습니다.
cd /poa/data
wget https://downloads.mariadb.com/MariaDB/mariadb-10.11.4/source/mariadb-10.11.4.tar.gz
tar -xvzf mariadb-10.11.4.tar.gz
mv mariadb-10.11.4 /poa/server/db

sudo apt update
sudo apt install cmake gcc g++ libncurses5-dev bison -y

cd /poa/server/db/mariadb-10.11.4
cmake -DCMAKE_INSTALL_PREFIX=/poa/server/db/mariadb
make
sudo make install

mkdir -p /poa/server/db/mariadb/etc
nano /poa/server/db/mariadb/etc/my.cnf
[mysqld]
port = 9880
basedir = /poa/server/db/mariadb
datadir = /poa/server/db/mariadb/data
socket = /poa/server/db/mariadb/mariadb.sock
log-error = /poa/server/db/mariadb/logs/mariadb.err
pid-file = /poa/server/db/mariadb/mariadb.pid
[client]
socket = /poa/server/db/mariadb/mariadb.sock

mkdir -p /poa/server/db/mariadb/data
mkdir -p /poa/server/db/mariadb/logs

/poa/server/db/mariadb/scripts/mysql_install_db --user=poa --basedir=/poa/server/db/mariadb --datadir=/poa/server/db/mariadb/data
sudo -u poa /poa/server/db/mariadb/bin/mysqld_safe --defaults-file=/poa/server/db/mariadb/etc/my.cnf --datadir=/poa/server/db/mariadb/data &

/poa/server/db/mariadb/bin/mysql_secure_installation --socket=/poa/server/db/mariadb/mariadb.sock

/poa/server/db/mariadb/bin/mysql -u root -p --socket=/poa/server/db/mariadb/mariadb.sock

자세한 설명

  1. 소스 파일 다운로드 및 준비
    • /poa/data 폴더로 이동한 뒤, mariadb-10.11.4 소스를 다운로드하고 압축을 해제합니다.
    • 압축 해제 후 폴더명을 /poa/server/db/mariadb-10.11.4로 옮겨 둡니다.
  2. 빌드에 필요한 패키지 설치
    • Mariadb(또는 MySQL) 소스 빌드에 필요한 cmake, gcc, g++, ncurses, bison 등을 설치합니다.
  3. MariaDB 빌드 및 설치
    • cmake 실행 시 -DCMAKE_INSTALL_PREFIX 옵션을 통해 MariaDB 설치 경로를 /poa/server/db/mariadb로 지정합니다.
    • make 명령어로 소스를 빌드하고, sudo make install으로 해당 경로에 설치합니다.
  4. 설정 파일 작성(my.cnf)
    • my.cnf에 다음과 같은 설정을 추가할 수 있습니다:
    • ini
      복사편집
      [mysqld] port = 9880 basedir = /poa/server/db/mariadb datadir = /poa/server/db/mariadb/data socket = /poa/server/db/mariadb/mariadb.sock log-error = /poa/server/db/mariadb/logs/mariadb.err pid-file = /poa/server/db/mariadb/mariadb.pid [client] socket = /poa/server/db/mariadb/mariadb.sock
    • mysqld 섹션에서는 포트(9880), 설치 경로(basedir), 데이터 디렉터리(datadir), 소켓 경로 등을 지정합니다.
    • client 섹션에서는 클라이언트가 사용할 소켓 경로를 동일하게 맞춰줘야 합니다.
  5. 데이터 및 로그 디렉터리 생성
    • 데이터베이스 파일 및 로그 파일을 저장할 디렉터리를 미리 만들어 둡니다.
  6. DB 초기화
    • MariaDB를 처음 사용할 때 필요한 시스템 테이블 등을 생성합니다.
    • --user=poa는 데이터베이스를 실행할 계정(사용자)을 지정합니다.
    • --basedir 및 --datadir를 앞서 지정한 경로와 동일하게 맞춰줍니다.
  7. MariaDB 서버 실행
    • mysqld_safe 스크립트를 이용해 MariaDB 서버를 백그라운드(&)에서 실행합니다.
    • sudo -u poa는 poa 사용자로 프로세스를 실행하겠다는 의미입니다.
    • --defaults-file 옵션에 우리가 생성한 my.cnf 파일 경로를 지정하여, 해당 설정을 적용합니다.
  8. 보안 설정(mysql_secure_installation)
    • 기본 root 암호 설정, 익명 사용자 삭제, 원격 root 접속 차단 등 보안 관련 설정을 간편하게 해주는 스크립트입니다.
    • --socket 옵션으로 우리가 지정한 소켓 경로를 설정하여 로컬로 연결합니다.
  9. MariaDB 접속 확인
    • 설정한 root 암호를 사용하여 MariaDB에 접속합니다.
    • 접속 후 show databases; 등의 명령을 통해 정상 작동 여부를 확인할 수 있습니다.

6. WAS (Web Application Server)

  • 예: Tomcat, WildFly, WebSphere, JEUS
  • DB가 준비된 상태에서 WAS의 데이터소스, 또는 Spring Boot 앱 배포 시 DB 연결 테스트가 가능
  • “WAS → DB” 연결이 정상 동작하는지 확인 후, 애플리케이션(WAR/JAR) 배포를 진행
cd /poa/data
wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.97/bin/apache-tomcat-9.0.97.tar.gz
tar -xvzf apache-tomcat-9.0.97.tar.gz
mv apache-tomcat-9.0.97 /poa/server/was/tomcat-9.0.97

nano /poa/server/was/tomcat-9.0.97/conf/server.xml

/poa/server/was/tomcat-9.0.97/bin/startup.sh

자세한 설명

  1. Tomcat 9.0.97 다운로드 및 압축 해제
    • /poa/data 디렉터리로 이동한 뒤, Tomcat 9.0.97 버전을 다운로드합니다.
    • 다운로드한 파일(apache-tomcat-9.0.97.tar.gz)을 압축 해제합니다.
    • 압축 해제 후 폴더명을 /poa/server/was/tomcat-9.0.97로 이동·정리합니다.
  2. 서버 설정 파일(server.xml) 수정
    • Tomcat의 주요 설정(포트, 커넥터, 리스너 등)은 conf/server.xml에서 변경할 수 있습니다.
    • 예를 들어, 기본 HTTP 포트(8080)를 다른 포트로 바꾸거나, AJP 커넥터(8009) 설정을 변경할 때 이 파일을 수정합니다.
    • 필요에 따라 <Connector port="8080" ... /> 부분 등을 원하는 값으로 변경한 뒤 저장합니다.
  3. Tomcat 서버 실행
    • Tomcat을 백그라운드에서 실행하는 스크립트입니다.
    • 실행 후 브라우저에서 http://<서버IP나도메인>:포트번호/ 로 접속하면 Tomcat 기본 페이지가 표시됩니다.
    • 기본 포트(8080)를 그대로 두었다면 http://<서버IP>:8080으로 접근 가능합니다.

7. Web Server (Apache, Nginx 등)

  • 보통 Reverse ProxySSL 종료(HTTPS) 용도로 많이 사용
  • WAS 앞단에 “로드밸런싱” 또는 “정적 리소스 제공” 등을 담당
  • WAS가 먼저 깔려있어야, Web 서버에서 ProxyPass나 Nginx 설정을 해서 리다이렉트/프록시 기능을 쓸 수 있습니다.
  • 한편, 개발/테스트 환경에서는 굳이 Web 서버 없이 WAS 단독(Tomcat의 HTTP 포트)으로 쓰기도 합니다.
cd /poa/da
wget https://downloads.apache.org/httpd/httpd-2.4.62.tar.gz
tar -xvzf httpd-2.4.62.tar.gz
mv httpd-2.4.62 /poa/server/web/apache

cd /poa/server/web/apache
./configure --prefix=/poa/server/web --enable-ssl --enable-so
make
sudo make install

/poa/server/web/bin/apachectl start

자세한 설명

  1. Apache HTTP Server 소스 다운로드 및 압축 해제
    • /poa/da 디렉터리로 이동 후, httpd-2.4.62.tar.gz를 다운로드합니다.
    • 다운로드된 파일을 해제(tar -xvzf)한 뒤, /poa/server/web/apache로 디렉터리명을 변경합니다.
  2. Apache HTTP Server 빌드
    • configure 스크립트를 이용해 빌드 환경을 설정합니다.
    • --prefix=/poa/server/web 옵션을 사용하면 Apache가 /poa/server/web 경로에 설치됩니다.
    • --enable-ssl은 SSL 모듈(HTTPS 기능)을 활성화하고, --enable-so는 동적 모듈 로딩(so 모듈)을 사용할 수 있도록 설정합니다.
    • make 명령으로 컴파일을 진행한 후, sudo make install으로 설치합니다.
  3. Apache 서버 구동
    • 설치가 완료되면 /poa/server/web/bin/apachectl 스크립트를 사용해 Apache를 시작합니다.
    • 웹 브라우저에서 http://<서버 IP>:80 (기본 포트가 80으로 설정되었을 경우)로 접속했을 때 Apache 테스트 페이지가 뜨면 정상 실행된 것입니다.

8. 실제 운영/배포 시나리오 예시

  1. (OS 세팅) → Maven, SVN
    • 코드 버전 관리, 빌드 도구 준비
  2. Nexus
    • 빌드 산출물 저장소
  3. Jenkins
    • 빌드 & 배포 자동화 (SVN → Maven → Nexus 파이프라인)
  4. DB 설치
    • DB 계정/권한/스키마 생성
  5. WAS 설치
    • DB 연동 설정, 애플리케이션(WAR/JAR) 배포
    • Jenkins 파이프라인에서 빌드 결과물을 WAS에 자동 배포
  6. Web Server 설치(아파치, Nginx)
    • 최종 외부 트래픽 수신, HTTPS(SSL) 적용, 프록시 → WAS 로 트래픽 전달
주의: 실제로는 회사마다 시스템 정책, 네트워크 구조, 서버 리소스 배치에 따라 순서가 달라질 수 있습니다. “무조건 이 순서”라기보다는,

빌드→배포→운영 흐름에 맞춰 개발/CI/CD 도구(SVN, Maven, Jenkins, Nexus) 먼저,
애플리케이션 구동에 필요한 DB & WAS,
최종 외부 서비스용 Web 서버 순으로 가는 것이 일반적입니다.

Tomcat에서 MariaDB에 접속하기 위해 JDBC 드라이버를 Tomcat lib 폴더에 두고, context.xml에 데이터소스(JNDI) 정보를 설정하는 과정입니다.

  • JDBC 드라이버를 추가함으로써, Tomcat이 MariaDB에 연결할 때 필요한 클래스( org.mariadb.jdbc.Driver )를 인식할 수 있게 됩니다.
  • context.xml의 <Resource> 설정을 통해, 웹 애플리케이션은 java:comp/env/jdbc/MyDB라는 JNDI 이름으로 DB 커넥션을 받아올 수 있습니다.
  • 이렇게 하면 각 애플리케이션에서 따로 DB 접속 정보를 관리할 필요 없이, 서버(Tomcat) 레벨에서 통합 관리되어 편리하고 안전합니다.
wget https://downloads.mariadb.com/Connectors/java/connector-java-3.2.0/mariadb-java-client-3.2.0.jar

mv mariadb-java-client-3.2.0.jar /poa/server/was/tomcat-9.0.97/lib/mariadb-java-client-3.2.0.jar

nano /poa/server/was/tomcat-9.0.97/conf/context.xml

<Resource name="jdbc/MyDB"
          auth="Container"
          type="javax.sql.DataSource"
          maxTotal="20"
          maxIdle="10"
          username="your_db_user"
          password="your_db_password"
          driverClassName="org.mariadb.jdbc.Driver"
          url="jdbc:mariadb://localhost:3306/your_database_name"/>

/poa/server/web/bin/apachectl start

/poa/server/was/bin/startup.sh

/poa/server/db/mariadb/bin/mysqld_safe --datadir=/poa/server/db/mariadb/data &

자세한 설명

  1. MariaDB JDBC 드라이버(JAR) 다운로드 및 배치
    • 최신 버전의 MariaDB Java Connector(JDBC 드라이버)를 다운로드한 뒤, Tomcat의 lib 디렉터리에 배치합니다.
    • 이 JAR 파일이 Tomcat 내부에서 동작하는 웹 애플리케이션들이 org.mariadb.jdbc.Driver를 사용할 수 있게 해줍니다.
  2. Tomcat context.xml 설정
    • Tomcat의 context.xml에 데이터 소스 리소스를 등록합니다.
    • name="jdbc/MyDB"는 JNDI 리소스 이름이며, 애플리케이션에서 java:comp/env/jdbc/MyDB 형태로 참조할 수 있습니다.
    • username, password는 DB 접속 정보이며, driverClassName과 url을 통해 MariaDB에 접속할 드라이버와 URL을 지정합니다.
    • maxTotal, maxIdle 등은 커넥션 풀 관련 설정으로, 최대 연결 수, 유휴(Idle) 연결 수를 제한합니다.
  3. 서버 실행 순서 예시
    • Apache(apachectl start), Tomcat(startup.sh), MariaDB(mysqld_safe) 순으로 서비스를 시작하고 있습니다.
    • 실제 운영환경에서는 보통 DB가 먼저 구동되고, Tomcat(또는 WAS)이 다음에 구동되며, Apache가 가장 마지막에 구동되는 경우가 많습니다. (즉, DB → WAS → Web 순서)
      • 하지만 여기서는 명령어를 예시로 보여준 것일 수 있으므로, 순서는 상황에 맞게 조정하시기 바랍니다.
    • MariaDB를 실행할 때 --datadir=/poa/server/db/mariadb/data 옵션으로 데이터가 저장될 경로를 지정하고 있습니다.
    • & 기호로 백그라운드에서 프로세스를 실행하도록 합니다.
  4. JNDI 데이터소스 사용
    • Tomcat이 실행된 뒤에는, 웹 애플리케이션 내에서 java:comp/env/jdbc/MyDB 리소스를 찾아 커넥션을 얻어올 수 있습니다.

이 설정( mod_jk )은 Apache 웹 서버Tomcat(Java 애플리케이션 서버)을 AJP 프로토콜로 연결해 주는 다리(브리지) 역할을 합니다.

  • 왜 필요한가?
    • Apache 웹 서버(HTTPD)는 정적인 컨텐츠(HTML, CSS, JS, 이미지)를 빠르게 제공하는 데 특화되어 있습니다.
    • Tomcat은 Java 기반 웹 애플리케이션을 구동하고 동적인 요청(서블릿, JSP 등)을 처리합니다.
    • 이 둘을 한 서버에서 함께 사용하거나, 외부에선 Apache만 공개하고 Tomcat은 내부에서만 동작하게 하려면 둘 사이를 연결할 방법이 필요합니다.
    • 그 연결을 담당하는 모듈이 mod_jk입니다.
  • 어떻게 동작하나?
    1. 사용자가 http://서버/tomcat/무언가 URL로 요청을 보냅니다.
    2. Apache는 JkMount 설정을 보고 /tomcat/으로 시작하는 경로는 mod_jk 모듈에게 처리하라고 넘깁니다.
    3. mod_jk는 AJP(8009 포트 등)를 통해 Tomcat으로 요청을 전달합니다.
    4. Tomcat이 요청을 처리한 뒤 응답을 Apache에 되돌려 주면, Apache가 최종적으로 클라이언트에게 전송합니다.

정리하면, mod_jk

  • Apache를 앞단에 두고, Tomcat은 뒤에서 애플리케이션 로직을 처리하도록 구성하고 싶을 때
  • 둘 간의 트래픽(요청/응답)을 AJP 프로토콜로 주고받도록 해 주는 연결 모듈입니다.
cd /poa/data
wget https://downloads.apache.org/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.50-src.tar.gz
tar -xvzf tomcat-connectors-1.2.50-src.tar.gz
cd tomcat-connectors-1.2.50-src/native
./buildconf.sh
./configure --with-apxs=/poa/server/web/bin/apxs
make
sudo make install

sudo nano /poa/server/web/conf/httpd.conf

LoadModule jk_module modules/mod_jk.so
JkWorkersFile /poa/server/web/conf/workers.properties
JkLogFile /poa/server/web/logs/mod_jk.log
JkLogLevel info
JkMount /tomcat/* ajp13_worker

sudo nano /poa/server/web/conf/workers.properties

worker.list=ajp13_worker
worker.ajp13_worker.type=ajp13
worker.ajp13_worker.host=localhost
worker.ajp13_worker.port=8009
"apachetomcatconn20241205"

자세한 설명

  1. mod_jk 소스 다운로드 및 압축 해제
    • Apache Tomcat과 Apache HTTP Server를 연동하기 위해 사용되는 mod_jk(AJP 커넥터)의 소스 코드(1.2.50 버전)를 다운로드하고 압축 해제합니다.
    • cd tomcat-connectors-1.2.50-src/native 명령어로 native 디렉터리로 이동합니다. 여기서 빌드를 진행합니다.
  2. 빌드 준비(buildconf.sh) 및 설정(configure)
    • ./buildconf.sh를 통해 빌드 환경을 설정합니다.
    • ./configure 스크립트에서 --with-apxs 옵션을 통해, mod_jk가 컴파일된 후 apxs(Apache eXtension tool)를 사용하여 Apache 모듈로 설치되도록 경로를 지정합니다.
    • /poa/server/web/bin/apxs는 이전에 Apache를 /poa/server/web 아래 설치했을 때 함께 생성된 apxs 바이너리 경로입니다.
  3. 컴파일 및 설치
    • make 명령어로 소스 코드를 컴파일합니다.
    • sudo make install을 통해 mod_jk.so 모듈이 Apache 모듈 디렉터리(modules/)로 복사됩니다.
    • 설치가 성공적으로 이루어지면 /poa/server/web/modules/mod_jk.so 등의 경로에 모듈이 위치하게 됩니다(설치 설정에 따라 디렉터리가 달라질 수 있음).
  4. Apache 설정 파일(httpd.conf) 수정
    • mod_jk 모듈을 Apache에서 사용하기 위해 httpd.conf에 로드 설정을 추가합니다.
      • LoadModule jk_module modules/mod_jk.so: 방금 설치한 모듈을 불러옵니다.
      • JkWorkersFile /poa/server/web/conf/workers.properties: AJP 워커 정보를 정의할 설정 파일의 위치를 지정합니다.
      • JkLogFile /poa/server/web/logs/mod_jk.log: mod_jk 관련 로깅을 저장할 로그 파일 경로를 지정합니다.
      • JkLogLevel info: 로그 레벨(verbosity)을 info로 설정합니다.
      • JkMount /tomcat/* ajp13_worker: /tomcat/으로 시작되는 URL 요청을 ajp13_worker라는 이름의 워커에게(AJP 프로토콜) 넘기도록 지정합니다.
  5. workers.properties 파일 생성
    • worker.list에는 사용할 워커들의 이름을 쉼표로 구분하여 나열합니다(여기서는 ajp13_worker만 하나 사용).
    • worker.ajp13_worker.type=ajp13는 AJP 버전 1.3 프로토콜을 사용한다는 의미입니다.
    • worker.ajp13_worker.host와 port 설정을 통해 Tomcat이 동작 중인 서버(호스트)와 AJP 포트(기본 8009)로 연결합니다.
    • Tomcat 서버 server.xml에서 <Connector port="8009" protocol="AJP/1.3" /> 부분이 활성화되어 있어야 합니다.
  6. Apache 재시작
    • 설정 파일을 수정한 후, Apache 서버를 재시작해야 적용됩니다.
    • 이제 브라우저에서 http://<서버IP 또는 도메인>/tomcat/으로 접근할 경우, Apache가 AJP를 통해 Tomcat으로 요청을 넘기고, Tomcat이 해당 응답을 다시 Apache에 전달하여 클라이언트로 전송합니다.

CREATE DATABASE poa_dev;

CREATE USER 'poa_dev'@'%' IDENTIFIED BY 'poa123';

GRANT ALL PRIVILEGES ON poa_dev.* TO 'poa_dev'@'%';

FLUSH PRIVILEGES;

SHOW DATABASES;

SELECT User, Host FROM mysql.user WHERE User = 'poa_dev';

SHOW GRANTS FOR 'poa_dev'@'%';

자세한 설명

  1. 데이터베이스 생성
    • poa_dev라는 이름의 새로운 데이터베이스를 생성합니다.
  2. 사용자 생성
    • poa_dev라는 사용자 계정을 만들고, 비밀번호를 poa123으로 설정합니다.
    • '%'는 호스트를 의미하며, %이면 모든 IP(어디서든)에서 접속할 수 있음을 허용합니다.
    • 로컬에서만 접속하도록 제한하고 싶다면 'localhost'로 지정할 수 있습니다.
  3. 권한 부여
    • 새로 만든 poa_dev 사용자에게 poa_dev 데이터베이스 내 모든 테이블(poa_dev.*)에 대한 모든 권한(ALL PRIVILEGES)을 부여합니다.
    • 예: SELECT, INSERT, UPDATE, DELETE, CREATE, DROP 등.
  4. 권한 적용
    • MySQL/MariaDB 서버가 현재 부여된 권한 정보를 즉시 다시 로드하도록 합니다.
    • 일반적으로 사용자 또는 권한 관련 변경 후에는 FLUSH PRIVILEGES;를 통해 권한 캐시를 다시 로드해 줍니다.
  5. 데이터베이스 목록 확인
    • 현재 서버에 존재하는 모든 데이터베이스 목록을 보여줍니다.
    • poa_dev가 잘 생성되었는지 확인할 수 있습니다.
  6. 사용자 정보 확인
    • mysql.user 테이블에서 'poa_dev' 사용자에 대한 정보(사용자명, 호스트)를 조회합니다.
    • 여기서 '%'라는 호스트 값이 잘 설정되었는지를 확인할 수 있습니다.
  7. 권한 정보 확인
    • 특정 사용자('poa_dev'@'%')가 어떤 권한을 가지고 있는지 확인합니다.
    • 위에서 GRANT ALL PRIVILEGES ON poa_dev.* 명령어를 내렸으므로, 결과로 GRANT ALL PRIVILEGES ON 'poa_dev'.* TO 'poa_dev'@'%' 같은 내용을 볼 수 있습니다.

CREATE DATABASE poa_ops;

CREATE USER 'poa_ops'@'%' IDENTIFIED BY 'poa123';

GRANT ALL PRIVILEGES ON poa_ops.* TO 'poa_ops'@'%';

FLUSH PRIVILEGES;

SHOW DATABASES;

SELECT User, Host FROM mysql.user WHERE User = 'poa_ops';

SHOW GRANTS FOR 'poa_ops'@'%';

자세한 설명

  1. 데이터베이스 생성
    • poa_ops라는 이름의 새로운 데이터베이스를 생성합니다.
  2. 사용자 생성
    • poa_ops 사용자 계정을 만들고, 비밀번호를 poa123으로 설정합니다.
    • '%'는 호스트를 의미하며, 어느 IP(어디에서나)에서든 이 사용자로 접속을 허용하도록 설정합니다.
  3. 권한 부여
    • poa_ops 사용자가 poa_ops 데이터베이스 내의 모든 테이블(poa_ops.*)에 대해 모든 권한(ALL PRIVILEGES)을 갖도록 설정합니다.
    • 예를 들어 INSERT, SELECT, UPDATE, DELETE, CREATE, DROP 등의 권한이 포함됩니다.
  4. 권한 적용
    • MySQL/MariaDB 서버가 현재 부여된 권한을 즉시 반영할 수 있도록 권한 캐시를 재로드합니다.
  5. 데이터베이스 목록 확인
    • 현재 서버에 생성된 모든 데이터베이스 목록을 표시합니다.
    • poa_ops 데이터베이스가 정상적으로 생성되었는지 확인할 수 있습니다.
  6. 사용자 정보 확인
    • mysql.user 시스템 테이블에서 'poa_ops' 사용자 정보(사용자명, 호스트)를 조회합니다.
    • 호스트가 '%'로 설정되어 있음이 확인됩니다.
  7. 권한 정보 확인
    • 'poa_ops'@'%' 사용자가 어떤 권한을 가지고 있는지 확인합니다.
    • 위에서 부여한 대로 GRANT ALL PRIVILEGES ON poa_ops.* TO 'poa_ops'@'%'와 같은 문구가 표시되어야 정상적으로 권한이 부여된 것입니다.