log.error("Front 요청 1m 지난 후 Proxy Error")

in_ho_·2022년 11월 3일
0

log.error()

목록 보기
1/2
post-thumbnail

현상

  • Front에서 요청을 서버에 보냈을 때 서버가 로직을 처리하는 시간 동안 계속 대기하지 않고 1분이 초과되면 502 Proxy Error를 수신하는 현상.
  • Back에서는 Error와 무관하게 정상 수행(Front에 에러가 수신된 이후에도 정상적으로 로직 수행중)

환경

Back : Spring Framework
Front : RestAPI를 수신하는 SPA 방식
Server : Docker&Linux 환경
WAS : Tomcat

과정

1. Tomcat에서의 Timeout 설정

  • Tomcat의 server.xml에 timeout을 설정하는 값이 있다.
  • connectionTimeout : TCOP 연결된 후, 실제 요청이 수신될 때까지 대기하는 시간(ms), 기본값은 20000
  • keepAliveTimeout : keep-alive 시간을 설정, 연결을 닫기 전 다른 HTTP 요청을 기다리는 시간(ms), 기본값은 connectionTimeout

    Keep-Alive : 디바이스 간의 연결이 잘 되고 있는지 서로 주고 받는 메세지, HTTP는 connection less 방식으로 연결을 매번 끊고 새로 생성하기 때문에 Kepp-Alive를 사용하면 connection 연결을 유지하면서 호출하는 구조

  • asyncTimeout : 비동기 요청에 대한 기본 대기 시간(ms), 지정하지 않을 경우(30초)

2. Java에서의 request Timeout 설정

  • Back은 정상적으로 수행되므로 request를 읽던 중 에러가 발생한 것은 아닌 것으로 고려

3. Docker에서의 Timeout 설정

  • Docker는 이미지를 관리하는 도구로 알기 때문에 해당 영역이 요청과 관련된 설정을 수행하지 않을 것으로 고려, 하지만 docker를 제거하고 Tomcat을 올렸을 때도 동일한 현상 발생

4. JS Request Timeout

  • XMLHttpRequest, Ajax, Fetch 등의 방벙을 사용하여 서버에 timeout을 설정하여 요청하였으나 60s 이하의 제한은 가능하나 그 이상은 불가능한 것으로 확인하여 해당 사항이 아닌 것을 확인, 또한 timeout은 Proxy Error를 내리는 것이 아닌 요청 자체를 cancled시킨다.

5. Server 구성

  • 운영의 서버들은 외부에서 요청이 들어올 때 다이렉트로 들어오는 경우는 드물다, 프록시 서버에서 시간제한을 초과할 경우 해당 요청을 차단시킬 수 있습니다.

    프록시 서버, Proxy Server : 클라이언트가 자신을 통해 다른 네트워크 서비스에 접속할 수 있게 해주는 컴퓨터 시스템 또는 응용프로그램(서버와 클라이언트 사이의 중계기)
    리버스 프록시 서버,, Reverse Proxy Server : 웹서버 앞에 있는 프록시 서버를 의미

  • 리버스 프록시 서버의 대다수가 Nginx를 사용하므로 Nginx로 설명하자면 클라이언트가 요청을 보내게 되면 서버의 문 앞의 Nginx를 통해야 하고 이때 외부와 통신이 오래 지연된다면 시간 초과가 일어나게 됩니다. 이를 Gateway Timeout이 발생하게 됩니다.

  • GateWay Timeout의 종류

  1. connection_timeout : 기본값은 60s로 upstream 연결이 지연되는 경우 발생한다.
  2. send_timeout : 기본값은 60s로, 프록시 연결 후 데이터 전송이 지연되는 경우 발생, 사용자가 파일을 업로드하는 중에 업로드 속도가 매우 느려서 send_timeout을 초과하면 발생한다.(대용량 파일은 관리자나 지정된 사용자만 업로드하기 때문에 이 문제는 거의 발생하지 않는다.)
  3. read_timeout : 504, Gateway Timeout의 거의 모든 원인으로 upstream에 정상적으로 연결했고, 응답도 정상적으로 보냈으나 응답이 지연되는 경우에 발생

upstream : 컴퓨터 네트워크 기술 용어에서 업스트림(upstream)은 클라이언트나 로컬 기기(일반적으로 컴퓨터나 모바일기기)에서 서버나 원격 호스트(이하 서버)로 보내지는(전송되는) 데이터 또는 보내는 것을 의미한다

결론

소스에서 어떠한 작업을 할 수 있는 것이 아닌, 운영서버의 환경에 관련한 문제였다. 운영서버의 timeout을 조작할 수 있으면 최소한의 노력으로 이슈를 대응할 수 있겠지만 운영서버의 환경을 쉽사리 바꾸긴 어렵다.

그래서 대용량의 파일을 보낼 때 응답을 일정 주기로 내려줄 생각이다.(60s를 초과하지 않도록) 예를 들어 1GB의 파일이 업로드 된다고 할 때 해당 파일을 일정 크기, 특정한 조건에 따라 나누어 비즈니스 로직을 돌릴 생각이다.

Reference


0개의 댓글