appsroot 님의 글 91
가상 스레드가 synchronized에서 고정될 때
Tomcat 10.1부터 요청 처리를 가상 스레드로 돌릴 수 있게 되면서, 스레드 풀 튜닝에 쏟던 고민이 한결 줄었다. 그런데 막상 운영에 올려보면 "가상 스레드를 켰는데 동시 처리량이 기대만큼 안…
TIME_WAIT 폭증으로 포트가 고갈될 때
Tomcat이 뒤쪽 DB나 외부 API로 연결을 열고 바로바로 닫는 구조, 또는 Nginx가 upstream으로 짧은 연결을 계속 맺는 구조에서 자주 보게 되는 증상이다. 평소엔 멀쩡하다가 트래픽이…
Tomcat AJP 연동에서 Ghostcat 막기
1. 개요 Apache HTTP Server 앞단에 Tomcat을 두고 AJP로 붙이는 구성은 오래된 WAS 현장에서 아직도 흔하다. 저도 구형 시스템을 넘겨받을 때마다 server.xml에 포트 …
Tomcat이 순간 폭주에 접속을 거부할 때
1. 개요 마케팅 푸시나 오픈 이벤트처럼 접속이 순간적으로 몰리는 서비스를 운영하다 보면, 평소엔 멀쩡하던 Tomcat이 몇 초 동안 클라이언트에 Connection refused 를 뿌리는 장면을…
RDS 페일오버 후 자바가 옛 IP로 붙을 때
DB 페일오버 자체는 몇십 초면 끝난다. 그런데 애플리케이션만 한참을 옛 IP에 매달려 있다가 결국 재기동으로 푸는 경우를 현장에서 자주 본다. 스탠바이로 승격은 됐고 DNS도 새 IP를 가리키는데…
Java 8에서 Java 25로 올릴 때 확인할 것
Java 8 지원 종료 이야기가 나올 때마다 "다음 분기에 하자"며 미뤄 둔 업그레이드 프로젝트가 어느 조직에나 하나쯤 있다. Tomcat 위에서 몇 년째 조용히 돌아가는 서비스라면 더 그렇다. 이…
WAS 종류 비교, JEUS부터 톰캣까지
WAS(Web Application Server) 도입이나 마이그레이션을 검토할 때마다 나오는 질문이 있다. "국산 상용, 외산 상용, 오픈소스 중 뭘 쓰나요." 이번 글에서는 국내에서 실제로 도입…
Nginx 502 'upstream sent too big header' - proxy_buffer_size, proxy_buffers, busy_buffers_size로 큰 응답 헤더 받기
1. 개요 백엔드 WAS 앞에 Nginx를 리버스 프록시로 두는 구성은 흔하다. 평소 잘 돌던 경로가 어느 날 특정 사용자, 특정 API에서만 502를 내뱉을 때가 있다. 로그인 직후나 세션이 커진…
Spring Boot에서 Logback JSON 구조화 로깅
운영 중인 서비스에서 장애 원인을 좇다 보면 로그가 텍스트 한 줄로 흩어져 있어 특정 요청만 뽑아보기 어려운 경우가 많다. 톰캣 접근 로그와 애플리케이션 로그를 grep으로 맞춰 보다가 시간만 쓴 …
Tomcat 11 가상 스레드 켜기와 maxThreads 스레드풀의 차이 - 처리량과 메모리 비교
Tomcat 스레드풀 이야기를 하면 늘 maxThreads=200 을 몇으로 올릴지가 화제였다. 블로킹 I/O가 많은 서비스에서 요청이 몰리면 스레드 200개가 다 대기에 물려 큐가 쌓이고, 그렇다…
ALB와 Nginx 뒤 Tomcat이 클라이언트 IP를 프록시 IP로 남길 때 RemoteIpValve로 바로잡기
ALB나 Nginx를 앞단에 두고 Tomcat을 뒤에 붙이는 구성은 흔하다. 그런데 이렇게 올리고 나면 액세스 로그에 찍히는 접속 IP가 전부 프록시 IP 한두 개로 도배되는 걸 발견하게 된다. 로…
Tomcat에 JPetStore (MyBatis) 올리기 + HSQLDB가 아닌 MySQL 연결하기
1. JPetStore 설정 JPetStore 소스는 https://github.com/mybatis/jpetstore-6 에 있는 것을 사용하였다. git clone https://github.c…