wafflestudio/seminar-2020

service nginx start 시 502 Bad gateway문제

canoneod opened this issue · 6 comments

(3)번을 하던 중 문제가 생겨 질문남깁니다. 사이트로 접근이 안되는 것 같아 error.log를 봤는데 아래와 같이 나왔습니다.

2020/11/06 03:43:24 [error] 2692#0: *8 connect() to unix://home/ec2-user/waffle-backend_uwsgi.sock failed (111: Connection refused) while connecting to upstream, client: 112.201.171.32, server: _, request: "GET /currentsetting.htm HTTP/1.1", upstream: "uwsgi://unix://home/ec2-user/waffle-backend_uwsgi.sock:", host: "3.21.162.66"

위와 같이 보여 권한문제 때문인가 싶어 chmod로 외부에서 접근할 수 있도록 하였고, 인스턴스 보안그룹의 인바운드 규칙도 체크하였으나 이상이 없어 추가로 어떤 것을 봐야할지 감이 안잡힙니다...

(추가)
seminar4AWS EC2에서 Nginx로 React 앱 직접 배포하기를 참고하여
/etc/nginx/nginx.conf와 ./sites-enabled 및 ./sites-available 경로에서 waffle-backend.conf를 생성하여 실행하였습니다. 이때 sudo nginx -t 로 문법을 체크했을때는 이상이 없다고 나왔습니다.

마찬가지로 uwsgi --ini <경로명>을 통해 uwsgi가 실행되어 이에따라 *.sock, *.log 파일이 생성되는 것도 확인하였습니다.

위의 작업은 가상환경에서 설정하여 실행했는데, /home/ec2-user/waffle-rookies-18.5-backend-2/ 에서 생성하여 해당 경로를 .ini파일의 virtualenv 경로 지정 부분에
home = /home/ec2-user/waffle-rookies-18.5-backend-2/.pyenv/waffle-backend
virtualenv = /home/ec2-user/waffle-rookies-18.5-backend-2/.pyenv/waffle-backend
로 추가하였습니다.

일단 회사 일 중이라 짤막하게 하나 남기자면, (3) 같이 번호로 말고 내용 위주로 기술해주시겠어요?

그리고 이것은 제가 아직 자세히 읽은 것이 아니라 꼭 지금의 질문이 부족하다는 것은 아니구, 다른 분들도 참고하시라고 일반적인 내용을 남겨두자면 배포 환경 등과 관련해서는 본인이 어떤 일을 했었고(uWSGI는 실행했는지, Nginx 실행했는지, 정말 정상적으로 실행된 게 맞는지, 필요하다면 어떻게 실행했는지 등) 현재 어떤 상황인지(어떻게 접근한 것이고 '안 된다'면 어떻게 안 되는지 등) 생각보다 아주 자세히 전달해주셔야 저나 다른 분들이 도움 주시기 쉽습니다! 다른 사람은 훨씬 더 감이 안 잡힐 것을 고려하고 전달해주세용

지적 감사합니다! 혹시 더 부족한 부분이 있으면 추가하도록 하겠습니다:)

일단 보셨다는 error.log는 sudo vi /var/log/nginx/error.log 등을 통해 Nginx의 로그를 보신 것이겠죠? 문제가 발생했을 때 로그부터 찾아보는 것, 아주 좋습니다. 참고로 Nginx는 Python 가상환경과는 무관하고, uWSGI는 Python 앱을 위한 것이므로 관련이 있습니다. 또한 일단 해당 instance에 웹 브라우저를 통한 요청 자체는 도달했다는 것이니까 AWS 보안 그룹과도 무관하겠지요. 그리고 제가 알기로 아마 /home/ec2-user/에 대한 실행 권한이 문제라면 502가 아닌 500이 발생했을 것입니다. 어쨌든 다 체크해보신 것 아주 좋습니다.

아마 분명히 어딘가에서 실수를 했을 가능성이 높은데, 기본적으로는 스스로 여러군데를 찬찬히 훑어보며 가능성을 따져볼 수밖에 없습니다. 우선 uWSGI 차원에서는 uwsgi 실행을 위한 ini 파일의 chdir, module, home, virtualenv, sock, chmod-socket 등의 값을 잘 확인해보세요. Nginx와 uWSGI를 socket으로 연결하는 것에 대한 내용을 잘 찾아보아야 할 듯합니다.(저는 처음 이런 걸 해보던 시점에 HTTP를 통한 Nginx와 uWSGI 간의 연결부터 시험삼아 먼저 해보고 되는 것을 확인한 후 socket 연결로 넘어가보기도 했습니다. 물론 반드시 뭐가 더 쉽다는 것은 아니긴 하지만요.) 한국어로 된 여러 참고할 만한 글들이 있었던 것 같습니다. 덧붙여, 혹시 Nginx의 conf 파일의 location block 내부에 uwsgi_params를 include시킬 때의 경로를 잘못 적은 것이 아닌지도 살펴보세요. 그리고 가급적 모두 절대경로를 이용하여 적어보시기 바랍니다.

덧붙여, 이것은 본인이 instance 내에서 Python 가상환경을 어떻게 구축했느냐에 따라 다를 수 있고 중요하지 않은 부분일 수 있지만 어떻게라도 도움되고자 말씀드리자면, 저 같은 경우 uwsgi의 ini 파일의 home, virtualenv에 넣은 가상환경 경로가 /home/ec2-user/.pyenv/versions/waffle-backend 이런 식의 형태가 되긴 했습니다. 본인의 가상환경 경로가 정말 저기가 맞는지는 확인해 볼만 할 것 같습니다.

해결하시게 되면 어떻게 원인을 파악했고 해결했는지 공유 부탁드려요! 화이팅입니다. :)

@canoneod 해결하셨다면 상황 공유 부탁드립니다!

앗 잊고있었네요ㅠㅜ
크롬 개발자모드에서도 봤는데 이후에 생각했던 것은

  1. settings.py 에서 Allowed_host를 지정하는 것이 문제일 경우
  2. ec2 인스턴스에서 데이터베이스로 연결이 제대로 안되는경우
  3. 인바운드 보안 그룹의 문제

세 가지였습니다. 우선 2번은 workbench로 연결이 되는지 확인해봤을때 정상적으로 되어 넘어갔고, 1번과 3번에 대해서는 제가 사용하는 ip 주소를 확인해봤는데 다른것을 확인하였습니다. 까페에서 과제를 하고 있었는데 인바운드 규칙과 allowed_host에 까페의 ip를 추가하지 않아서 발생한 것으로 해결했습니다!

@canoneod 일단 해결되셨다니 다행입니다. 그런데 Django settings의 ALLOWED_HOSTS는 말씀하신 것과 같은 것처럼 '카페(즉 요청을 하는 client 입장) IP'를 추가하는 개념이 아닙니다. 어떤 도메인으로 해당 서버에 접근하냐와 관련된 것입니다. 무슨 말이냐면, 위 링크의 공식 문서를 보면 알 수 있듯이 A list of strings representing the host/domain names that this Django site can serve.입니다. 예를 들어 같은 EC2 instance에 IP 주소로도 접근할 수 있고, EC2에서 자동으로 만들어주는 (ip스러운) domain 주소로 접근할 수도 있고, 내가 구매해서 부여한 도메인 주소로도 접근할 수 있는데, 이중 특정 주소로만 어떤 서버에 접근하는 것을 허용하기 위한 것입니다. 맞게 찾아왔으나 ALLOWED_HOSTS에 포함이 안 된 주소로 찾아왔으면 아마 400 에러가 발생할 것입니다.