공공부하자개발 · 영어 학습 노트
리눅스
웹 서버Tomcat · Nginx 설치와 설정0/8 완료
  • 01Tomcat 설치
  • 02Tomcat server.xml 설정
  • 03Tomcat 인스턴스와 JVM 옵션
  • 04Tomcat 보안과 운영 점검
  • 05nginx 설치
  • 06nginx 리버스 프록시
  • 07nginx HTTPS
  • 08nginx 로드밸런싱과 운영
사이트 소개개인정보처리방침연락처
© 2026 공부하자
홈 › 웹 서버 › 02 / 8

Tomcat server.xml 설정

섹션 7진행 0 / 8
1왜 배우는가2핵심 원리3코드 예제4응용 변형 예제5자주 하는 실수 (Tip)6연습 문제7정리‹ 이전다음 ›

3. 코드 예제

예제 1: 기본 server.xml 생성과 포트 변경 — 01_tomcat_server_xml.sh 발췌

bash
cat > "$XML" <<'EOF'
<Server port="8005" shutdown="SHUTDOWN">
  ...
    <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" secretRequired="false" />
EOF
validate "$XML"
# Server 의 port 속성이 곧 shutdown 포트, 8080 은 다른 앱과 겹쳐 8090 으로
sed -i 's/port="8005" shutdown="SHUTDOWN"/port="8006" shutdown="SHUTDOWN"/' "$XML"
sed -i 's/<Connector port="8080"/<Connector port="8090"/' "$XML"
text
== 1. 기본 server.xml 생성 ==
  XML 유효성 검사 통과: server.xml
2:<Server port="8005" shutdown="SHUTDOWN">
8:    <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
9:    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" secretRequired="false" />
== 2. 포트와 종료 포트 변경 ==
2:<Server port="8006" shutdown="SHUTDOWN">
8:    <Connector port="8090" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
9:    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" secretRequired="false" />
  XML 유효성 검사 통과: server.xml

기본 파일을 만들자마자 검증이 통과합니다. 종료 포트와 HTTP 포트를 각각 sed 한 줄로 바꾸고 다시 검증해도 통과합니다.

예제 2: HTTP 커넥터 옵션과 AJP 제거 — 01_tomcat_server_xml.sh 발췌

bash
sed -i 's#<Connector port="8090" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />#<Connector port="8090" protocol="HTTP/1.1" maxThreads="150" acceptCount="100" connectionTimeout="20000" compression="on" URIEncoding="UTF-8" maxPostSize="2097152" maxSwallowSize="2097152" redirectPort="8443" />#' "$XML"
grep -c 'protocol="AJP/1.3"' "$XML"
sed -i '/protocol="AJP\/1.3"/d' "$XML"
grep -c 'protocol="AJP/1.3"' "$XML"
text
== 3. HTTP 커넥터 옵션 적용 ==
8:    <Connector port="8090" protocol="HTTP/1.1" maxThreads="150" acceptCount="100" connectionTimeout="20000" compression="on" compressibleMimeType="text/html,text/css,application/javascript,application/json" URIEncoding="UTF-8" maxPostSize="2097152" maxSwallowSize="2097152" redirectPort="8443" />
  XML 유효성 검사 통과: server.xml
== 4. AJP 커넥터 제거 ==
1
0
  XML 유효성 검사 통과: server.xml

한 줄짜리 Connector 라 sed 로 통째로 바꿔 치기가 쉽습니다. AJP 줄은 grep -c 로 있는지 먼저 세고, 지운 뒤 다시 세어 0 이 됐는지 확인했습니다.

예제 3: Host appBase 분리와 AccessLogValve — 01_tomcat_server_xml.sh 발췌

bash
mkdir -p "$ROOT$BASE/webapps"
sed -i "s#appBase=\"webapps\"#appBase=\"$ROOT$BASE/webapps\"#" "$XML"
mkdir -p "$ROOT$BASE/logs"
sed -i "s#^      </Host>\$#        <Valve className=\"org.apache.catalina.valves.AccessLogValve\" directory=\"$ROOT$BASE/logs\" prefix=\"localhost_access_log\" suffix=\".log\" pattern=\"%h %l %u %t \&quot;%r\&quot; %s %b %D ms\" />\n      </Host>#" "$XML"
text
== 5. Host appBase 분리 ==
10:      <Host name="localhost" appBase="WORK/app/webapps" unpackWARs="true" autoDeploy="true">
  XML 유효성 검사 통과: server.xml
== 6. AccessLogValve 추가 ==
11:        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="WORK/app/logs" prefix="localhost_access_log" suffix=".log" pattern="%h %l %u %t &quot;%r&quot; %s %b %D ms" />
  XML 유효성 검사 통과: server.xml

appBase 를 절대경로로 바꾸고 실제 폴더도 만들었습니다. 이 PC 에는 DRY_RUN 경로(WORK)가 앞에 붙지만, 실제 서버에서는 /app/webapps 로 그대로 찍힙니다.

예제 4: RemoteIpValve 추가와 최종 확인 — 01_tomcat_server_xml.sh 발췌

bash
sed -i "s#^      </Host>\$#        <Valve className=\"org.apache.catalina.valves.RemoteIpValve\" remoteIpHeader=\"X-Forwarded-For\" protocolHeader=\"X-Forwarded-Proto\" internalProxies=\"127\\.0\\.0\\.1|10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\" />\n      </Host>#" "$XML"
validate "$XML"
run systemctl restart tomcat
run curl -s -o /dev/null -w '%{http_code}\n' http://localhost:8090/
text
== 7. RemoteIpValve 추가 ==
12:        <Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="X-Forwarded-For" protocolHeader="X-Forwarded-Proto" internalProxies="127\.0\.0\.1|10\.\d{1,3}\.\d{1,3}\.\d{1,3}" />
  XML 유효성 검사 통과: server.xml
== 8. 최종 확인과 적용 ==
  XML 유효성 검사 통과: server.xml
3
  [dry] systemctl restart tomcat
  [dry] curl -s -o /dev/null -w %{http_code}\n http://localhost:8090/

완성된 Host 블록은 아래와 같습니다.

xml
<Host name="localhost" appBase="/app/webapps" unpackWARs="true" autoDeploy="true">
  <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/app/logs" prefix="localhost_access_log" suffix=".log" pattern="%h %l %u %t &quot;%r&quot; %s %b %D ms" />
  <Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="X-Forwarded-For" protocolHeader="X-Forwarded-Proto" internalProxies="127\.0\.0\.1|10\.\d{1,3}\.\d{1,3}\.\d{1,3}" />
</Host>

systemctl restart 와 확인용 curl 은 이 PC 에 systemd 가 없어 [dry] 로만 찍힙니다. 실제 서버에서는 재시작 뒤 상태 코드로 기동을 확인합니다.

예제 직접 실행

아래 폴더의 셸 스크립트를 RHEL 또는 Git Bash 에서 실행합니다. 리눅스 전용 명령은 DRY_RUN=1 을 붙이면 실행하지 않고 명령만 출력합니다.

cd web-src/02_tomcat_server_xml
ls *.sh
DRY_RUN=1 bash <스크립트>.sh
코드 예제
  • 예제 1: 기본 server.xml 생성과 포트 변경 — 01_tomcat_server_xml.sh 발췌
  • 예제 2: HTTP 커넥터 옵션과 AJP 제거 — 01_tomcat_server_xml.sh 발췌
  • 예제 3: Host appBase 분리와 AccessLogValve — 01_tomcat_server_xml.sh 발췌
  • 예제 4: RemoteIpValve 추가와 최종 확인 — 01_tomcat_server_xml.sh 발췌
이전 섹션2 핵심 원리3 / 7다음 섹션4 응용 변형 예제