환경: GCP Debian-10-buster
아파치 설치
sudo apt update && sudo apt -y install apache2
아파치를 설치하면
확인방법은 http://{IP주소}:80 으로 들어가면 아파치 기본 페이지가 뜬다.
아파치와 내장 톰캣 연동
아파치와 내장 톰캣을 연동하기 위해서는 mod_jk, mod_proxy 방식이 있는데 일단 mod_jk방식부터 설명하겠다.
mod_jk 설치
mod_jk는 아파치와 톰캣을 연동하기 위한 모듈로 AJP 통신을 가능하게 해준다.
또한 Load Balancing과 Fail Over을 통해서 안정적인 운영을 할 수 있도록 해준다.
위 환경에서 설치 방법은 아래의 커맨드를 통해 할 수 있다.
#mod_jk 설치
sudo apt-get install libapache2-mod-jk
#mod_jk 활성화
sudo a2enmod
workers.properties 생성
이후 workers.properties를 $APACHE_HOME/conf에 생성한다.
현재 서버에서는 /etc/apache2/conf/ 에 생성하도록 한다.
workers.properties의 내용은 아래와 같다.
여기서는 두개의 톰캣을 띄워서 연결한다고 가정한다. 두개를 로드밸런싱 해줄 수 있다.
worker.list=worker1
worker.list=worker1,worker2,load_balance //톰캣 두개 사용시 worker1,2를 넣고 각각 설정을 해주면 된다.
worker.worker1.port=18001 //AJP포트는 밑에서 내장 톰캣에서 세팅을 해줄 것이다.
worker.worker1.host=127.0.0.1
worker.worker1.type=ajp13
worker.worker1.lbfactor=1
worker.worker2.port=18002 //두개 이상의 tomcat을 사용하는 경우 두번째 worker 설정
worker.worker2.host=127.0.0.1
worker.worker2.type=ajp13
worker.worker2.lbfactor=1
worker.load_balance.type=lb
worker.load_balance.balanced_workers=worker1,worker2
jk.conf 파일 수정
/etc/apache2/mods-available/jk.conf
방금 생성해준 workers.properties를 가리키도록 수정을 해준다.
<IfModule jk_module> # We need a workers file exactly once # and in the global server #JkWorkersFile /etc/libapache2-mod-jk/workers.properties JkWorkersFile /etc/apache2/workers.properties
<IfModule jk_module>
# We need a workers file exactly once
# and in the global server
#JkWorkersFile /etc/libapache2-mod-jk/workers.properties
JkWorkersFile /etc/apache2/workers.properties
000-default.conf 파일 수정
/etc/apache2/sites-available/000-default.conf
만들어준 worker들과 url을 매핑해준다.
우리는 로드밸런싱을 통해 두개의 인스턴스에 나눠서 띄울거기 때문에 load_balance를 설정한다.
<VirtualHost *:80>
ServerAdmin webmaster@localhost //도메인이 연동되어 있으면 도메인으로 수정한다
#DocumentRoot /var/www/html
ServerName localhost
ServerAlias localhost
JkMount /* load_balance
</VirtualHost>
SpringBoot 설정
스프링부트 프로젝트를 하나 생성한다. 여기서는 김영한님의 스프링부트와 JPA 활용의 프로젝트를 이용했다.
application.yml 설정
yaml파일이나 properties의 값을 사용할 것이다.
tomcat:
ajp:
protocol: AJP/1.3
port: 8009
enabled: true
Tomcat 설정을 빈으로 등록
yaml파일에서 설정한 값을 사용해서 내장 톰캣을 설정한다.
@Configuration
public class TomcatConfig {
@Value("${tomcat.ajp.protocol}")
String ajpProtocol;
@Value("${tomcat.ajp.port}")
int ajpPort;
@Value("${tomcat.ajp.enabled}")
boolean tomcatAjpEnabled;
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
tomcat.addAdditionalTomcatConnectors(createAjpConnector());
return tomcat;
}
private Connector createAjpConnector() {
Connector ajpConnector = new Connector(ajpProtocol);
ajpConnector.setPort(ajpPort);
ajpConnector.setSecure(false);
ajpConnector.setAllowTrace(false);
ajpConnector.setScheme("http");
((AbstractAjpProtocol) ajpConnector.getProtocolHandler()).setSecretRequired(false);
return ajpConnector;
}
}
이렇게 설정이 완료 되었으면 빌들를 통해서 jar파일을 생성한다.
이 프로젝트는 gradle을 사용했으며 아래의 명령어를 통해 자바 애플리케이션을 실행했다.
./gradlew build -x test && java -jar build/lib/jpa-shop-0.0.1-SNAPSHOT.jar
이제 8080 포트를 통해 접속하면 자바 애플리케이션을 볼 수 있다.
아파치 재시작
아파치를 재시작하면 80번 포트에서 자바 애플리케이션으로 접속 되는걸 볼 수 있다.
sudo service apache2 start
추가적으로 자바 애플리케이션을 두개를 띄우기 위해서
application.yml을 아래와 같이 수정한다.
server:
port: 8081
tomcat:
ajp:
protocol: AJP/1.3
port: 8010
enabled: true
서버가 뜨는 포트는 8081번 포트이고 AJP 통신을 위한 포트를 8010을 사용한다.
이 후 빌드와 실행을 하면 자바 애플리케이션이 하나 더 뜨게 된다.
그리고 80번포트에 접속하면 마찬가지로 자바 애플리케이션이 보이는데 이때 만약 첫번째 띄운 인스턴스를 kill 하더라도 자바 애플리케이션은 계속 유지되는걸 볼 수 있다.
'서버' 카테고리의 다른 글
웹서버와 서블릿 컨테이너의 통신 (AJP) (0) | 2021.03.08 |
---|
댓글