개인 프로젝트

[Django] WEB 서버 '400 Bad Request Error' 해결

2023. 8. 7. 18:50

AWS에서 3 tier architecture을 구성하고 WEB서버에 접속하면 'Bad Request 400 에러'가 떨어지는 문제를 해결해보았다.

구성한 서버는 다음과 같다.

WEB - Nginx
IP: 3.39.165.45

WAS - Gunicorn
IP: 3.37.209.223

 

1. 에러 확인

vi /var/log/nginx/error.log 명령어로 어디서 에러가 나고있는지 확인할 수 있다.

에러내용을 보면 ~/register_form/.static_root 폴더와 ~/register_form/.static_root/css 폴더가 forbidden 되어있다.

그리고 was 서버로 connection이 refused 되어 연결이 계속 failed되는 상태이다.

2. 포트 확인

WEB서버와 WAS서버에 각각 접속해 네트워크 상태를 확인해보았다.

netstat의 -nltp 옵션으로  현재 tcp 프로토콜에 대해서 LISTEN 상태인 포트를 확인해보았다

WEB

WAS

WEB의 80포트와 WAS의 8000포트가 제대로 열려있는 것을 확인할 수 있다.

3. 연결 확인

WEB 서버에서 traceroute 명령어로 WAS 서버의 8000포트가 연결되어있는지 확인해보았다.

중간에 경로를 알 수 없는 * * *이 뜨긴 하지만, 최종적으로 WAS서버의 8000 포트까지 도달하는걸 볼 수 있다.

 

+) ping과 traceroute의 차이점

일반적으로 서버간 연결을 확인할 때는 ping이나 traceroute를 사용하는 것 같다. 

이 둘의 차이에 대해서 간단히 알아보면 다음과 같다.

Ping

ping test는 서버에 연결할 수 있는지 여부와 데이터를 전송 및 수신하는데 걸리는 시간을 알 수 있다.

하지만 ping 테스트는 특정 포트에 대한 연결을 확인할 수 없다.

Traceroute

반면 traceroute는 정확한 경로 정보(홉 수), 라우터별, 홉 별 걸린 시간을 설명해 준다.

또한 -p 옵션을 통해 특정 포트에 대한 연결도 확인할 수 있다.

4. 해결방법

각 서버의 포트도 잘 열려있고, 네트워크 연결도 문제가 없는 것 같았다.

뭐가 문제인지 계속 검색하다가....... Django의 settings.py 파일에 ALLOWED_HOSTS 정보를 넣어주지 않았다는걸 알게되었다...

따라서 ALLOWED_HOSTS에 WEB과 WAS서버 둘 다의 IP를 각각 적어주어 해결하였다 ..

 

WEB -> WAS 접속 성공 !

5. 결론

네트워크 문제가 없는데 연결이 안되는 경우, 애플리케이션 설정이나 미들웨어 설정파일을 잘 살펴보자 !