예전에 만든 스프링 기반 웹서비스를 AWS EC2, AWS RDS를 사용하여 운영하고 있었는데
본인의 프리티어 기간도 종료되고 AWS EC2, AWS RDS 비용이 많이 나와
EC2를 가장 작은 서버로 옮기고 DB또한 EC2 안에서 구동하려고
서버와 db 마이그레이션을 하게 되어 그 과정을 포스팅 해보려고 한다.
가장 낮은 사양의 AWS EC2 t2.nano Ubuntu Server 18.04 LTS (HVM), SSD Volume Type 우분투 리눅스를 설치하였다.
(더 자세한 정보 : https://shlee0882.tistory.com/180?category=777755)
서버의 보안그룹 설정은 다음과 같이 진행하였다.
putty나 filezila에서 접속하기 위해 SSH 포트 22, 웹서비스를 구동하기 위한 80, 8080 포트
MySQL을 사용하기 위한 3306 DB포트를 열어주었다.
그 이후 putty로 접속하여 리눅스에서의 설치 과정을 정리해보았다.
본인은 db마이그레이션이 가장 중요하다고 생각되어 라이브러리는 mysql 부터 설치하였다.
1. Ubuntu Linux에서의 MySQL 설치 및 root 권한 설정
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 31 32 33 34 | -- 업데이트 sudo apt update -- mysql 설치 sudo apt install mysql-server -- mysql 접속 sudo mysql -- mysql.user 쿼리 조회 mysql> SELECT user,authentication_string,plugin,host FROM mysql.user; -- root 플러그인 변경 mysql> USE mysql; mysql> UPDATE user SET plugin='mysql_native_password' WHERE User='root'; mysql> FLUSH PRIVILEGES; mysql> exit; $ sudo service mysql restart -- root 비밀번호 재설정 $ sudo mysql mysql> USE mysql; mysql> update user set authentication_string=password('0000') where user='root'; mysql> flush privileges; -- root 계정을 외부에서 접속가능하게 허용 mysql> grant all privileges on *.* to 'root'@'%' identified by '0000'; mysql> flush privileges; mysql> select host, user, authentication_string from user; mysql> exit -- bind-address 주석설정 $ sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf $ sudo service mysql restart | cs |
mysql의 root 권한부터 기본설정을 마치고
mysqld.cnf를 열어 bind-address = 127.0.0.1 맨 앞의 #을 붙여 주석설정한 뒤 저장하였다.
그 이후 mysql 서버를 재시작한다.
(더 자세한 정보 : https://shlee0882.tistory.com/240)
이제 MySQL Tool (heidiSQL)을 이용해 root로 접속해보겠다.
ip는 IPv4 퍼블릭 IP를 넣었고 사용자 이름은 root 암호는 본인이 설정한 0000으로 넣었다.
2. HeidiSQL에서의 접속 테스트
접속이 된다면 성공한 것이다.
이제 본인의 AWS RDS에서의 export한 DB Schema를 불러와 import 한다.
필요한 경우 DB Charset 변경도 해준다.
1 2 | cd /etc/mysql vi my.cnf | cs |
해당 사항을 추가하고 저장한다.
1 2 3 4 5 6 7 8 9 10 | [client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-client-handshake = FALSE character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci | cs |
DB 스키마 언어도 변경해준다.
1 | ALTER DATABASE DB_NAME CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; | cs |
(db 마이그레이션 완료)
3. 오픈 JDK, JRE, 톰캣8 설치 및 확인
1 2 3 4 5 6 7 8 9 10 | -- 오픈 jdk8, jre 설치 및 확인 $ sudo apt-get update $ sudo apt-get install openjdk-8-jdk $ sudo apt-get install openjdk-8-jre $ java -version $ javac -version -- 톰캣8 설치 및 확인 $ sudo apt-get install tomcat8 $ /usr/share/tomcat8/bin/version.sh | cs |
톰캣을 설치했으면 확인해보자.
자신의 EC2퍼블릭 서버ip와 톰캣 기본포트는 8080이니
본인의 EC2 보안그룹에 8080포트가 열려있다면 접속가능하다.
http://자신의EC2퍼블릭서버ip:8080/
(ex: http://15.164.212.200:8080/)
하지만 웹의 기본포트는 80 인데
톰캣의 포트번호 8080을 80으로 변경하여 ip주소만 입력하면
바로 서비스하는 웹으로 이동해보려고 한다.
4. Tomcat8 port 8080 to 80 change
server.xml의 port 8080을 80으로 수정하고
tomcat8의 AUTHBIND=yes로 변경 후 AUTHBIND 설치 후 톰캣 재시작을 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | $ sudo vi /var/lib/tomcat8/conf/server.xml -- <Connector connectionTimeout="20000" port="80" protocol="HTTP/1.1" redirectPort="8443"/> -- port 8080을 80으로 수정 $ sudo vi /etc/default/tomcat8 -- #AUTHBIND=no를 주석제거하고 AUTHBIND=yes 로 변경 $ sudo apt-get install authbind $ sudo touch /etc/authbind/byport/80 $ sudo chmod 500 /etc/authbind/byport/80 $ sudo chown tomcat8 /etc/authbind/byport/80 $ sudo /etc/init.d/tomcat8 restart | cs |
이제 포트입력 없이 자신의 EC2퍼블릭서버ip 주소로 바로 접속 가능하다면 성공이다.
5. 스프링 프로젝트를 war파일을 export 및 linux로 전송
스프링 프로젝트를 war파일로 만든다.
export된 war파일을
filezila 접속 후 리눅스서버의 /home/ubuntu 디렉토리로 파일을 전송한다.
리눅스로 돌아와 파일 확인 및 tomcat8/webapps 하위디렉토리로 이동시킨다.
1 2 3 4 5 6 7 8 9 10 11 12 | -- 리눅스로 파일 이동되었는지 확인 $ cd /home/ubuntu $ ls BurgerInfo.war -- tomcat8 webapps 디렉토리 아래로 war파일 이동 $ sudo mv BurgerInfo.war /var/lib/tomcat8/webapps/ $ cd /var/lib/tomcat8/webapps/ -- webapps 디렉토리 확인 war파일이 풀려져있으면 성공 $ ls BurgerInfo BurgerInfo.war ROOT | cs |
webapps의 war파일이 풀려 디렉토리가 생겼다면
자신의 프로젝트의 기본경로를 추가해주고 톰캣 재시작한다.
1 2 3 4 5 6 7 8 9 | -- server.xml 수정 $ cd /var/lib/tomcat8/conf $ sudo vi server.xml -- <Host> 태그 안에 본인의 프로젝트 이름과 기본경로 추가해준다. -- <Context docBase="BurgerInfo" path="/" reloadable="true"/> -- 톰캣 재시작 $ sudo service tomcat8 restart | cs |
이후 자신의 프로젝트가 잘뜨는지 확인한다.
잘 뜨는 것이 확인되었다.
그런데 띄우고 몇분이 되지 않아 DB로 접속이 되지 않는것이었다.
mysql을 재시작하려고 했는데 start가 되지 않았다.
6. AWS EC2 t2.nano InnoDB Cannot allocate memory for the buffer pool Error
1 2 3 | -- mysql restart error 발생 $ sudo service mysql stop $ sudo service mysql start | cs |
Job for mysql.service failed because the control process exited with error code.
See "systemctl status mysql.service" and "journalctl -xe" for details.
버퍼풀에 메모리 할당 못한다. 메모리 부족 하다는 것을 얘기하는 것 같다.
stackoverflow에서 확인해보니 AWS EC2의 Micro 인스턴스는 기본 SWAP 공간이 없다고 한다.
(https://stackoverflow.com/questions/16917973/amazon-ec2-mysql-failed-to-start)
그럼 스왑설정을 해주자
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | $ sudo su $ dd if=/dev/zero of=/swapfile bs=1M count=1024 $ mkswap /swapfile $ swapon /swapfile $ vi /etc/fstab -- /swapfile swap swap defaults 0 0 추가해준다. -- 스왑설정 확인 $ swapon -s $ free -k $ swapon -a $ service mysql restart | cs |
설정을 마치니 mysql 버퍼메모리 오류가 발생 하지 않았다.
그런데 매번 배포할때마다 수동으로 war로 묶어 tomcat wepapps 밑으로 옮겨서
배포할순 없다.
다음번엔 빌드와 배포를 자동화 하는 젠킨스를 설치하여 지속적으로 통합관리 해보려고 한다.
이번 설정을 통해 AWS 비용을 아낄수 있는 기회가 되었으면 좋겠다.
'전체 > AWS' 카테고리의 다른 글
aws rdb 테이블 한글 인코딩 utf8 설정 (1) | 2019.03.07 |
---|---|
AWS RDS 사용하기, PHP 연결하기, RDS charset 바꾸기 (0) | 2018.12.27 |
AWS EC2 로 wordpress(워드프레스) 구축하기 (3) | 2018.12.27 |
AWS EC2 시작하기(인스턴스 생성, putty, xshell 사용, 우분투 서버, 윈도우 서버 접속) (0) | 2018.12.26 |
aws 인스턴스, ami, elastic ips,scale-up (0) | 2018.12.20 |