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"== 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 한 줄로 바꾸고 다시 검증해도 통과합니다.
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"== 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 이 됐는지 확인했습니다.
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 \"%r\" %s %b %D ms\" />\n </Host>#" "$XML"== 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 "%r" %s %b %D ms" />
XML 유효성 검사 통과: server.xmlappBase 를 절대경로로 바꾸고 실제 폴더도 만들었습니다. 이 PC 에는 DRY_RUN 경로(WORK)가 앞에 붙지만, 실제 서버에서는 /app/webapps 로 그대로 찍힙니다.
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/== 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 블록은 아래와 같습니다.
<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 "%r" %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] 로만 찍힙니다. 실제 서버에서는 재시작 뒤 상태 코드로 기동을 확인합니다.