아파치 재단의 최상위 프로젝트중에 하나인 톰캣은 무료지만 정말 빠르고 뛰어난 WEB/WAS 어플리케이션입니다.
물론 웹서버의 지존은 Apache가 있겠지만요, Apache + Tomcat 조합의 구성은 무료로 Java/JSP를 호스팅 할 수 있는 최상의 조건이 되지 않을까 생각합니다.
Tomcat을 사용하다 보면 root로 실행하는 경우가 많이 있는데요, 그러다 보면 톰캣도 root로 돌아가게 된다는 문제점이 생깁니다.
WAS가 root로 실행된다면? 안봐도 끔찍한 보안 문제가 많이 발생할 소지가 있습니다.
그렇다면 역시 다른 제한된 권한으로 실행하는 것이 좋을텐데요, 그중에서도 로그인조차 제한되어있는 nobody로 실행하는 방법을 알아보겠습니다.
톰캣은 /usr/local/tomcat 에 설치되어있다고 가정해 보겠습니다.
/etc/rc.d/init.d/catalina 라는 파일을 만들어 다음의 내용을 적어주고 700등의 권한을 주도록 합시다.
[code]#!/bin/sh
case “$1” in
start)
/usr/bin/sudo -u nobody /usr/local/tomcat/bin/startup.sh
;;
stop)
/usr/bin/sudo -u nobody /usr/local/tomcat/bin/shutdown.sh
;;
restart)
/usr/bin/sudo -u nobody /usr/local/tomcat/bin/shutdown.sh
sleep 1
/usr/bin/sudo -u nobody /usr/local/tomcat/bin/startup.sh
;;
*)
echo “$0 (start|stop|restart)”
esac[/code]
다음과 같은 방법으로 실행을 할수 있습니다.
[code]# 톰캣 시작
[eye@theeye /] $ /etc/rc.d/init.d/catalina start
# 톰캣 종료
[eye@theeye /] $ /etc/rc.d/init.d/catalina stop
# 톰캣 재시작
[eye@theeye /] $ /etc/rc.d/init.d/catalina restart[/code]
톰캣을 딜레이 없이 껐다키면 에러가 발생하는 경우가 있어 1초의 sleep을 걸었습니다.
하지만 RHEL등에서는 위의 명령이 에러가 나며 실행이 되지 않습니다.
다음과 같이 시작종료 명령 부분을 바꾸어 실행하시면 됩니다.
[code]# 시작 명령
su – nobody -s /bin/sh -c /usr/local/tomcat/bin/startup.sh
# 종료 명령
su – nobody -s /bin/sh -c /usr/local/tomcat/bin/shutdown.sh[/code]
Tag Archives: 리눅스

[L4 SWITCH] DSR 모드에서의 서버 네트워크 설정 방법
이번글은 서버관리자 입장에서의 글입니다. 네트워크 분야에서 일하시는 분들에게는 별볼일 없는 내용일 것입니다.
하지만 서버 관리자입장에서는 모르시는 분들도 있을꺼 같아 글을 적어봅니다.
보통 수많은 서버를 가지고 서비스를 하는 업체라면 L4 스위치가 한대이상 존재할 것입니다.
L4 스위치한대만으로도 엄청나게 빠른 속도로 많은 량의 분산처리를 위한 라우팅을 완벽하게 해내죠.
L4란 OSI 7계층을 공부하시면서 들오보셨을 텐데 Layer 4 라우팅을 하는 스위치라는 뜻입니다.
L4 스위치의 라우팅 모드중에 DSR(Direct Server Return)이라는 평범하지 않은 모드가 있습니다.
말그대로 서버에서 결과를 바로 리턴한다는 뜻이지요. 어떤것인지 다음의 그림을 보면서 설명 드리겠습니다.
위와 같은 네트워크 구조가 있다고 합시다. 위의 구조는 전형적인 DSR을 위한 구조이지만 우선 평범한 SLB(Server Load Balancer) 에 대해 설명 드리겠습니다.
편의를 위해 L3 스위치의 아이피는 표시하지 않았습니다. 123.123.123.123은 외부에 공개되는 아이피입니다.
저 아이피를 통해 웹서비스에 접속할 수 있습니다. 10.1.1.x 대의 아이피들은 잘 아시겠지만 내부 네트워크입니다.
이것을 보시면 외부 인터넷에서 L4를 거치지 않고는 웹서버들에게 접근할 수 없다는 것을 알 수 있습니다.
일반적인 로드밸런싱은 다음과 같은 방법으로 이루어 집니다. DSR용 구조라 설명이 좀 복잡합니다;;
SLB 접속 :
Internet → A → L3 Switch → B → L4 Switch → C → L3 Switch → D → Web Server 1 → D → L3 Switch → C → L4 Switch → B → L3 Switch → A → Internet
설명을 적으면서 계속 잘못되었다는 생각이 들지만 중요한점은 클라이언트의 Request와 서버의 Response가 둘다 L4를 거쳐간다는것만 알아주시면 됩니다.
하지만 DSR구조는 L4가 서버들의 로드밸런싱은 하지만 리턴은 서버에서 클라이언트에게 바로 리턴합니다. L4를 거치지 않습니다.
그렇다면 다음과 같은 방법으로 이루어 지겠죠.
DSR 접속 :
Internet → A → L3 Switch → B → L4 Switch → C → L3 Switch → D → Web Server 1 → D → L3 Switch → A → Internet
어떤 차이가 있는지 보이시나요? 답장은 L4를 거치지 않고 바로 클라이언트에게 전송됩니다.
하지만 여기서 서버에 추가적인 설정이 필요합니다.
클라이언트는 분명히 123.123.123.123으로 Request를 보냈기 때문에 마찬가지로 123.123.123.123으로부터 Response가 돌아와야 합니다.
하지만 10.1.1.2아이피를 가지고 있는 서버가 반환을 하였죠. 클라이언트의 컴퓨터는 답장을 받았지만 잘못된 패킷으로 인지하고 버려버리게 됩니다.
이래선 통신이 제대로 되질 못하죠. 해결 방법은 서버의 Loopback 주소를 변경하면 됩니다.
하지만 제가 무식하게 lo의 아이피를 127.0.0.1에서 123.123.123.123으로 바꿨더니 서버가 바보가 되더군요.
채널본딩을 사용하면 됩니다. lo가 특수한 장치라서 정상적인 설정 방법으로는 채널본딩이 안되지만 다음과 같은 명령어는 잘됩니다.
/sbin/ifconfig lo:0 123.123.123.123 netmask 255.255.255.255
이때 주의할것인 서브넷마스크가 255.255.255.255여야 한다는겁니다. 이렇게 함으로써 잘못된 Loopback주소를 브로드캐스팅 하는것을 막을 수있습니다.
[eye@theeye /] $ ifconfig eth0 Link encap:Ethernet HWaddr 00:0B:DB:95:0E:E1 inet addr:123.123.123.123 Bcast:123.123.123.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:30871472 errors:0 dropped:0 overruns:0 frame:0 TX packets:42803475 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:414432160 (395.2 MiB) TX bytes:1433412018 (1.3 GiB) Interrupt:185 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:30192781 errors:0 dropped:0 overruns:0 frame:0 TX packets:30192781 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:1340081608 (1.2 GiB) TX bytes:1340081608 (1.2 GiB) lo:0 Link encap:Local Loopback inet addr:123.123.123.123 Mask:255.255.255.255 UP LOOPBACK RUNNING MTU:16436 Metric:1
추가적으로 /etc/sysctl.conf에 다음의 내용을 추가하여 주도록 합시다.
net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.eth0.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2
이후에 sysctl -p 명령을 통해 설정을 적용하시면 됩니다. 잘 되나요?^^