회사에서 출시했던 앱에서 간혈적으로 에러페이지로 이동되는 현상이 확인되었다
재현 경로는 파일 업로드 API 호출시 토큰이 만려된 서버에서 401 응답을 하지만 확률적으로 Nginx에서 502를 뱉던것

참 난감했던게 10번중 10번 다 502가 뜨면 원인이 명확할텐데
10번중 1~2번만 502가 뜨니까 이게 뭐지? 싶었다
그래서 시스템보안팀 쪽에 문의했지만 명쾌한 답변은 얻을수 없었다
그쪽 팀에서도 잘 모르는것 같았다
Nginx error log를 확인해 봤는데 에러는 찍혀있어서 다행이다
sendfile() failed (32: Broken pipe) while sending request to upstream
파이프가 부서졌다는데 Nginx와 통신을 위해 연결된 무언가가 연결을 끊었다? 는 느낌이 들긴했지만 저게 뭔데?
3일동안 삽질만하다가 나와 같은 현상의 레퍼런스를 찾았다
https://github.com/miguelgrinberg/Flask-HTTPAuth/issues/29
http auth with nginx and uwsgi · Issue #29 · miguelgrinberg/Flask-HTTPAuth
Recently I use flask + uwsgi + nginx to make a server and I use Flask-HTTPAuth to do the digest auth in flask. Most ot time it works fine but when I do a large post (let's say 3M) then I got 502 er...
github.com
해당 이슈의 맨 마지막 글에서 이거다 싶었다

그래서 클라쪽에서 close로 보내는지 Nginx에서 프록시되어 close로 오는지 확인하기 위해
테스트 요청을 하나 해봤는데 클라에서 keep-alive 로 요청 => 서버에서 close 옵션으로 들어오는걸 확인했다
시스템 팀에 Nginx에
proxy_http_version
proxy_set_header Connection
각각 어떻게 설정되 있는지 물어보니
설정되있는건 없다고 한다...
그래서 Nginx는 기본값인 http 버전 1.0으로 프록시를 시켜 Connection 옵션이 close 로 변환되어 왔던것
proxy_http_version 1.1;
proxy_set_header Connection "";
이렇게 수정 요청을 하고 나니 간혈적 502 반환 문제는 해결되었다
결국 원인은
1.Nginx 에서 Nest 서버로 파일 스트리밍 중
2.서버는 Guard에서 401 반환
3.서버 입장에서는 Connection 옵션이 close 이므로 TCP 연결 종료
4.Nginx는 파일 스트리밍 중 연결이 끊긴걸로 판단 502를 뱉던것
간혈적으로 502가 뜬것은 파일 용량이 작아서 그렇다(최대 10mb 까지 허용이였으니)
'이것저것' 카테고리의 다른 글
| AI 응답 속도 개선하기 (2) | 2024.08.21 |
|---|---|
| 동적 객체 생성 vs 정적 객체 생성 (0) | 2024.04.30 |
| 다마고치 응가 기능 어떻게 구현하지 (0) | 2024.04.24 |
| 쿠키, 세션, 토큰 (0) | 2024.03.28 |
| webpack 개념과 탄생 배경 (0) | 2024.03.21 |