본문 바로가기

리눅스

Nginx와 Tomcat을 이용한 항공 서비스 인스턴스(8087) 증설 방법

728x90
반응형

Nginx와 Tomcat을 이용한 항공 서비스 인스턴스(8087) 증설 방법

웹 서비스의 트래픽이 증가하거나 특정 기능에 대한 요청량이 많아지면 기존에 운영 중인 Tomcat 인스턴스만으로는 부하를 감당하기 어려운 상황이 발생할 수 있습니다.

 

이러한 경우 기존 Tomcat 인스턴스의 설정과 디렉터리 구조를 기반으로 추가 Tomcat 인스턴스를 구성하고 Nginx에서 트래픽을 분산하는 방법을 사용할 수 있습니다.

 

기존 Tomcat 8084 인스턴스를 기반으로 8087 인스턴스를 추가하고 Nginx의 Upstream 설정을 변경하여 /flight/ 항공 서비스 요청을 8084와 8087로 분산하는 작업 과정을 정리하였습니다.

전체적인 구성

구성

Nginx 설정 파일 백업

운영 중인 Nginx 설정을 수정하기 전에 먼저 기존 설정 파일을 백업합니다.

 

Virtual Host 설정을 백업합니다.

cp /etc/nginx/sites-available/www.onlinetour.co.kr.conf \
  /etc/nginx/sites-available/www.onlinetour.co.kr.conf_20160322

기존 Upstream 설정도 백업합니다.

cp /etc/nginx/conf.d/upstream_galileoweb_8084_http.conf \
  /etc/nginx/conf.d/upstream_galileoweb_8084_http.conf_20160322

Nginx Virtual Host 설정 확인

파일 수정

vim /etc/nginx/sites-available/www.onlinetour.co.kr.conf
# 항공
location /flight/ {
  proxy_pass http://galileoweb-8084-http;
  proxy_set_header Host $host;
  include proxy_params_utf8;
}

Nginx가 직접 localhost:8084로 요청을 전달하는 것이 아니라 galileoweb-8084-http라는 Upstream 그룹을 사용하도록 구성되어 있습니다.

따라서 실제 서버 증설은 Virtual Host 설정 자체를 변경하기보다는 Upstream에 새로운 Tomcat 인스턴스를 추가하는 방식으로 진행할 수 있습니다.

Nginx Upstream에 8087 추가

파일 수정

vim /etc/nginx/conf.d/upstream_galileoweb_8084_http.conf
upstream galileoweb-8084-http {
  ip_hash;
  server localhost:8084;
  server localhost:8087;
}

이제 Nginx 입장에서는 하나의 Upstream 그룹에 두 개의 Tomcat 인스턴스가 존재하게 됩니다.

ip_hash란?
ip_hash는 클라이언트 IP를 기준으로 특정 Upstream 서버에 요청을 연결하는 방식입니다.
다만 ip_hash는 세션 유지 목적 등으로 사용되는 경우가 있으므로 실제 서비스에서 세션 상태를 어떻게 관리하는지 확인한 후 적용하는 것이 중요합니다.
또한 NAT 환경이나 여러 사용자가 동일한 공인 IP를 사용하는 환경에서는 특정 백엔드에 트래픽이 편중될 수 있다는 점도 고려해야 합니다.

Nginx 설정 문법 검사

 

nginx -t

Nginx Reload

service nginx reload

Tomcat 8087 인스턴스 생성

기존 Tomcat 8084 인스턴스를 복제하여 8087 인스턴스를 만드는 방식입니다.

 

Tomcat 설치 경로 이동

cd /var/lib/tomcat7

기존 8084 디렉터리를 복사합니다.

cp -rf /var/lib/tomcat7/8084 /var/lib/tomcat7/8087

Tomcat 8087 디렉터리 권한 변경

chown -R tomcat7.tomcat7 /var/lib/tomcat7/8087

불필요한 디렉터리 삭제

  • 8084 인스턴스를 복제했기 때문에 기존 인스턴스에서 생성된 데이터가 그대로 복사됩니다.
cd /var/lib/tomcat7/8087
rm -rf upload
rm -rf webapps
rm -rf newrelic
rm -rf logs
rm -rf work

특히 logs와 work는 이후 8087 전용 디렉터리를 별도로 생성할 예정입니다.

Tomcat server.xml 설정

새로운 Tomcat 인스턴스를 만들었으므로 server.xml을 확인하고 8087 인스턴스에 맞는 포트 정보를 설정합니다.

 

Tomcat의 대표적인 포트

  • HTTP Connector
  • Shutdown Port
  • AJP Connector
vi /var/lib/tomcat7/8087/conf/server.xml
<Connector port="8087" ... />

Tomcat 로그 디렉터리 생성

  • Tomcat 8087 인스턴스의 로그를 별도로 관리하기 위해 로그 디렉터리를 생성합니다.
cd /var/log/tomcat7
mkdir -p /var/log/tomcat7/8087
chown -R tomcat7.adm 8087

Tomcat logs 심볼릭 링크 생성

  • Tomcat 인스턴스에서 사용할 logs 디렉터리를 생성한 외부 로그 디렉터리와 연결합니다.
ln -s /var/log/tomcat7/8087 /var/lib/tomcat7/8087/logs
Tomcat 설치 영역과 로그 영역을 분리하여 관리할 수 있다는 장점이 있습니다.

Tomcat work 디렉터리 생성

  • Tomcat의 work 디렉터리 역시 8087 인스턴스 전용으로 구성합니다.
mkdir -p /var/cache/tomcat7/8087
chown -R tomcat7.adm /var/cache/tomcat/8087

Tomcat 8087 인스턴스의 work 디렉터리와 연결합니다.

ln -s /var/cache/tomcat7/8087 /var/lib/tomcat7/8087/work

이렇게 구성하면 Tomcat 인스턴스별 캐시 및 작업 영역을 독립적으로 관리할 수 있습니다

Tomcat 8087 JVM 파라미터 설정

기존 8084 설정을 복사합니다.

cp /etc/default/tomcat7-8084 /etc/default/tomcat7-8087

Nginx

vim /etc/default/tomcat7-8087
JAVA_OPTS="-Djava.awt.headless=false \
-Xms2048m \
-Xmx2048m \
-XX:PermSize=512m \
-XX:MaxPermSize=512m \
-XX:+UseConcMarkSweepGC \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/tomcat7/HeapDump/8087/java_pid_$(date +%Y%m%d%H%M%S).hprof \
-Djdk.tls.client.protocols=TLSv1,TLSv1.1,TLSv1.2 \
-Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2 \
-Ddeployment.security.TLSv1=true \
-Ddeployment.security.TLSv1.1=true \
-Ddeployment.security.TLSv1.2=true \
-Dsun.security.ssl.allowUnsafeRenegotiation=false"
  • Initial Heap : 2048 MB
  • Maximum Heap : 2048 MB

초기 Heap과 최대 Heap을 동일하게 설정하면 JVM Heap 크기를 일정하게 유지할 수 있습니다.

OutOfMemoryError Heap Dump 설정
-XX:+HeapDumpOnOutOfMemoryError
JVM에서 OutOfMemoryError가 발생하면 Heap Dump를 생성하도록 설정합니다.
Heap Dump 경로 : /var/log/tomcat7/HeapDump/8087/
파일명에는 JVM PID와 생성 시간이 포함되도록 구성되어 있습니다.
java_pid_$(date +%Y%m%d%H%M%S).hprof

예를 들어 다음과 같은 파일이 생성될 수 있습니다.
java_pid_20260826213000.hprof
Heap Dump는 Java 애플리케이션의 메모리 문제를 분석할 때 유용하게 사용할 수 있습니다.

HeapDump 디렉터리 생성

  • Heap Dump를 저장할 디렉터리를 미리 생성합니다.
mkdir -p /var/log/tomcat7/HeapDump/8087
chown -R tomcat7.tomcat7 /var/log/tomcat7/HeapDump/8087

Tomcat 8087 서비스 등록

cp /etc/init.d/tomcat7-8084 /etc/init.d/tomcat7-8087
chmod 755 /etc/init.d/tomcat7-8087
update-rc.d tomcat7-8087 defaults

Tomcat 8087 기동

service tomcat7-8087 start
service tomcat7-8087 status

8087 포트 Listen 확인

netstat -lntp | grep 8087
LISTEN  0  100  0.0.0.0:8087  0.0.0.0:*
ss -lntp | grep 8087

Tomcat 로그 확인

ls -lh /var/log/tomcat7/8087/
tail -f /var/log/tomcat7/8087/catalina.out

요청 흐름

Client
  │
  │ /flight/
  ▼ Nginx 
  │
  ▼ galileoweb-8084-http
  │
  ├──────────────┐
  ▼              ▼
8084            8087
Tomcat          Tomcat 
  │              │ 
  └──────┬───────┘
         ▼
      항공 서비스

 

기존 서비스를 중단하지 않고 동일한 서버 내에 Tomcat 인스턴스를 추가하여 애플리케이션 처리 용량을 확장할 수 있습니다.

 

728x90
반응형