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 인스턴스를 추가하여 애플리케이션 처리 용량을 확장할 수 있습니다.
'리눅스' 카테고리의 다른 글
| 좀비 프로세스(zombie processes)를 찾고 종료하는 방법 (0) | 2016.05.13 |
|---|---|
| Linux SVN(Subversion) 서버 설치 및 설정 가이드 (0) | 2016.04.04 |
| nginx upstream 블록의 주요 옵션과 사용법 (0) | 2016.03.16 |
| 리눅스에서 2TB 이상의 디스크를 사용하기 (0) | 2016.03.02 |
| Nginx HTTP Server Note (0) | 2016.03.02 |