- 여기를 눌러 RDS 생성 도움받기 - 내용 중간에 RDS 생성 내용이 Step by Step으로 나와있다.
시작 전
- Web - WAS - DB(RDS)의 3Tier 환경 구축 실습 중 처음부터 끝까지 자세하게 적어놓은 포스팅을 찾지 못해서 실습에 어려움을 느끼고 최대한 정리 해 봤다.
- 개발자가 아니라서 WEB, WAS에 실제 서비스를 올려서 구성하진 못했지만 적어도 연동정도의 경험은 필요하다고 생각해서 실습했다.
- 아래 주어진 개념도를 따라서 실습했지만 IP대역은 조금 다르다. 또한 너무 많은 서브넷관리가 어렵다면 Public , Private 서브넷만 나눠 놓고 보안그룹에서 Source IP를 확실하게 부여하는 방식으로도 조금 더 간단하게 실습할 수 있다.
- 이 포스팅은 3Tier 구축에 대한 최소환경 및 최소설정으로 구성하였다.
인프라 생성
- VPC : cloudest (172.31.0.0/16)
서브넷
- pub-AZ-a : 172.31.0.0/24
pub-AZ-c : 172.31.1.0/24
web-AZ-a : 172.31.2.0/24
web-AZ-c : 172.31.3.0/24
was-AZ-a : 172.31.4.0/24
was-AZ-c : 172.31.5.0/24
db-AZ-a : 172.31.6.0/24
db-AZ-c : 172.31.7.0/24
- pub-AZ-a : 172.31.0.0/24
- IGW 생성 및 VPC 연결
- NAT Instance 생성
ALB 생성
- Name : ex-LB
Subnet : pub-AZ-a,c
SG : external-LB-SG
- Name : in-LB
Subnet : web-AZ-a,c
SG : internal-LB-SG
- Name : ex-LB
보안그룹 생성
- 모든 보안그룹은 TCP만 허용
- bastion-SG : allow 22 from 0.0.0.0/0
External-LB-SG : allow 80 from 0.0.0.0/0
web-SG : allow 80 from External-LB-SG
Internal-LB-SG : allow 8080 from web-SG
was-SG : allow 8080 from Internal-LB-SG
db : allow 3306 from was-SG
라우팅 테이블 생성 및 서브넷 연결
- Bastion Host 생성
서버 생성 (2개 생성하는 서버는 가용영역 a,c에 나누어 생성)
- Web Instance 2개 생성
- WAS Instance 2개 생성
- RDS 생성
3Tier 서버 설정
WEB 서버 동작 확인
- 인프라 구성
- WEB 인스턴스 생성 및 Apache 패키지 다운
sudo yum -y update sudo yum -y install httpd sudo chkconfig httpd on sudo systemctl start httpd
- 2개의 웹서버에 각각 web1 - web2로 다르게
/var/www/html/index.html
페이지 생성 (로드밸런싱 확인을 위해)
- 2개의 웹서버에 각각 web1 - web2로 다르게
- 로드밸런서 -대상그룹 등록
- healty check 확인후 - dns를 통한 접속 → 로드밸런싱 동작 확인
WAS서버 구축
- WAS 인스턴스 설치
- 자바가 없는 경우 설치 (amazon linux 2에는 안 깔려있다.)
sudo yum install java-1.8.0-openjdk sudo yum install java-1.8.0-openjdk-devel.x86_64
- 환경구성
→ 설정적용 확인$ echo $JAVA_HOME -> 안나타날경우 which를 이용하여 절대경로 확인 $ which java /usr/bin/java sudo vi /etc/profile <마지막부분에 기입> export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.272.b10-1.amzn2.0.1.x86_64/jre export PATH=$PATH:$JAVA_HOME/bin export CLASSPATH=$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar export CATALINA_HOME=/usr/local/src/tomcat8.5 source /etc/profile 으로 변경 적용
- 환경구성
- 톰캣 설치
wget https://downloads.apache.org/tomcat/tomcat-8/v8.5.61/bin/apache-tomcat-8.5.61.tar.gz tar -xvf apache-tomcat-8.5.61.tar.gz mv apache-tomcat-8.5.61 /usr/local/src/tomcat8.5
- vi 에디터로 server.xml을 편집
vi /usr/local/src/tomcat8.5/conf/server.xml <Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8" -> 이부분을 추가 connectionTimeout="20000" redirectPort="8443" /> sudo /usr/local/src/tomcat8.5/bin/startup.sh -> 실행
- vi 에디터로 server.xml을 편집
- 대상그룹 등록
WAS와 Proxy 설정을 통한 WEB-WAS 연동 (mod proxy 사용)
- mod_proxy를 이용하면 mod_jk 는 ttl을 이용하지 못한다.
- mod_proxy의 pass를 이용해 로드밸런서로 전달가능참고 포스팅 : https://kchanguk.tistory.com/
//WEB에서 vi /etc/httpd/conf/httpd.conf 에서 맨아래 다음과 같이 추가하기 <VirtualHost *:80> ServerName [external 로밸 DNS] ErrorLog logs/counterjp.fureweb.com-error_log ProxyRequests Off ->리버스 프록시 모드 ProxyPreserveHost On ->was로 리다이렉트할시 host정보 함께 전달 <Proxy *> Order deny,allow -> 명령 우선순위 deny ->allow Allow from all -> 서버 접근 허용 </Proxy> #ProxyPass / http://[internal 로밸 DNS]:8080/ ProxyPassMatch ^/(.*\.do)$ http://[internal 로밸 DNS]:8080/ ProxyPassMatch ^/(.*\.jsp)$ http://[internal 로밸 DNS]:8080/ ProxyPassReverse / http://[internal 로밸 DNS]:8080/ </VirtualHost>
// WAS에서 vi /usr/local/src/tomcat8.5/webapps/ROOT/test.jsp 에 다음과 같이 추가 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>JSP Test scriptlet.jsp</title> </head> <body> <% int i = 24; %> <% out.println("was1하루는 " +i +"시간이며,<BR>"); out.println("was1하루는 " + i * 60+" 분 입니다."); %> </body> </html>
DB연동
- mysql RDS생성
- 파라미터 생성 - 한글 패치
- WAS 홈 디렉터리에
/usr/local/src/tomcat8.5/webapps/ROOT/dbcon.jsp
생성<%@ page import = "java.sql.*" %> <% Statement stm = null; ResultSet rs = null; Class.forName("com.mysql.jdbc.Driver"); String myUrl = "jdbc:mysql://[RDS엔드포인트]/[Database 이름]"; Connection conn = DriverManager.getConnection(myUrl, "admin", "[PW]"); try { stm = conn.createStatement(); if(stm.execute("select * from user")) { rs = stm.getResultSet(); } while(rs.next()) { out.println(rs.getString("userID")); out.println(rs.getString("userPassword")); out.write("<br>"); } rs.close(); stm.close(); } catch(Exception e) { out.println("rs.next() ERROR"); } conn.close(); %>
- mysql-connector 다운 (mysql 5.5 이상은 최신버전커넥터사용하면된다)https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.22.tar.gz
- tar -xvf로 압축풀고 디렉토리 내부에 mysql-connector-java-8.0.22.jar파일을 usr/lib/jvm/jre/lib/ext/mysql-connector-java-8.0.22.jar 해당경로로 복사
- 커넥터 → /lib/jvm/openjdk/lib , /usr/local/tomcat/lib
- /usr/local/src/tomcat8.5/bin/shutdow.sh → /usr/local/src/tomcat8.5/bin/startup.sh
- 워크밴치로 접속하여 쿼리 확인
- 작성된 db.jsp 파일을 통해 해당 정보 추출 → 연동됨을 확인했다.
- WAS와 DB가 연동 된 것을 확인할 수 있다. WEB은 WAS와 연동되었으므로 WEB을 통해 DB까지 3Tier 연동이 된 것을 확인했다.
회원가입을 통한 DB 쿼리 동작 확인 (WEB에서 입력한 값을 WAS가 처리해 DB에 저장)
- 이 부분은 직접 실험해보진 못했다.
- 회원가입 페이지
vi /usr/local/src/tomcat8.5/webapps/ROOT/login.jsp <%@ page contentType="text/html;charset=UTF-8" %> <HTML> <HEAD><TITLE>회원 입력</TITLE></HEAD> <BODY bgcolor=white> <FORM action="join.jsp" method="post"> <font color=gray> 아이디 : <INPUT type="text" name="id" maxlength="8"><BR> 암호 : <INPUT type="password" name="pwd" maxlength="8"><BR> <INPUT type="submit" value=" 저 장 "></font> </FORM> </BODY> </HTML>
- db전송 페이지
<%@ page contentType="text/html;charset=utf-8" import="java.sql.*" %> <% request.setCharacterEncoding("utf-8"); //Set encoding //INPUT.JSP 페이지로부터 받아온 파라미터를 각각 get메소드로 가져옴 String userID = request.getParameter("userID"); String userPassword = request.getParameter("userPassword"); //POST로 Input.html로부터 입력받은 내용을 변수화 try{ //jdbc 참조변수 준비 PreparedStatement pstmt = null; //드라이버 로딩 Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://[RDS엔드포인트]"; //db연동 Connection con = DriverManager.getConnection(url,"admin","[PW]"); //SQL준비 String query = "INSERT INTO user(userID, userPassword) VALUES(?,?)"; //prepareStatement 가 객체의 동일한 질의문을 특정값만 바꾸어서 여러번 실행할시유용 //Statement 객체는 단순 질의문 사용에 적합 pstmt = con.prepareStatement(query); pstmt.setString(1, userID); pstmt.setString(2, userPassword); //실행 pstmt.executeUpdate(); //JDBC자원닫기 pstmt.close(); con.close(); } catch(Exception e){ out.println( e ); } response.sendRedirect("db.jsp"); %>
결론
- WEB-WAS-DB 3Tier 구조를 생성했다. 사용자는 WAS, DB에 직접적인 접근을 하지 못하고 관리자가 원하는 기능만 WEB서버를 통해 접근할 수 있다.
- 3Tier 구축이 가능하게만 설정했지만 완성 된 3Tier가 연동, 접근제어되는 환경의 보안그룹, 로드밸런서, 서브넷과 같은 환경의 역할을 잘 이해하면 좋을 것 같다.
Uploaded by Notion2Tistory v1.1.0