[Web/Error] Nginx 504, Nginx 502 에러 해결(Feat. Gunicorn)

이수진·2022년 3월 25일
7
post-custom-banner

제가 이번에 마주한 에러는
Nginx 504 Gateway Timeout 과,
Nginx 502 Bad Gateway 에러였습니다.

일단 5자로 시작하는 에러만 봐도 무섭습니다..
월요일인가 프론트 팀원에게 연락이 왔었는데,
백 서버로 요청이 안된다는 것이었습니다.

며칠 간 새로 배포를 진행한 적도 없었기에,
서버 문제인 것이 당연했고,
확인해보니 Nginx 504 Gateway Time-out 에러가 떴더라구요.


1. Nginx 504 Gateway Timeout

웹서버로 Nginx를 사용하다 보면 504 Gateway Time-out Error가 발생할 때가 있다고 합니다.
그 이유는 서버와 클라이언트간 proxy 연결 시간이 default인 60초를 넘어서 나타나는 것이라고 합니다.

그래서 저희 nginx.conf 파일을 직접 찾아보았습니다.

...(윗부분 생략)

server {

  listen 80;

  location / {
    proxy_pass http://myplanit;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
    proxy_redirect off;
  }

  location /static/ {
    alias /home/app/web/static/;
  }

  location /media/ {
    alias /home/app/web/media/;
  }
}

...(아랫부분 생략)

찾아보니 timeout에 대한 추가 설정을 하지 않았더라고요
그러므로 default인 60초로 설정되었을 것이고,
서비스가 고도화되다보니 서버-클라이언트간 proxy 연결 시간이 default를 넘어가서 time-out 에러가 난 것이었습니다.

찾아보니 해결 방법은 간단했습니다.
server에서 proxy timeout에 대한 설정만 해주면 되는 것이었습니다.

즉 해당 proxy 설정 부분 아래에
(proxy_redirect off; 아래부분)

    proxy_connect_timeout 300s;
    proxy_send_timeout 300s;
    proxy_read_timeout 300s;
    send_timeout 300s;

를 추가해줌으로써, 연결 시간을 늘려주었습니다.

전 이 이후에 정말 해결될 줄 알았습니다.
그런데 바로 에러명만 바뀌어서 또 에러가 떴습니다.


2. Nginx 502 Bad Gateway

사실 이 에러는 .. 정말 어디서 터졌는 지 직접 컨테이너 들어가서 까보지 않는 이상 어디서 났는지 발견하기 어렵습니다 ㅠㅠ
그냥 도커 컨테이너 들어가서 logs로 까보는 수밖에 ㅠㅠ

Nginx 서버에서 timeout 설정도 해주었고, Nginx 서버도 재시작했는데도 작동하지 않았습니다.
정말 열심히 구글링 한 결과,

💡Nginx - Gunicorn을 사용하여 두 대의 서버에서 웹 사이트를 호스팅할 때,
Gunicorn에서도 시간 초과가 났을 수도 있다라는 것이었습니다.💡

먼저, 말씀드릴 것은 저희의 개발 환경이
client - Nignx - Gunicorn - Django 이렇게 보시면 될 것 같습니다 (➡️ 웹 서버로는 Nginx, WSGI 서버로는 Gunicorn을 사용했습니다.)

그래서, Gunicorn의 구성에서도 Gunicorn의 시간 초과 플래그를 늘려야 한다는 것이었습니다.
(Gunicorn의 default 시간 초과는 30초라고 합니다)

Gunicorn의 공식 문서 페이지를 보면 다음과 같습니다.

command line 에 옵션으로 시간 초과에 대한 추가 명령을 붙일 수 있다고 합니다.

command: gunicorn myplanit.wsgi:application --bind 0.0.0.0:8000 --timeout=120

그래서 web 서버에서 gunicorn에 대한 설정을 해주는 command에 다음과 같은 timeout 옵션을 추가해 gunicorn의 시간 초과에 대해서도 설정을 해주었습니다.

결과적으로 서버는 다시 잘 돌아갔습니다.

추가적으로, 지금 회사에서 장고 개발자로 일하고 있는 제 친구가 알려줬는데
502 에러가 보통은 타임아웃이지만,
🔥웹서버 Nginx는 통과하고 뒷단의 WAS에서 문제가 터지면 모든 에러가 다 502로 뜬다고 합니다🔥
제 친구는 메모리 문제로도 502 에러가 떴다고 하더라구요

참고하면 좋을 것 같습니다.

이번 에러를 정리해보자면,

504 --> nginx timeout --> nginx timeout 설정으로 해결
502 --> gunicorn timeout --> gunicorn timeout 설정으로 해결

점점 서비스 고도화 작업에 들어가니,
더 많은 에러를 마주하는 것 같습니다.
ec2 용량이 터지는 등, proxy 연결 시간이 default를 넘어가는 등..

초기 개발보다 오히려 지금 더 많은 에러와 상황을 접하고 있고, 더 많이 배워가는 것 같습니다. 긍정적으로 생각할려구요🥰

profile
꾸준히, 열심히, 그리고 잘하자
post-custom-banner

0개의 댓글