안 쓰던 블로그
vagrant 기반 multi server 환경 구성하기 (2웹서버, 1DB서버) 본문
[준비]
vagrant 설치
virtualBox 설치
www.virtualbox.org/wiki/Downloads
설치할 때 환경변수까지 설정된다. 이거 되어 있으면 어디서든 vagrant 실행이 가능
윈도우 파워쉘 - 관리자 모드로 실행
베이그런트: 어떤 프로젝트의 개발 환경 공유르르 위한 도구. 즉, 개발 환경이 필요한 프로젝트 디렉터리가 있어야 한다
vagrant 폴더 만들기 - 이동
vagrant init - (vagrantfile 생성됨)
vagrantfile에는 지금 base가상머신 구동이라고만 설정되어 있음. 어떤 이미지를 사용할지, 어떤 설정을 사용할지를 이 파일에서 설정할 수 있다.
쉘에서 노트패드를 실행하면 편리하게 설정할 수 있다.
notepad .\Vagrantfile
vagrantfile을 설정하고 나면 vagrant up 명령어로 설정 파일을 기반으로 구성할 수 있다.
[구상]
1. 2대의 가상머신은 웹 서버, 1대의 가상 머신은 데이터베이스 서버로 설정한다. 웹 서버 1의 ip주소는 192.168.3.5, 웹서버 2의 ip 주소는 192.168.3.4, DB서버의 ip주소는 192.168.3.6이다.
2. 데이터베이스 서버에는 response1과 response2 이름의 테이블 두 개가 있다.
3. 2대의 웹 서버는 1대의 데이터베이스 서버의 테이블들을 참조하여 데이터를 관리한다. 웹 서버1은 response1 테이블을 참조하고, 웹 서버2는 response2 테이블을 참조한다. 각 어떤 웹 서버에서 접속하느냐에 따라 수정하는 테이블이 결정된다.
[설정 과정]
1. 2대의 가상머신은 웹 서버, 1대의 가상 머신은 데이터베이스 서버로 설정한다. 웹 서버 1의 ip주소는 192.168.3.5, 웹서버 2의 ip 주소는 192.168.3.4, DB서버의 ip주소는 192.168.3.6이다.
<Vagrantfile>
웹 서버1을 설정한다.
버추얼박스 이름은 WebBox1
ip는 192.168.3.5로 private netwrok이다.
메모리는 1024를 할당한다.
host이름은 Web1이다.
provision은 web_provision.sh 파일로 진행한다.
웹 관련 파일은 ADDITIONALFILES1 폴더에 있다.
웹 서버2를 설정한다.
버추얼박스 이름은 WebBox2
ip는 192.168.3.4로 private netwrok이다.
메모리는 1024를 할당한다.
host이름은 Web2이다.
provision은 web_provision.sh 파일로 진행한다.
웹 관련 파일은 ADDITIONALFILES2 폴더에 있다.
데이터베이스 서버를 설정한다.
버추얼박스 이름은 DBBox
ip는 192.168.3.6으로 private network이다.
메모리는 1024를 할당한다.
host이름은 DB이다.
provision은 db_provision.sh 파일로 진행한다.
<web_provision.sh>
웹 서버 1, 2에 provision을 담당하는 web_provision.sh 파일이다.
웹 서버 구동에 필요한 apache와 php, mysql 등을 설치한다.
2. 데이터베이스 서버에는 response1과 response2 이름의 테이블 두 개가 있다.
<db_provision.sh>
#!/bin/bash
#provision DBBox Version 0.0.0
# Edited by Jessica Rankins 4/17/2017
rm -f postinstall.sh
apt-get update
# mysql 유저 설정
# mysql username: root
# mysql password: rootpass
debconf-set-selections <<< 'mysql-server-5.5 mysql-server/root_password password rootpass'
debconf-set-selections <<< 'mysql-server-5.5 mysql-server/root_password_again password rootpass'
# db서버의 역할을 하기 위한 패키지 설치
apt-get -y install mysql-server php5-mysql
sed -i "s/bind-address\s*=\s*127.0.0.1/bind-address = 0.0.0.0/" "/etc/mysql/my.cnf"
# Allow root access from any host 이 사람(root, rootpass)이 원격으로 접속할 수 있다고 허용해 주겠다
# 이게 없으면 로컬에서만 접속되고 원격에서는 안 된다
echo "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'rootpass' WITH GRANT OPTION; FLUSH PRIVILEGES;" | mysql -u root --password=rootpass
#echo "GRANT PROXY ON ''@'' TO 'root'@'%' WITH GRANT OPTION" | mysql -u root --password=rootpass
sudo service mysql restart
# Create database for form responses (WebExampleBox) DB 테이블 생성
#DB Server->MySQL(DBMS)->formresponses(DB)->table1,table2...(schema)
mysql -uroot -p'rootpass' -e "DROP DATABASE IF EXISTS formresponses; #기존의 db가 있으면 삭제
CREATE DATABASE formresponses; #db 생성
USE formresponses; #db 사용
CREATE TABLE response1 (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
firstname VARCHAR(20), lastname VARCHAR(20),
email VARCHAR(50), submitdate DATETIME);
CREATE TABLE response2 (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
firstname VARCHAR(20), lastname VARCHAR(20),
email VARCHAR(50), submitdate DATETIME);"
sudo service mysql restart
echo cd / >> /home/vagrant/.bashrc
echo "Hello World from DBBox!"
데이터베이스 서버의 provision을 담당하는 db_provision.sh 파일이다.
아이디와 비밀번호는 root와 rootpass로 설정한다.
db 이름: formresponses / table1 이름: response1 / table2 이름: response2
기존에 이미 formresponses라는 이름의 DB가 있다면 삭제한다.
각 테이블의 칼럼으로는 id, firstname, lastname, email, submitdate 가 있다.
3. 2대의 웹 서버는 1대의 데이터베이스 서버의 테이블들을 참조하여 데이터를 관리한다. 웹 서버1은 response1 테이블을 참조하고, 웹 서버2는 response2 테이블을 참조한다. 각 어떤 웹 서버에서 접속하느냐에 따라 수정하는 테이블이 결정된다.
<VagrantMultiAdditionalFiles1/process.php>
(전략)
function insertInfo($db,$first,$last,$email)
{
$stmt = $db->prepare("INSERT INTO response1(firstname, lastname, email, submitdate) VALUES (:first, :last, :email, :date)");
$stmt->bindParam(':first', $first);
$stmt->bindParam(':last', $last);
$stmt->bindParam(':email', $email);
$stmt->bindParam(':date', date_format(date_create("now",timezone_open("America/New_York")), "Y-m-d H:i:s"));
return $stmt->execute();
}
웹 서버1에서는 response1 테이블에 값을 insert한다.
<VagrantMultiAdditionalFiles1/show.php>
(후략)
웹 서버1에서는 respsonse1 테이블에 쿼리를 보낸다.
<VagrantMultiAdditionalFiles2/process.php>
function insertInfo($db,$first,$last,$email)
{
$stmt = $db->prepare("INSERT INTO response2(firstname, lastname, email, submitdate) VALUES (:first, :last, :email, :date)");
$stmt->bindParam(':first', $first);
$stmt->bindParam(':last', $last);
$stmt->bindParam(':email', $email);
$stmt->bindParam(':date', date_format(date_create("now",timezone_open("America/New_York")), "Y-m-d H:i:s"));
return $stmt->execute();
}
웹 서버2에서는 response2 테이블에 값을 insert한다.
<VagrantMultiAdditionalFiles2/show.php>
(후략)
웹 서버2에서는 respsonse2 테이블에 쿼리를 보낸다.
4. 실행 화면
여기까지 설정을 마쳤으면 설치 및 구성을 진행한다.
vagrant up
문제없이 구동되었으면 각 버추얼박스의 상태를 확인한다.
vagrant status
셋 다 정상적으로 running 중임을 확인할 수 있다.
버추얼박스 관리자에서 보아도 3대의 서버가 잘 실행되고 있다.
<웹 서버 1 (192.168.3.5)>
브라우저에서 접속하여 폼에 데이터를 입력한다. 입력대로 DB에 저장됨을 볼 수 있다.
<웹 서버 2 (192.168.3.4)>
web2 주소로도 브라우저에서 접속하여 폼에 데이터를 입력한다. 입력대로 DB에 저장됨을 볼 수 있다.
<데이터베이스 확인>
vagrant ssh DBBox로 ssh접속 후 mysql에 접속한다. formresponses 데이터베이스가 있다.
2개의 테이블을 확인한다.
web1에서 적었던 정보들은 response1에 저장되었다.
web2에서 적었던 정보들은 response2에 저장되었다.
[마치며]
여기까지 베이그런트(vagrant)로 멀티 서버를 구성하는 방법에 대해서 알아보았다. 최근에는 베이그런트보다는 도커와 도커 컴포즈를 훨씬 많이 일반적으로 사용한다. 하지만 이전의 기술에 대해서도 알고 있으면 좋을 것 같아서 환경 구성을 한 번 진행해 보았다.
이 글에서 작성한 코드는 깃허브에 올려두었다.
github.com/proqk/vagrant_multi_vm
베이그런트의 근본적인 아이디어와 장점을 이해하는 데 좋은 자료가 있다 (KTH의 H3 컨퍼런스 발표)
www.youtube.com/watch?v=BWHX7u5NEtE
또한 이 글과 학교 강의를 참고하여 작성한 글임을 밝힌다.
'Network' 카테고리의 다른 글
클라우드 컴퓨팅 Type-1, Type-2 가상화 (0) | 2021.06.11 |
---|---|
클라우드 서비스에서의 과대자원, 과소자원 문제 (0) | 2021.06.11 |
[해결] Vagrant 설치 에러 There was an error while executing `VBoxManage`, a CLI used by Vagrant (0) | 2021.05.03 |
google cloud platform에서 instance 만들기 (0) | 2020.11.10 |
pcap 프로그래밍-TCP, UDP 패킷 분석 TCP, UDP reader (0) | 2020.09.26 |