Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- 예외처리
- exception
- 환경설정
- 자바
- Java
- 컬렉션프레임워크
- 사용자예외클래스생성
- oracle
- 자동차수리시스템
- 컬렉션 타입
- 참조형변수
- 생성자오버로드
- NestedFor
- 대덕인재개발원
- 예외미루기
- 오라클
- 인터페이스
- 제네릭
- GRANT VIEW
- 집합_SET
- 객체 비교
- abstract
- cursor문
- 정수형타입
- 메소드오버로딩
- EnhancedFor
- 다형성
- 추상메서드
- 한국건설관리시스템
- 어윈 사용법
Archives
- Today
- Total
거니의 velog
리눅스 개발환경 세팅 본문
실무에서는 프로젝트 성격·배포 파이프라인 구성에 따라 좀 더 합리적인 순서를 정해놓고 설치·셋업을 진행합니다. 모든 구성요소가 서로 어느 정도 독립적이기 때문에, 순서가 바뀌어도 동작 자체는 가능합니다. 다만, 아래와 같은 실무적 추천 순서가 있습니다.
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
자세한 설명:
- sudo ufw status
- **ufw(Ubuntu Firewall)**의 현재 상태(활성화 여부, 규칙 등)를 확인하는 명령어입니다.
- 이 명령어를 통해, 현재 어떤 포트가 열려있는지, 방화벽 정책이 어떤지 등을 확인할 수 있습니다.
- 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 서버에서 필요한 서비스(프로그램)들이 해당 포트를 통해 외부와 통신할 수 있도록 허용해줍니다.
- sudo ufw allow 8009/tcp
- Apache Tomcat에서 AJP(Apache JServ Protocol) 등을 사용할 때 기본적으로 8009 포트를 사용하는데, 이를 허용합니다.
- tcp 프로토콜로 외부에서 접속할 수 있게 허용한다는 의미입니다.
- sudo ufw deny 9880/tcp, sudo ufw deny 8009/tcp
- 앞서 허용했던 9880/tcp와 8009/tcp를 이제 차단(deny)하겠다는 설정입니다.
- 테스트가 끝났으므로 WAS에 대한 직접 접속은 방지하고, 프록시나 다른 방식으로만 접근하도록 하겠다는 의도입니다.
- sudo ufw reload
- ufw 방화벽 규칙을 다시 로드(reload)하여, 방금 설정한 규칙들을 적용합니다.
- sudo netstat -tuln | grep 9881
- netstat 명령어를 사용하여 TCP/UDP 포트 별 Listen 상태를 확인하고, 그 결과 중에 9881이라는 문자열이 포함된 부분만 grep으로 필터링합니다.
- 9881 포트가 실제로 열려 있고, 어떤 프로세스가 사용 중인지 여부 등을 확인할 수 있습니다.
- -tuln 옵션:
- -t: TCP 소켓 정보만 표시
- -u: UDP 소켓 정보만 표시
- -l: Listening 중인 소켓만 표시
- -n: 호스트명 대신 IP, 포트번호 등 숫자로 된 정보를 표시
2. 버전 관리 시스템(SVN) & 빌드 도구(Maven)
- SVN(Subversion) 서버
- 코드 버전을 관리하기 위해 필요
- 이미 다른 서버에서 운용 중이면 건너뛸 수 있음
- 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
자세한 설명
- 패키지 업데이트 및 설치
- apt update 명령어로 패키지 리스트를 최신 상태로 갱신합니다.
- Subversion(이하 SVN)을 소스에서 빌드하기 위해 필요한 라이브러리와 헤더 파일(build-essential, libapr1-dev 등)을 설치합니다.
- Subversion 소스 다운로드
- /poa/data 디렉터리로 이동 후, Subversion 1.14.3 버전의 소스 코드를 다운로드합니다.
- 다운로드한 tar.gz 파일을 압축 해제하고, 그 디렉터리로 이동합니다.
- SQLite 다운로드
- Subversion은 내부적으로 SQLite를 사용합니다.
- 적절한 버전의 SQLite 코드(sqlite-amalgamation-3081101)를 다운로드해 압축을 풉니다.
- SQLite를 Subversion 디렉터리에 이동
- Subversion 빌드 시 참고할 수 있도록, SQLite 소스 코드를 Subversion 소스 트리 내의 sqlite-amalgamation 디렉터리로 이동합니다.
- Subversion 빌드 및 설치
- configure 스크립트를 이용하여 빌드 환경을 설정합니다. --prefix=/poa/svn 옵션은 Subversion이 /poa/svn 경로에 설치되도록 하는 설정입니다.
- make 명령어로 소스 코드를 빌드한 뒤, sudo make install으로 실제 파일들을 /poa/svn 디렉터리에 설치합니다.
- 환경변수 설정
- PATH 환경변수에 Subversion 실행 파일들이 들어있는 /poa/svn/bin 디렉터리를 추가하여, 터미널에서 svn 명령어를 바로 사용할 수 있게 합니다.
- Subversion 버전 확인
- Subversion이 정상적으로 설치되었는지, 그리고 설치된 버전이 맞는지 확인합니다.
- 포트 확인
- ss -tulnp로 현재 열려 있는 TCP/UDP 소켓을 확인하고, grep 9876으로 9876 포트 사용 여부를 확인합니다.
- Subversion 서버가 이 포트를 사용할 계획이므로 사전에 비어 있는지 등을 확인할 수 있습니다.
- SVN 리포지토리 생성
- /poa/svn/poarepo라는 이름으로 새로운 SVN 리포지토리를 생성합니다.
- svnadmin create 명령어를 사용하면 SVN 저장소 디렉터리가 만들어지고, 필요한 구조가 생성됩니다.
- SVN 서버 실행
- svnserve를 데몬(-d) 모드로 실행합니다.
- -r /poa/svn/poarepo 옵션으로 리포지토리 기본 경로를 /poa/svn/poarepo로 지정하고, --listen-port 옵션으로 9876 포트를 사용합니다.
- Systemd 서비스 파일 생성 및 설정
- nano 편집기를 사용하여 /etc/systemd/system/svn.service 파일을 열어, SVN 서버를 systemd 서비스로 등록할 수 있도록 설정 파일을 작성합니다.
- 일반적으로 svn.service 파일에는 [Unit], [Service], [Install] 섹션 등을 작성해, 위에서 명령했던 svnserve가 systemd로 관리되도록 설정합니다.
- Systemd 서비스 리로드 및 활성화
- daemon-reload로 systemd가 새 서비스 파일을 인식하도록 합니다.
- enable로 부팅 시 자동으로 SVN 서버가 시작되도록 설정합니다.
- restart 명령어로 서비스를 재시작하고, status로 현재 상태를 확인합니다.
- 리포지토리 권한 설정
- 리포지토리 디렉터리 전체에 대해 읽기/쓰기/실행 권한을 모두 부여합니다. (테스트 환경에서는 편할 수 있지만, 실제 운영 환경에서는 보안상 문제가 될 수 있으므로 주의가 필요합니다.)
- 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
자세한 설명
- Maven 다운로드
- Apache Maven의 3.9.4 버전 바이너리 압축 파일(.tar.gz)을 다운로드합니다.
- Maven은 Java 프로젝트를 관리하고 빌드할 때 널리 사용되는 빌드 툴입니다.
- 압축 해제 및 디렉터리 이동
- 다운로드한 압축 파일을 /poa 경로로 해제합니다(-C /poa).
- 해제 후 생긴 디렉터리 apache-maven-3.9.4를 /poa/maven으로 이름 변경합니다.
- 결과적으로 Maven의 설치 경로는 /poa/maven이 됩니다.
- 환경 변수 설정 스크립트 작성
- maven.sh라는 이름의 스크립트 파일을 생성(또는 열기)하여, 다음 내용을 추가합니다:
-
bash복사편집export M2_HOME=/poa/maven export PATH=$M2_HOME/bin:$PATH
- /etc/profile.d 내의 스크립트는 로그인 시 자동으로 실행되어 시스템 전역의 환경 변수를 설정할 수 있습니다.
- 설정 적용
- 지금 터미널 세션에서만 즉시 환경 변수를 적용하기 위해 source 명령어를 사용합니다.
- 이후에는 새로 로그인하거나 새 터미널을 열었을 때도 자동으로 /etc/profile.d/maven.sh가 실행되어 Maven 경로가 잡히게 됩니다.
- 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
자세한 설명
- Nexus 다운로드 및 압축 해제
- Sonatype Nexus(3.30.1 버전)를 다운로드하고 압축을 풉니다.
- 압축 해제 후 생성된 nexus-3.30.1-01 디렉터리를 /poa/nexus로, sonatype-work 디렉터리를 /poa/sonatype-work로 이동합니다.
- 이렇게 하면 Nexus 실행 관련 파일은 /poa/nexus, 데이터(저장소, 설정파일) 등은 /poa/sonatype-work에 위치하게 됩니다.
- 소유권 변경
- Nexus 실행 계정(예: poa)으로 /poa/nexus와 /poa/sonatype-work 디렉터리의 소유권을 변경합니다.
- 이로써 Nexus가 파일을 읽고 쓸 수 있도록 적절한 권한을 갖게 합니다.
- Nexus 설정 파일(nexus.rc) 수정
- 일반적으로 nexus.rc 파일 안에는 run_as_user 환경변수를 설정하는 내용이 있습니다.
- 예: run_as_user="poa"
- Nexus가 어떤 사용자 계정으로 동작할지를 지정할 수 있습니다.
- 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 명령어로 제어할 수 있게 됩니다.
- 포트 및 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 설정 등을 진행할 때도 이 파일들을 수정합니다.
- 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
자세한 설명
- Jenkins WAR 파일 다운로드
- 최신 안정 버전(Stale Release)의 Jenkins WAR 파일을 /poa/ 디렉터리에 다운로드합니다.
- Jenkins 수동 실행 (테스트용)
- 다운로드 받은 jenkins.war를 직접 실행하며, 9878 포트를 통해 접근 가능하도록 설정합니다.
- 이 상태에서 브라우저로 http://<서버IP>:9878에 접속하면 Jenkins 설치 마법사(초기 설정 페이지)에 접속할 수 있습니다.
- 단, 이렇게 실행하면 현재 터미널 세션에 종속되므로, 터미널을 닫으면 Jenkins가 중단됩니다.
- 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로 포트를 설정합니다.
- Systemd 데몬 재로드
- 새로 생성한 jenkins.service 파일을 systemd가 인식할 수 있도록 데몬 정보를 재로드합니다.
- Jenkins 서비스 시작 및 활성화
- Jenkins 서비스를 바로 시작하고, 서버 부팅 시 자동으로 실행되도록 활성화(enable)합니다.
- 접속 확인
- 브라우저에서 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
자세한 설명
- 소스 파일 다운로드 및 준비
- /poa/data 폴더로 이동한 뒤, mariadb-10.11.4 소스를 다운로드하고 압축을 해제합니다.
- 압축 해제 후 폴더명을 /poa/server/db/mariadb-10.11.4로 옮겨 둡니다.
- 빌드에 필요한 패키지 설치
- Mariadb(또는 MySQL) 소스 빌드에 필요한 cmake, gcc, g++, ncurses, bison 등을 설치합니다.
- MariaDB 빌드 및 설치
- cmake 실행 시 -DCMAKE_INSTALL_PREFIX 옵션을 통해 MariaDB 설치 경로를 /poa/server/db/mariadb로 지정합니다.
- make 명령어로 소스를 빌드하고, sudo make install으로 해당 경로에 설치합니다.
- 설정 파일 작성(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 섹션에서는 클라이언트가 사용할 소켓 경로를 동일하게 맞춰줘야 합니다.
- 데이터 및 로그 디렉터리 생성
- 데이터베이스 파일 및 로그 파일을 저장할 디렉터리를 미리 만들어 둡니다.
- DB 초기화
- MariaDB를 처음 사용할 때 필요한 시스템 테이블 등을 생성합니다.
- --user=poa는 데이터베이스를 실행할 계정(사용자)을 지정합니다.
- --basedir 및 --datadir를 앞서 지정한 경로와 동일하게 맞춰줍니다.
- MariaDB 서버 실행
- mysqld_safe 스크립트를 이용해 MariaDB 서버를 백그라운드(&)에서 실행합니다.
- sudo -u poa는 poa 사용자로 프로세스를 실행하겠다는 의미입니다.
- --defaults-file 옵션에 우리가 생성한 my.cnf 파일 경로를 지정하여, 해당 설정을 적용합니다.
- 보안 설정(mysql_secure_installation)
- 기본 root 암호 설정, 익명 사용자 삭제, 원격 root 접속 차단 등 보안 관련 설정을 간편하게 해주는 스크립트입니다.
- --socket 옵션으로 우리가 지정한 소켓 경로를 설정하여 로컬로 연결합니다.
- 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
자세한 설명
- Tomcat 9.0.97 다운로드 및 압축 해제
- /poa/data 디렉터리로 이동한 뒤, Tomcat 9.0.97 버전을 다운로드합니다.
- 다운로드한 파일(apache-tomcat-9.0.97.tar.gz)을 압축 해제합니다.
- 압축 해제 후 폴더명을 /poa/server/was/tomcat-9.0.97로 이동·정리합니다.
- 서버 설정 파일(server.xml) 수정
- Tomcat의 주요 설정(포트, 커넥터, 리스너 등)은 conf/server.xml에서 변경할 수 있습니다.
- 예를 들어, 기본 HTTP 포트(8080)를 다른 포트로 바꾸거나, AJP 커넥터(8009) 설정을 변경할 때 이 파일을 수정합니다.
- 필요에 따라 <Connector port="8080" ... /> 부분 등을 원하는 값으로 변경한 뒤 저장합니다.
- Tomcat 서버 실행
- Tomcat을 백그라운드에서 실행하는 스크립트입니다.
- 실행 후 브라우저에서 http://<서버IP나도메인>:포트번호/ 로 접속하면 Tomcat 기본 페이지가 표시됩니다.
- 기본 포트(8080)를 그대로 두었다면 http://<서버IP>:8080으로 접근 가능합니다.
7. Web Server (Apache, Nginx 등)
- 보통 Reverse Proxy나 SSL 종료(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
자세한 설명
- Apache HTTP Server 소스 다운로드 및 압축 해제
- /poa/da 디렉터리로 이동 후, httpd-2.4.62.tar.gz를 다운로드합니다.
- 다운로드된 파일을 해제(tar -xvzf)한 뒤, /poa/server/web/apache로 디렉터리명을 변경합니다.
- Apache HTTP Server 빌드
- configure 스크립트를 이용해 빌드 환경을 설정합니다.
- --prefix=/poa/server/web 옵션을 사용하면 Apache가 /poa/server/web 경로에 설치됩니다.
- --enable-ssl은 SSL 모듈(HTTPS 기능)을 활성화하고, --enable-so는 동적 모듈 로딩(so 모듈)을 사용할 수 있도록 설정합니다.
- make 명령으로 컴파일을 진행한 후, sudo make install으로 설치합니다.
- Apache 서버 구동
- 설치가 완료되면 /poa/server/web/bin/apachectl 스크립트를 사용해 Apache를 시작합니다.
- 웹 브라우저에서 http://<서버 IP>:80 (기본 포트가 80으로 설정되었을 경우)로 접속했을 때 Apache 테스트 페이지가 뜨면 정상 실행된 것입니다.
8. 실제 운영/배포 시나리오 예시
- (OS 세팅) → Maven, SVN
- 코드 버전 관리, 빌드 도구 준비
- Nexus
- 빌드 산출물 저장소
- Jenkins
- 빌드 & 배포 자동화 (SVN → Maven → Nexus 파이프라인)
- DB 설치
- DB 계정/권한/스키마 생성
- WAS 설치
- DB 연동 설정, 애플리케이션(WAR/JAR) 배포
- Jenkins 파이프라인에서 빌드 결과물을 WAS에 자동 배포
- 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 &
자세한 설명
- MariaDB JDBC 드라이버(JAR) 다운로드 및 배치
- 최신 버전의 MariaDB Java Connector(JDBC 드라이버)를 다운로드한 뒤, Tomcat의 lib 디렉터리에 배치합니다.
- 이 JAR 파일이 Tomcat 내부에서 동작하는 웹 애플리케이션들이 org.mariadb.jdbc.Driver를 사용할 수 있게 해줍니다.
- 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) 연결 수를 제한합니다.
- 서버 실행 순서 예시
- Apache(apachectl start), Tomcat(startup.sh), MariaDB(mysqld_safe) 순으로 서비스를 시작하고 있습니다.
- 실제 운영환경에서는 보통 DB가 먼저 구동되고, Tomcat(또는 WAS)이 다음에 구동되며, Apache가 가장 마지막에 구동되는 경우가 많습니다. (즉, DB → WAS → Web 순서)
- 하지만 여기서는 명령어를 예시로 보여준 것일 수 있으므로, 순서는 상황에 맞게 조정하시기 바랍니다.
- MariaDB를 실행할 때 --datadir=/poa/server/db/mariadb/data 옵션으로 데이터가 저장될 경로를 지정하고 있습니다.
- & 기호로 백그라운드에서 프로세스를 실행하도록 합니다.
- 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입니다.
- 어떻게 동작하나?
- 사용자가 http://서버/tomcat/무언가 URL로 요청을 보냅니다.
- Apache는 JkMount 설정을 보고 /tomcat/으로 시작하는 경로는 mod_jk 모듈에게 처리하라고 넘깁니다.
- mod_jk는 AJP(8009 포트 등)를 통해 Tomcat으로 요청을 전달합니다.
- 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"
자세한 설명
- mod_jk 소스 다운로드 및 압축 해제
- Apache Tomcat과 Apache HTTP Server를 연동하기 위해 사용되는 mod_jk(AJP 커넥터)의 소스 코드(1.2.50 버전)를 다운로드하고 압축 해제합니다.
- cd tomcat-connectors-1.2.50-src/native 명령어로 native 디렉터리로 이동합니다. 여기서 빌드를 진행합니다.
- 빌드 준비(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 바이너리 경로입니다.
- 컴파일 및 설치
- make 명령어로 소스 코드를 컴파일합니다.
- sudo make install을 통해 mod_jk.so 모듈이 Apache 모듈 디렉터리(modules/)로 복사됩니다.
- 설치가 성공적으로 이루어지면 /poa/server/web/modules/mod_jk.so 등의 경로에 모듈이 위치하게 됩니다(설치 설정에 따라 디렉터리가 달라질 수 있음).
- 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 프로토콜) 넘기도록 지정합니다.
- mod_jk 모듈을 Apache에서 사용하기 위해 httpd.conf에 로드 설정을 추가합니다.
- 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" /> 부분이 활성화되어 있어야 합니다.
- 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'@'%';
자세한 설명
- 데이터베이스 생성
- poa_dev라는 이름의 새로운 데이터베이스를 생성합니다.
- 사용자 생성
- poa_dev라는 사용자 계정을 만들고, 비밀번호를 poa123으로 설정합니다.
- '%'는 호스트를 의미하며, %이면 모든 IP(어디서든)에서 접속할 수 있음을 허용합니다.
- 로컬에서만 접속하도록 제한하고 싶다면 'localhost'로 지정할 수 있습니다.
- 권한 부여
- 새로 만든 poa_dev 사용자에게 poa_dev 데이터베이스 내 모든 테이블(poa_dev.*)에 대한 모든 권한(ALL PRIVILEGES)을 부여합니다.
- 예: SELECT, INSERT, UPDATE, DELETE, CREATE, DROP 등.
- 권한 적용
- MySQL/MariaDB 서버가 현재 부여된 권한 정보를 즉시 다시 로드하도록 합니다.
- 일반적으로 사용자 또는 권한 관련 변경 후에는 FLUSH PRIVILEGES;를 통해 권한 캐시를 다시 로드해 줍니다.
-
데이터베이스 목록 확인
- 현재 서버에 존재하는 모든 데이터베이스 목록을 보여줍니다.
- poa_dev가 잘 생성되었는지 확인할 수 있습니다.
- 사용자 정보 확인
- mysql.user 테이블에서 'poa_dev' 사용자에 대한 정보(사용자명, 호스트)를 조회합니다.
- 여기서 '%'라는 호스트 값이 잘 설정되었는지를 확인할 수 있습니다.
- 권한 정보 확인
- 특정 사용자('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'@'%';
자세한 설명
- 데이터베이스 생성
- poa_ops라는 이름의 새로운 데이터베이스를 생성합니다.
- 사용자 생성
- poa_ops 사용자 계정을 만들고, 비밀번호를 poa123으로 설정합니다.
- '%'는 호스트를 의미하며, 어느 IP(어디에서나)에서든 이 사용자로 접속을 허용하도록 설정합니다.
- 권한 부여
- poa_ops 사용자가 poa_ops 데이터베이스 내의 모든 테이블(poa_ops.*)에 대해 모든 권한(ALL PRIVILEGES)을 갖도록 설정합니다.
- 예를 들어 INSERT, SELECT, UPDATE, DELETE, CREATE, DROP 등의 권한이 포함됩니다.
- 권한 적용
- MySQL/MariaDB 서버가 현재 부여된 권한을 즉시 반영할 수 있도록 권한 캐시를 재로드합니다.
- 데이터베이스 목록 확인
- 현재 서버에 생성된 모든 데이터베이스 목록을 표시합니다.
- poa_ops 데이터베이스가 정상적으로 생성되었는지 확인할 수 있습니다.
- 사용자 정보 확인
- mysql.user 시스템 테이블에서 'poa_ops' 사용자 정보(사용자명, 호스트)를 조회합니다.
- 호스트가 '%'로 설정되어 있음이 확인됩니다.
- 권한 정보 확인
- 'poa_ops'@'%' 사용자가 어떤 권한을 가지고 있는지 확인합니다.
- 위에서 부여한 대로 GRANT ALL PRIVILEGES ON poa_ops.* TO 'poa_ops'@'%'와 같은 문구가 표시되어야 정상적으로 권한이 부여된 것입니다.
'etc 이슈' 카테고리의 다른 글
CRA 환경에서 FSD 아키텍처 적용하기 (0) | 2025.04.15 |
---|---|
시작, 중단, 재시작, 접속 단축 명령 (0) | 2025.04.15 |
MySQL 사용자 정의 함수 > DB 암복호화 (0) | 2025.04.15 |
리눅스 > DB 암호화 (0) | 2025.04.15 |
리눅스 명령어 (0) | 2025.04.15 |