향상된 패키지 관리도구 apt
- 외부 파일을 리눅스에 설치하는 방법으론 크게 3가지가 있습니다.
- wget명령어로 다운하기 (window의 브라우저와 비슷합니다.)
- FTP통신으로 tar파일을 옴기고 압축해제하고 실행하기
- apt명령문으로 파일 다운받기
- apt는 인터넷을 통해 원격에 저장된 패키지를 다운로드 받아서 설치해주는 향상된 패키지 관리 도구 입니다.
- 향상된 패키지 관리 도구 apt는 필요한 파일을 다운로드 하고 환경 설정까지 처리 해줍니다.
인터넷연결 확인 (외부로 요청 보내보기)
- curl은 Client Url 이란 의미로 클라이언트에서 url을 사용해서 서버와 데이터를 송수신하는 명령어 툴
curl 외부인터넷주소(<https://www.google.com>)
패키지 관리 도구 업데이트
apt-get update
패키지 찾기
apt search <패키지명>
패키지 다운로드하기
apt-get install <패키지명>
실행(자바설치)
apt설치 시 환경변수 설정은 자동으로 이루어 집니다.
sudo apt-get update sudo apt search openjdk-11 sudo apt-get install openjdk-11-jdk
자바버전 or 컴파일 버전 확인하기
java -version javac -version
자바실행파일 찾기
which java
환경변수 등록 확인
echo $PATH
모놀리식 아키텍쳐 웹서버 vs MSA기반(분산환경) 아키텍쳐버 웹서버
- 대표적인 웹서버 구현 아키텍쳐는 하나의 운영체제 위에 필요한 서비스를 모두 묶어서 구축하는 형식입니다.
- 전통적인 서버 구축 방식입니다.
- 하나의 서비스 또는 어플리케이션이 하나의 거대한 아키텍처를 가질 때, Monolithic 하다고 합니다.
- 데이터베이스는 같은 서버에 묶을 수도 있고, 다른 서버에 분리해서 설계할 수도 있습니다.
- RDS and EC2데이터베이스 and 웹서버에 데이터베이스
- 예제에서는 DB도 묶어서 실습 합니다.
모놀리식
MSA아키텍쳐
시나리오
- 자바설치
- mysql서버설치
- aws인 경우 서버 보안그룹 설정
- window환경에서 원격 mysql서버에 접속해보기
- 개발 서버에서 프로젝트 빌드
- FTP통신을 이용해서 빌드 된 파일을 전송
- 또는 깃으로 다운로드하고 리눅스에서 직접빌드 (서버스펙이 요구됨 , AWS 프리티어인 경우 어림도 없음)
- 스프링부트인 경우 백그라운드로 war파일 실행
- AWS인 경우 서버 스펙이 낮기 때문에 swap으로 메모리설정
우분투 서버에 직접 서버 구축해보기
1. 자바설치 2.mysql설치
1. 자바설치 (위에서 함)
2. mysql설치
https://dev.mysql.com/doc/refman/8.0/en/alter-user.html
- apt방식으로 mysql을 받고 설치한다.
sudo apt search mysql
sudo apt-get install mysql-server
- mysql설치 후 초기 비밀번호 설정
mysql접속 (초기 비밀번호 설정 이후에는 mysql -u root -p로 접속 ) sudo mysql
root유저정보확인 use mysql; 로 변경후 select user, host, plugin from user;
초기비번설정 (버전마다 다를수 있는데 ‘root’@’localhost’로 하세요.) 초기비밀번호설정이 제대로 되지 않으면, 변경이 아주 까다로우니 주의
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by '비밀번호';
####ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password by '비밀번호';
로 root계정이 외부에서 접속가능하도록 업데이트 UPDATE mysql.user SET Host='%' WHERE User='root'; 권한 적용 FLUSH PRIVILEGES;
탈출 exit 루트로접속 mysql -u root -p 비밀번호 입력후 접속이 되면 정상 설치 완료
3. 보안그룹 설정 and 4.mysql접속
3. AWS라면 보안그룹 설정으로 포트를 설정합니다. (4번이랑 연결해서 보세요)
- mysql의 포트개방 입니다.
- 설정하지 않더라도 ssh를 통해서 접속이 가능함. (보안을 강화하려면 설정하지 않음)
- 접속가능한 아이피주소 입니다.
- 0.0.0.0/0 인 경우 어디서든 접속 가능입니다. (보안에 매우 위험. 데이터베이스 해킹에 취약해짐)
- 본인의 공용 아이피를 적어서 본인 컴퓨터에서만 접속 가능하게 할 수 있습니다.
- ssh접속 포트개방 입니다.
- 반드시 열어야 함
- 접속가능한 아이피주소 입니다.
- 0.0.0.0/0 인 경우 어디서든 접속 가능입니다. (보안에 매우 위험)
- 본인의 공용 아이피를 적어서 본인 컴퓨터에서만 접속 가능하게 할 수 있습니다.
4. window환경에서 원격 mysql서버에 접속해보기
워크벤치에서 연결을 확인합니다. 2가지 방식이 있습니다.
방식1
3306포트는 개방하지 않고 리눅스에 ssh로 접속하여 mysql로 접근할 수 있습니다. (보다 안전)
- 접속했으면 개발 환경의 데이터베이스를 운영을 백업하고, 동일한 환경을 구성합니다.
- MySQL 환경과 설정에 따라 대소문자를 구분하기도 하고 그렇지 않기도 한다.
- 컬럼이름은 모든 환경에서 대소문자를 구분하지 않는다.
create database spring default character set 'utf8';
create user 'spring' identified by 'spring';
grant all privileges on spring.* to 'spring';
방식2
접속을 해봅니다.
루트에서는 개발DB와 동일하게, 스키마, 계정, 테이블을 생성해 줍니다.
트러블슈팅 - 외부접속이 막히는 경우
외부에서 접근할 수 있도록 약간의 수정이 필요합니다.
mysqld.cnf파일을 수정하기
grep -r bind /etc/mysql
해당파일의 로컬에서만 접속하는 부분을 주석처리 합니다.
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
i키 입력후 주석처리 하고 :wq 저장합니다.
mysql재부팅
sudo service mysql restart
워크벤치에서 재접속
mysql의 3306포트를 운영체제에서 개방한 경우 어디서든 들어갈 수 있습니다. (보안에 취약)
트러블 슈팅 - (root접속 시 Access denied for user ‘root’@’localhost’ 오류가 나는 경우)
우분투에 mysql설치시 root에 대해서 auth_socket으로 지정되어 초기 비밀번호 설정이 안되는 경우가 있습니다. )
mysql root계정의 패스워드 타입을 강제 지정해서 변경해주면 됩니다.
sudo mysql -u root -p 로 접속후 use mysql; 로 변경후 select user, host, plugin from mysql.user; 로 확인합니다.
위처럼 root의 plugin이 auth_socket으로 설정 되어 있다면, 초기 설정이 제대로 안된 것 입니다.
이 값을 mysql_native_password로 변경해주면 됩니다.
`update user set plugin='mysql_native_password' where user='root';
flush privileges;
select user, host, plugin from user;`
5. 개발 서버에서 프로젝트 빌드
어플리케이션 빌드란?
- 컴퓨터가 코드를 실행 시킬 수 있도록 컴파일하며, 어플리케이션에 필요한 라이브러리를 통합하고, 합치는 과정
- 빌드 과정은 무거운 작업이기 때문에 컴퓨터 사양이 좋아야 합니다. (여유 하드디스크 용량도 필요)
- EC2에서 프리 티어로 제공하는 운영체제는 사양이 좋지 않기 때문에 윈도우에서 빌드 합니다.
프로젝트 빌드시 필수사항
- 레이아웃을 쓰는 경우 th:replace부분을 ./경로/경로 형태로 전부 수정 (리눅스의 경로 참조 문제)
- 파일업로드 경로 처리
- 개발환경의 업로드 경로 \\ 를 전부 우분투 환경의 경로에 맞추어 /로 변환한다.
- 우분투에 만들어지는 로컬 업로드 폴더는 window와 다르다.
- app-properties파일의 업로드 경로를 우분투의 경로 /home/ubuntu/upload 형태로 바꾼다.
- 우분투에 /home/ubuntu/upload폴더를 만들어준다.
- 파일을 업로드 하려면 어플리케이션이 폴더를 (읽기 쓰기 실행) 할 수 있는 권한이 있어야 한다.
- sudo chmod -R 777 /home/ubuntu/upload 으로 누구나 다 (읽기 쓰기 실행) 할 수 있는 권한을 준다.
- 운영 데이터베이스의 접속 주소가 다르다면 수정한다.
- 빌드파일 설정 build/gradle의 version명을 바꿔도 된다 (선택사항)
- 추가로 여러분 프로젝트를 운영 환경에 맞추어 설정하면 됩니다
프로젝트 빌드
- 프로젝트 빌드시 모든 test코드를 실행한 후에 통합하게 된다.
- test코드에 실패하면 빌드는 실패한다.
- 다른 이유에서 에러가 발생하면 개발자는 에러의 이유를 탐색하고 찾아서 해결한다.
CMD빌드
- 윈도우에 자바11설치 (8버전이 있는 경우는 8버전 환경변수 삭제하고 cmd로 이동)
- 프로젝트 루트폴더 안에서 ./gradlew build 또는 (gradlew build)
- ./build/libs 폴더 안에 war 파일이 생성되었습니다.
통합 개발 환경에서 마우스로 빌드
- 이클립스기준 show view에서 greadle task추가
2.gradle task탭에서 빌드
3. ./build/libs 폴더 안에 war 파일이 생성되었습니다.
동작시켜보기
java -jar 경로/프로젝트.jar java -jar BootMyweb-0.0.1.jar
6. FTP통신을 이용해서 빌드 된 파일을 전송
- FTP통신 - File transfer protocol
- 파일을 전송하는 통신방법 입니다.
- 빌드가 완료된 파일을 우분투 서버로 옴겨서 동작 시켜야 합니다.
파일질라 프로그램 설치
https://filezilla-project.org/
파일질라를 통해 서버에 접속하기
AWS라면 키페어 등록 후 접속
VM이라면 비밀번호만 입력 후 접속
7. 스프링부트인 경우 백그라운드로 war(jar)파일 실행
jar or war파일의 실행 명령
- 이렇게 돌리게 되면 포그라운드로 실행되고, 터미널을 종료하면 어플리케이션은 종료됩니다.
java -jar 경로/프로젝트.jar java -jar /home/ubuntu/BootMyweb-0.0.1.war
jar or war파일의 백그라운드 실행 명령
- 우분투 서버에서 실행파일을 백그라운드로 동작 시킵니다.
- 터미널을 종료해도 어플리케이션은 백그라운드로 동작됩니다.
- 실행로그는 nohup.out 파일에 기록 됩니다.
nohup java -jar 경로/프로젝트.jar & nohup java -jar /home/ubuntu/BootMyweb-0.0.1.war &
nohup.out파일의 실시간 로그 확인 명령
- 운영 환경에서 에러는 여기서 볼 수 있습니다.
tail -fn50 nohup.out
jar or war파일의 백그라운드 파일 종료 명령
- 백그라운드 실행되는 파일은 프로세스 번호로 종료합니다.
- 프로세스 확인 명령 ps
ps
- 프로세스 중 특정 단어가 들어간 파일을 찾는 명령
ps -ef|grep 자르명 또는 합쳐서 사용하는 pgrep pgrep –f 자르명
앞쪽에 나오는 번호가 프로세스아이디 (PID) 입니다
- 프로세스 종료(755권한 반드시 필요)
sudo kill -9 PID번호
쉘 스크립트로 자동중지, 재배포
쉘스크립트란?
셸 스크립트는 셸이나 명령 줄 인터프리터에서 돌아가도록 작성되었거나 한 운영 체제를 위해 쓰인 스크립트이다.
셸 스크립트가 수행하는 일반 기능으로는 파일 이용, 프로그램 실행, 문자열 출력 등이 있다.
쉘 스크립트 작성
- sudo vi ./deploy.sh (쉘 파일 생성)
쉘 실행
- sh deploy.sh
쉘작성
#!/bin/bash
JAR_NAME=jar이름.jar # 변수
CURRENT_PID=$(pgrep -f jar이름.jar ) # JAR의 pid번호
echo "> 프로젝트 배포 시작" #출력문
echo "> 현재 구동중인 애플리케이션 pid 확인"
echo "> pid: $CURRENT_PID" #변수참조
if [ -z $CURRENT_PID ]; then #제어문
echo "> 현재 동작중인 어플리케이션이 없습니다."
else
echo "> kill -2 $CURRENT_PID"
kill -9 $CURRENT_PID
sleep 5
fi
echo "> 새 어플리케이션 배포를 시작합니다"
echo "> JAR Name: $JAR_NAME"
nohup java -jar $JAR_NAME & # 우분투 명령문
번외 스왑설정
EC2 t2.micro의 스펙은 렘 1기가 이다.
여러분이 쓰는 개발환경 데스크톱 렘은 기본 8기가 이상이다.
실제로 AWS는 t2.micro는 테스트나 교육을 위해서 사용하라 권고 하고있다.
t2.micro는 서버 운영으론 적합하지 않다.
또한 t2.micro 서버는 순간확장가능 인스턴스이다.
순간확장가능 인스턴스는 크레딧(에너지) 를 충전했다가 CPU가 필요한 상황에 크레딧(에너지)를 버스트시켜 폭발 시키고 크레딧(에너지) 이 없으면 먼지처럼 사라져버린다.
이는 서버가 다운되어 버린다는 뜻이다.
운영 서버를 선택할 때는 CPU와 렘, 하드디스크의 용량 등이 서버의 사용량에 따라 알맞게 책정될 필요가 있다.
AWS공식문서
https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/burstable-credits-baseline-concepts.html
하드디스크를 렘으로 일부분 변환시켜 RAM의 성능을 올려줄 수 있는 방법이 있습니다.
SWAP설정 입니다.
스왑설정은 여기를 참고하거나
https://down-develope.tistory.com/6
여기를 참고해서 설정하면 됩니다.
https://aws.amazon.com/ko/premiumsupport/knowledge-center/ec2-memory-swap-file/
이제 여러분의 어플리케이션은 전세계 어디에서든 접속할 수 있습니다.
'리눅스' 카테고리의 다른 글
사용자생성과 소유권, 실행권한 (0) | 2024.07.04 |
---|---|
리눅스의 파일구조, 기초명령문 (0) | 2024.07.04 |
리눅스 접속을 위한 SSH서버 설치 (0) | 2024.07.04 |
개발자가 알아야 하는 리눅스명령문 (0) | 2024.07.04 |