본문 바로가기
교육

[30일 차] 21.08.31 : Linux Server 9

by ballena 2021. 8. 31.

1교시

 

Proxy 기능 배울 예정

-> 3 티어 서버 구축 시 사용되는 리버스 프록싱 : 클라이언트의 요청에 응답하기 위해 서버에서 자원을 추출하는 것

 

  • 3 티어 서버 : 앞단의 웹 서버(아파치, nginx), 그 뒤에 WAS 서버, 그 뒤에 DB 서버.

-> WAS, DB는 사설 네트워크(내부망)에 두고, 외부는 웹 서버에 연결

-> 정적 콘텐츠(html, 홈 페이지 등)는 웹 서버에서 바로 응답, 동적 콘텐츠(페이지 내의 기능)는 WAS에서 관리

-> 리버스 프록시 기능으로 WAS, DB에서 요청에 맞는 자원을 뽑아 그 내용을 클라이언트에게 응답으로 보낸다.

 

  • Proxy 서버

클라이언트가 서버를 통해 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해주는 컴퓨터 또는 응용 프로그램

클라이언트에서 요청이 들어오면, 라우터에서 프록시 서버로 보낸다. 

1. 일반적인 프록시 : 프록시 서버와 사용자 PC는 아무 연관 없이 구성. 사용자의 웹 브라우저에서 프록시 설정을 해야 연동됨.

2. 투명 프록시 : 일반적 프록시와 역할은 같지만 사용자가 브라우저에 프록시 설정을 해야 하는 번거로움이 없음. 사용자의 요청을 방화벽에 의해 프록시 서버를 통하도록 포워딩한다.

3. 역 프록시 : 웹 서버 가속이라고 부른다. 웹 서버의 부하를 분산시킬 수 있다. 서버의 부하 분산을 위해 사용.

-> 사용자 쪽에서 동작하는 위 2개와 달리 서버 쪽에서 동작한다. 

-> 사설 네트워크의 입구에서 사용자로부터 요청을 받으면 내부의 서버에서 응답을 받아 사용자에게 전달. 여러 서버 중 적절한 서버를 골라 응답해주니 부하 분산 기능 수행

 

1, 2번은 클라이언트가 빨라지려고 쓰는 것(포워드 프록시), 3번은 서버 부담을 줄이고 빠르게 하려고 쓰는 것,

 

 

실습 준비 : 웹 서버 3개 설치

리눅스에서 웹 페이지 확인하기

-> yum -y install httpd : 아파치 설치

-> firewall-cmd --add-service=http --permanent : 방화벽 정책에 http 추가

-> firewall-cmd --reload / systemctl restart httpd : 방화벽, httpd 재시작

 

Windows에서 웹 페이지 확인하기

-> 서버 관리자에서 IIS 기능 추가

-> 기본 경로에 파일 작성


2교시

 

만들어둔 Slave를 내부 웹 서버로 두고, Master를 프록시 서버로 만들 예정. 외부에서 FIRST가 클라이언트로 접속.

마스터로 접속해도 슬레이브가 보이면 프록시 기능 성공.

 

프록시 모듈 설정 파일은 

/etc/httpd/conf.modules.d/00-proxy.conf에 있다.

LoadModule proxy_module modules/mod_proxy.so 이 부분이 프록시 모듈 부분. 안 쓸 거면 주석 처리

LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so : 요청 비율에 따라 내부 서버 부하 분산 기능이 있는 모듈. lbmethod = LoadBalancer method

LoadModule proxy_balancer_module modules/mod_proxy_balancer.so : LB를 가능하게 하는 모듈

LoadModule proxy_ajp_module modules/mod_proxy_ajp.so : WAS 서버로 프록싱할 때 사용하는 모듈

 

/etc/httpd/conf.d/proxy.conf 파일을 만들어서 

<IfModule mod_proxy.c>

   ProxyRequests off

#-> 포워드로 할지(on), 리버스로 할지(off) 결정

   <Proxy *>

      Require all granted   

   </Proxy>

 

   ProxyPass / http://192.168.111.200/   

#-> 앞의 / 는 마스터의 주소로 요청이 들어온다면 뒤의 주소로 보내겠다는 의미.

   ProxyPassReverse / http://192.168.111.200/

#-> 앞의 / 는 뒤의 주소가 응답할 때 마스터의 주소(192.168.111.100)로 출발지를 바꾸겠다는 의미.

</IfModule>

작성

 

마스터 서버를 포워드 프록시로 쓰려면 프록시 리퀘스트 on, 아래의 PP. PPR 지우기

외부의 사용자가 내부 서버의 주소를 알아서는 안된다. 그래서 ProxyPass와 ProxyPassReverse로 출발지/목적지 주소를 바꿔서 감추는 것.

이후 접속하면 접속 안됨. tail /var/log/messages로 에러 메시지 확인.

-> httpd_can_network_connect 부울 활성화 필요.

-> 웬만하면 첫 번째 제안 실행하면 해결됨.

 

해결할 때, setenforce 0로 SELinux 끄고 확인 -> 된다면 SELinux 문제, 안되면 httpd 문제.

 

에러 확인할 때

/var/log/messages : SELinux 차단 사항을 볼 수 있다.

/var/log/httpd/error_log : http 접속 관련 에러는 여기가 더 자세하다. 차단된 정보는 나오지만 SELinux 어디에서 차단되었는지는 안 나옴. 어디에서 차단되었는지 알려면 messages 파일을 보는 것이 좋다.


3교시

 

부하 분산(LB)을 적용한 리버스 프록싱

내부 서버를 FIRST, Slave로 둔다.

/etc/httpd/conf.d/proxy.conf 파일을 수정

<IfModule mod_proxy.c>

   ProxyRequests off

   <Proxy *>

      Require all granted

   </Proxy>

   ProxyPass / balancer://mycluster lbmethod=byrequests

#-> / (마스터 주소 : 192.168.111.100)로 요청이 들어오면 뒤의 주소로 보낸다.

#-> balnacer 모듈로, mycluster라는 이름으로 보낸다. 

#-> LB method는 byrequest 사용. 요청 건마다 LB를 하겠다.

   <Proxy balancer://mycluster>

#-> LB 설정. 위에서 보냈던 이름 입력

      BalancerMember http://192.168.111.200/ loadfactor=1

      BalancerMember http://192.168.111.10/ loadfactor=1

#-> LB 멤버 지정. 내부 멤버 주소 각각 작성

#-> loadfactor는 횟수. 1번씩 번갈아가며 보낸다는 의미. 더 많이 보내려면 해당 멤버의 loadfactor 수를 늘리면 된다.

   </Proxy>

</IfModule>

 

SELinux는 아까 해결해서 안 뜨는데, 문제 발생 시 똑같이 처리할 것.

 

지금까지는 Apache 웹 서버

아파치는 모듈을 사용해서 좀 무겁다. 스퀴드라는 프록시 전용 서버라는 것도 있다.

 

  • WAS(Web Application Server)

웹 앱과 서버 환경을 만들어 동작시키는 기능을 제공하는 SW 프레임워크. 인터넷 상에서 http를 통해 사용자 컴퓨터나 장치에 앱을 수행해 주는 미들웨어(SW 엔진)로 볼 수 있다. 웹 앱 서버는 동적 서버 콘텐츠를 수행하는 것으로 일반적인 웹 서버와 구별이 되며, 주로 DB 서버와 같이 수행된다.

한국에선 일반적으로 WAS, WAS SW로 통칭. 공공기관에서는 웹 응용 서버로 사용되고, 영어권에는 Application Server(AS)로 불린다.

 

정적/동적 콘텐츠의 구분

-> 클라이언트마다 다른 정보를 요청하거나, 뭔가 수정하는 것이 동적 콘텐츠. 응답도 다르게 하겠지.

-> 서버가 보내주는 기능만 보는 것이 정적 콘텐츠.

 

동적 콘텐츠를 이용하는 서버는 웹 상으로 파일을 전달하고, 클라이언트 브라우저에서 실행하는 방향이다.

동적 콘텐츠를 전문적으로 전달, 보관, 응답하는 서버가 WAS 서버.

 

Apache Tomcat 서버

자바 서블릿과 JSP 앱을 제공하기 위해 

 

Apache 서버와 Tomcat 서버 연동

연동 목적

1. 목적의 차이

톰캣은 자바 기반의 앱을 지원하는 서블릿 컨테이너. 아파치 서버는 이미지나 css 파일과 같은 정적 데이터뿐만 아니라 PHP 파일을 처리하는 웹 서버로서의 기능에 초첨을 맞출 경우 연동이 필요

2. 기능의 다양성

톰캣 서버는 아파치 서버에 비해 웹 서비스 기능이 다양하지 않음.

3. 부하분산

아파치 서버는 mod_jk나 mod_proxy 모듈을 사용해 부하분산 지원. 톰캣은 완벽한 부하분산 기능을 지원하지 않는다.

 

  • Servlet

웹 프로그래밍에서 글의 요청을 처리하고 그 결과를 다시 을에게 전송하는 서블릿 클래스의 구현 규칙을 지킨 자바 프로그래밍 기술. 간단히 말하면 자바를 사용해 웹을 만들기 위해 필요한 기술.

클라이언트가 어떤 요청을 하면 그에 대한 결과를 전송하는 역할을 하는 자바 프로그램

예시) 사용자가 아이디, 비번을 입력하고 로그인 버튼을 누름 -> 서버가 입력값 확인 -> 다음 페이지를 띄워줘야 한다.

이때 다음 페이지를 띄워주는 역할을 하는 것이 서블릿. 자바로 구현된 CGI라고 볼 수 있다.

 

마스터에 아파치 웹 서버, 슬레이브에 톰캣 웹 서버 설치. 슬레이브에 동적 콘텐츠(자바 앱)를 놓고, 마스터의 아파치에는 mod_jk, mod_proxy를 놓는다. 각각 80번, 8009번 포트 사용. 마스터에 정적 콘텐츠(html 파일)를 놓고, 톰캣의 동적 콘텐츠는 jsp를 둔다.

실습 환경 구성

192.168.111.100/index.html에 접근하면 마스터로 그냥 접근할 테고, 같은 주소의 index.jsp로 접근하면 프록시 기능에 의해 슬레이브의 파일로 접근 가능


4교시

 

서블릿 특징 : 클라이언트의 요청에 대해 동적으로 작동하는 웹 앱 컴포넌트

CGI : 라이브러리나 도구가 아니라, 별도 제작된 웹 서버와 프로그램 간의 교환 방식을 의미.

 

서블릿 컨테이너 : 서블릿을 관리해주는 컨테이너. 서블릿은 정의서, 서블릿 컨테이너는 정의서를 보고 수행

-> 클라이언트의 요청을 받아주고 응답할 수 있게 웹 서버와 소켓을 만들어 통신

-> 대표적 예시가 톰캣.

1. 웹 서버와의 통신 지원

2. 서블릿 생명주기 관리

3. 멀티스레드 지원 및 관리

4. 선언적 보안 관리

 

JSP : 자바 코드가 들어가 있는 HTML 코드

 

  • 실습 : 마스터를 아파치로, 슬레이브를 톰캣으로

yum -y install java

wget http://archive.apache.org/dist/tomcat/tomcat-8/v8.5.27/bin/apache-tomcat-8.5.27.tar.gz

-> wget이 없다면 yum install wgetvar/

tar zxvf apache-tomcat-8.5.27.tar.gz : 압축 해제

mv apache-tomcat-8.5.27 /usr/local/tomcat8

vi /etc/profile

-> 파일 마지막에

JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.302.b08-0.el8_4.x86_64

JRE_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.302.b08-0.el8_4.x86_64

CATALINA_HOME=/usr/local/tomcat8

CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$CATALINA_HOME/lib/jsp-api.jar:$CATALINA_HOME/lib/servlet-api.jar PATH=$PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.302.b08-0.el8_4.x86_64

추가


5교시

 

톰캣 설치로 대략 1~2시간을 삽질

 

yum -y install java-1.8.0-openjdk-devel.x86_64

/usr/local/tomcat8/conf/server.xml 수정

<Connector port~ 안쪽에

URIEncoding="UTF-8" 추가

lsof -i tcp:8080 입력하면 java가 떠야 정상

 

이런저런 추가/수정 후에 source /etc/profile과 /usr/local/tomcat8/bin/startup.sh 실행하니 연결 성공.

 

이제 /usr/local/tomcat8/webapps/ROOT/index2.jsp라는 JS App을 만들어 넣어둔다.

http://192.168.111.200:8080/index2.jsp 여기로 들어가면 해당 웹 페이지가 뜬다.

이렇게 만든 서버에 디렉트로 들어가려면 8080 포트였고, 마스터를 통해 동적 콘텐츠에 대한 요청이 들어오면 8009번 포트를 쓰게 될 것.

이럴 때 아파치에서 WAS 서버와 통신하려고 쓰는 모듈

 

/usr/local/tomcat8/bin/에 톰캣 관련 파일들 있다. 기억하기.

/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.302.b08-0.el8_4.x86_64 이 경로에 자바 관련 파일


6교시

 

슬레이브에 /etc/systemd/system/tomcat.service 파일 생성

 

mod_proxy/mod_proxy_ajp 모듈

/etc/httpd/conf.modules.d/00-proxy.conf에서 모듈 장착 확인

 

/etc/httpd/conf.d/proxy.conf 파일 수정

<IfModule mod_proxy.c>
          ProxyRequests off
          ProxyPreserveHost On
          <Proxy *>
                  Require all granted
          </Proxy>
         ProxyPass / ajp://192.168.111.200:8009/
         ProxyPassReverse ajp://192.168.111.200:8009/
</IfModule>


7교시~8교시

 

아파치(마스터)-톰캣(슬레이브) 연동

-> 192.168.111.100으로 접속하면 톰캣 화면이 나오도록

 

https://tomcat.apache.org/download-connectors.cgi

에서 커넥터 다운로드하여서 압축 풀고, 

tomcat-connectors-1.2.48-src/native 경로로 이동해서

yum -y install gcc gcc-c++ httpd-devel 설치

./configure --with-apxs=/usr/bin/apxs 실행

make ; make install

vi /etc/httpd/conf.d/mod_jk.conf 파일 만들어서 

LoadModule jk_module "/etc/httpd/modules/mod_jk.so"
<IfModule mod_jk.c>
JKWorkerFile /etc/httpd/conf/workers.properties
JKShmFile /var/run/httpd/mod_jk.shm
JKLogFile /var/log/httpd/mod_jk.log
JKLogLevel info
JKLogStampFormat "[%y-%m-%d %H:%M:%S]"
# 확장자 jsp, json, xml, do를 가진 경로는 woker tomcat으로 연결하는 구문입니다.
JkMount /*.jsp app1Worker
JkMount /*.json app1Worker
JkMount /*.xml app1Worker
JkMount /*.do app1Worker
</IfModule>

작성

mkdir -p /var/run/mod_jk

chown apache:apache /var/run/mod_jk

vi /etc/httpd/conf/workers.properties에서

workers.apache_log=/var/log/httpd
workers.list=app1Worker
workers.stat1.type=status
workers.app1Worker.type=ajp13
workers.app1Worker.host=192.168.111.200
workers.app1Worker.port=8009

작성

 

이머전시

얼럿

크리티컬

에러

워닝

노티스

인포메이션

버그

JKLogLevel에서 로그 메시지를 남길 때 심각도에 따라 남기는 것.


3교시(11:50~12:10) 정적 콘텐츠

7~8교시 아파치-톰캣 연동

 

교시별로 정리하니 괜찮은 것 같다.

'교육' 카테고리의 다른 글

[32일 차] 21.09.02 : Linux Server 11  (0) 2021.09.02
[31일 차] 21.09.01 : Linux Server 10  (0) 2021.09.01
[29일 차] 21.08.30 : Linux Server 8  (0) 2021.08.30
[메모] 21.08.29 : 할 일  (0) 2021.08.29
[28일 차] 21.08.27 : Linux Server 7  (0) 2021.08.27

댓글