최근 프로젝트에서 api를 구현하고 테스트하는 과정에서 '504 Gateway Timeout' 오류를 만났다. 로컬 환경에서는 문제없이 잘 동작했는데 개발 서버에 배포된 후 사용자로부터의 요청에 대한 응답 시간이 60초가 넘어가면 '504 Gateway Timeout'을 뱉어냈다. 이번 포스팅에서는 해당 문제를 해결했던 과정을 정리해보고자 한다.
1. 문제점
'504 Gateway Timeout'은 웹 서버가 클라이언트로부터의 요청을 받았으나, 게이트웨이나 프록시 서버를 통해 다른 서버로부터 시간 내에 적절한 응답을 받지 못했을 때 발생한다. 문제가 발생한 api는 외부 api로부터 stt처리를 하고 해당 데이터를 저장하는 로직으로 영상 길이에 따라 처리시간이 1분 이상이 걸리는 구조였다.
처음엔 코드의 비효율성이나 외부 API 호출의 지연, 데이터베이스의 느린 조회 속도 등의 문제로 보고 로직을 살펴보았다. 로컬 환경에서는 이러한 문제가 발생하지 않았기 때문에, 개발 서버 설정에 의해 나타나는 문제라고 생각했다. 문제가 서버 설정 또는 네트워크 구성에 있을 가능성이 높다고 판단했다.
2. 해결과정
초기접근
아키텍처 구조가 EC2 인스턴스-로드밸런서-Nginx구조로 되어 있기 때문에 처음에는 Nginx 설정을 주로 살펴봤다.
시도1 : Nginx 설정검토
Nginx는 웹 서버와 리버스 프록시의 역할을 하며, 요청과 응답을 중계하는 중요한 역할을 하기 때문! 하지만 Nginx 설정에서는 문제의 원인을 찾을 수 없었다. 아무리 설정파일(default.conf)을 봐도 필요한 값들이 잘 설정되어 있었다
proxy_send_timeout 7200;
proxy_connect_timeout 7200;
proxy_read_timeout 7200;
send_timeout 7200;
시도2 : 로드밸런서 설정확인
Nginx에서 원인을 찾지 못한 후, 로드밸런서의 설정을 점검했다. AWS 콘솔을 확인하다가 'Connection idle timeout'값을 확인하게 되었다.
'Connection idle timeout'은 특정 연결이 어떠한 데이터도 전송하지 않고 유휴 상태(idle)로 있을 수 있는 최대 시간으로 클라이언트와 서버 사이의 연결이 활성 상태에서 아무런 데이터 교환이 없을 때, 이 연결을 얼마나 오래 유지할 것인지 결정하는 시간 설정이다. 설정된 시간이 경과한 후에는 유휴 상태의 연결이 자동으로 종료된다.
이러한 'Connection idle timeout'의 시간 설정이 60초로 되어 있었다!
Connection idle timeout값이 짧을 경우 나와 같이 복잡한 계산이나 대용량 데이터 처리가 필요한 요청의 경우, 이 시간 내에 처리를 마치기 어렵고 '504 Gateway Timeout'이 발생한다.
따라서 Connection idle timeout설정을 적절하게 늘려주면서 문제가 해결되었다!
3. 결론
이번 경험을 통해 백엔드 시스템의 성능 최적화와 함께 인프라 구성에 관련된 세세한 설정들의 중요성을 다시 깨닳았다. 특히 클라우드 환경에서 작업을 진행할 때, 이러한 설정들에 대한 정확한 이해가 필요하다는 것을 배웠다. 인프라 측면에서는 설정에 대해 알아야 할 것이 많고, 관련하여 오류가 발생하면 대처하기 위해 많은 걱정을 하게 되는데, 이번 오류를 통해 문제를 해결하는 과정에서 필요한 지식과 경험을 쌓을 수 있었다.
또한, 성능 문제나 오류 상황을 해결하기 위해서는 단순히 코드 레벨의 문제 해결 능력뿐만 아니라, 인프라와 네트워크 설정 같은 백엔드 시스템 전반에 대한 깊은 이해가 필요함을 다시 한번 느꼈다. 그래서 결론은 항상 똑같이 공부를 열심히하고 많은 경험을 해봐야겠다!
'개발 하나둘셋' 카테고리의 다른 글
FFmpeg에서 자막을 처리하는 Subtitles 필터와 DrawText 필터 (0) | 2024.10.27 |
---|