예전에 만든 스프링 기반 웹서비스를 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.


에러 로그를 확인해보니 

2020-04-05T06:30:39.241537Z 0 [Note] InnoDB: Using CPU crc32 instructions
2020-04-05T06:30:39.243292Z 0 [Note] InnoDB: Initializing buffer pool, total size = 128M, instances = 1, chunk size = 128M
2020-04-05T06:30:39.243322Z 0 [ERROR] InnoDB: mmap(137428992 bytes) failed; errno 12
2020-04-05T06:30:39.243329Z 0 [ERROR] InnoDB: Cannot allocate memory for the buffer pool
2020-04-05T06:30:39.243334Z 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error
2020-04-05T06:30:39.243339Z 0 [ERROR] Plugin 'InnoDB' init function returned error.
2020-04-05T06:30:39.243343Z 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
2020-04-05T06:30:39.243347Z 0 [ERROR] Failed to initialize builtin plugins.
2020-04-05T06:30:39.243350Z 0 [ERROR] Aborting

버퍼풀에 메모리 할당 못한다. 메모리 부족 하다는 것을 얘기하는 것 같다.

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 -
$ free -k
$ swapon -a
 
$ service mysql restart
cs



설정을 마치니 mysql 버퍼메모리 오류가 발생 하지 않았다.


그런데 매번 배포할때마다 수동으로 war로 묶어 tomcat wepapps 밑으로 옮겨서 

배포할순 없다.  


다음번엔 빌드와 배포를 자동화 하는 젠킨스를 설치하여 지속적으로 통합관리 해보려고 한다. 


이번 설정을 통해 AWS 비용을 아낄수 있는 기회가 되었으면 좋겠다.


+ Recent posts