본문 바로가기
IT/Spring & Spring Boot

[Spring Boot/NGINX] 로그 없는 웹소켓 연결 에러

by 저당단 2025. 7. 8.

에러 상황

기존에는 배포서버에 test.com:8080/users 와 같이 8080 포트를 열어놓고 거기로 바로 요청을 보냈다.

하지만 이번에 ssl 인증서 갱신하는김에 test.com/api/users 와 같은 식으로 nginx의 /api에 리버스 프록시를 걸어놓고 nginx에서 ssl을 통제시키는 방향으로 변경하기로 했다.

 

그래서 nginx.conf와 백엔드 환경변수 설정까지 끝냈는데 이런게 떴다.

 

 

원인 찾기

일단 보다시피 브라우저 콘솔에는 실패했다고만 표시되고 그 밖에 다른 로그는 없다.

Spring Boot 콘솔과 var/log/nginx/error.log에도 아무런 에러 로그가 뜨지 않았다.

 

단서를 찾은 방법은 배포서버 안에서 curl -i http://localhost:8080/ws 로 요청을 보내 봤던 것이다.

백엔드 인터셉터 단에서 어떤 주소로 요청이 들어오는지 로그를 찍어보기로 했다.

 

???

/ws 로 3번 요청을 보냈는데 백엔드에서는 /ws가 아닌 /api/error 로 들어왔다.

 

 

원인과 해결

원인은 

spring.mvc.servlet.path=/api

에 있었다.

 

@RequestMapping("/users")를 자동으로 "/api/users"로 바꿔주는 환경설정인데, 알고보니 이게 웹소켓 핸들러까지 영향을 끼쳤던 것이다.

 

registry.addHandler(webSocketHandler, "/ws").setAllowedOrigins("*");

 

RequestMapping 뿐만 아니라 웹소켓 핸들러도 DispatcherServlet의 핸들링 범위에 포함되기 때문이었다.

그래서 결국 웹소켓에 연결하기 위해선 클라이언트가 /api/ws 로 요청을 줘야 했던거고 브라우저가 /ws로 요청하니까 자동으로 /api/error라는 괴상한 주소로 튕겨냈다 이렇게 볼 수 있을듯.

 

 

결론은 3시간넘게 날렸다. 끗.

교훈은 유료 챗 지피티라도 너무 믿지말자...

(제미나이로 바꿀지 진지하게 고민중임)

 

 

참고

https://docs.spring.io/spring-boot/docs/3.1.3/reference/html/howto.html?utm_source=chatgpt.com#howto.spring-mvc.switch-off-dispatcherservlet

 

“How-to” Guides

Spring Boot has no mandatory logging dependency, except for the Commons Logging API, which is typically provided by Spring Framework’s spring-jcl module. To use Logback, you need to include it and spring-jcl on the classpath. The recommended way to do th

docs.spring.io