• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    미해결

가상환경에서 runserver 구동시 오류

22.11.25 04:49 작성 조회수 691

0

안녕하세요 선생님!

aws ec2 amazon2 가상환경에서 git 에있는 제프로젝트를 clone을 통해 받은후

python manage.py runserver를 하였을때 잘 동작하지만 사이트는 들어가지지 않는데 무엇이 문제일까요?

또한 제가 이가상환경에서 이프로젝트를 배포하기위해 gunicorn과 nginx를 사용하고있는데

gunicorn으로 gunicorn --bind 127.0.0.1:8000 [프로젝트명].wsgi:application 을 통해 사이트를 접속하려고 하였을때 gunicorn은 정상작동하지만 사이트는 들어가지지 않는데 동일한 오류때문인지 궁금합니다!

코드를 무엇을 첨부해야 할지 몰라 일단 settings.py를 첨부하겠습니다!

따로 봐야하는 코드가 있으시면 말씀해주시면 감사하겠습니다!!K-002.pngK-003.pngK-004.pngK-005.pngK-007.pngK-008.pngK-006.png

답변 1

답변을 작성해보세요.

0

안녕하세요.

127.0.0.1이나 localhost는 외부 캄퓨터가 아닌 서버를 구동한 그 컴퓨터 자신을 가리키는 주소입니다.

그러니 지금 브라우저를 띄우신 머신에서는 아마존 서버로 접속을 시도하신 것이 아니라, 그 윈도우 컴퓨터로 접속을 시도한 것입니다. 그러니 엉뚱한 곳으로 접속을 시도한 셈이죠. // 아마존 서버의 아이피 주소나 도메인 주소를 통해 접속을 시도하셔야 합니다.

그리고 서버에서 서버가 구동될때 bind 주소는 127.0.0.1 을 지정하시면, 서버를 구동한 그 컴퓨터로부터의 접속만 허용합니다. 그러면 외부 아이피/도메인을 통한 접속이 안 됩니다. // bind 주소를 0.0.0.0 으로 넣으셔야 외부 접속이 허용됩니다.

그리고, ec2 서버 os 자체에 방화벽이 있다면, 접속하시는 아이피/포트(80, 443)에 대해 방화벽이 열려있어야하고, ec2 에 적용된 security group도 방화벽의 일종이니까 http/https포트인 80과 443이 열려있으셔야 합니다.

그러면 페이지 접속이 되실 것입니다.

차근차근 확인해보시고 질문 남겨주세요.

화이팅입니다. :-)

tprpek님의 프로필

tprpek

질문자

2022.11.25

장고의 settings.py에서 allowed host를 수정하고 aws ec2 인바운드 규칙을 선생님께서 말씀하신대로 80,443,8000 에 대해 수정하니 제대로 동작합니다 !

항상 감사합니다!!

tprpek님의 프로필

tprpek

질문자

2022.11.25

선생님 추가 질문이 생겨서 질문드립니다!!

gunicorn이 정상작동하는것을 확인하고

etc/systemd/system/gunicorn.service 파일을 이렇게 설정하고

image

etc/nginx/sites-avaliable/프로젝트명 파일을 이렇게 설정하였습니다

image

그 결과 server_name에 있는 ip를 통해 접속하면image이렇게 nginx가 정상작동함을 알수있는데 server_name/admin 으로 들어가면

image이러한 오류가 뜨는데 이경우에 nginx와 gunicorn과의 연동이 잘 안된 부분인 것일까요??

만약 연동이 잘 안된 부분이라면 어떤코드가 문제인지 궁금합니다!!

--bind unix:/srv 이부분을 --bind 0.0.0.0:8000 으로 하여도 똑같은 오류가 발생했었습니다!

 

위와 같이 nginx 페이지가 뜨는 것은 현재의 요청이 nginx를 통해서 처리되었기 때문입니다. nginx에게 reverse proxy역할을 부여한 virtual host를 통해 요청이 처리되지 않은 것이죠.

nginx의 virtual host 설정을 살펴보세요.

tprpek님의 프로필

tprpek

질문자

2022.11.25

선생님 혹시 nginx의 virtual host설정이 sites-available에서 설정한 etc/nginx/sites-avaliable/프로젝트명 파일이 맞을까요? 계속 살펴봐도 무엇이 문제인지 잘모르겠습니다.. 맨 아래사진은 서버ip/admin으로 접속했을때의 에러로그입니다.

그리고 혹시 위사진에서 gunicorn --bind unix:/run/gunicorn.sock 과 --bind 0.0.0.0:8000과의 차이를 알수있을까요?

imageimageimage

unix socket으로 클라이언트 접속을 기다리는 것과 ip로 클라이언트 통신을 기다리는 것의 차이입니다.

하나의 VM에서 여러 도메인을 가지고 여러 웹서비스를 돌리실 목적이 아니시라면 (=> virtual host를 쓰는 목적)

별도의 sites-enabled/hello 만들지마시고 (virtual host 쓰지 마시고), sites-enabled/default 파일d을 수정하여 django와 reverse proxy 구성해보세요. 현재의 nginx 응답은 아마도 sites-enabled/default 파일 설정을 통해 처리가 되었을 것입니다.

그리고, 참고로 sites-available/ 폴더에 있는 설정파일들은 가용한 설정일 뿐 실제로 nginx에 의해서 읽혀지는 파일이 아닙니다. sites-enabled/ 폴더에 있어야하죠. nginx.conf 파일 보시면 sites-enabled/* 파일에 대해서만 include하는 설정을 확인하실 수 있습니다.

화이팅입니다. :-)

tprpek님의 프로필

tprpek

질문자

2022.11.26

답변 감사합니다!! 알려주신대로 image로 default에 proxy_reverse 설정을 해보았는데 서버ip/admin은 아직 동작하지않습니다..
또한 sites-available/폴더에 있는 설정파일들을 sites-enabled/폴더에 똑같이 옮겨주는 작업을 하였음에도 작동이 안하는것은 무엇이 문제일까요?

동작에 오류가 있다면, nginx 에러로그가 뜰 것이구요.
동작을 하지 않는다면, 원하는 동작을 trigger하는 행위를 하지 않으셨을 것입니다.

tprpek님의 프로필

tprpek

질문자

2022.11.26

default에 설정을하고 admin을 접속하였을때 위사진과 같은 404에러가 발생하고있습니다

현재 nginx 와 gunicorn 서버는 잘구동되고있고 서버ip주소로 접속하였을때 nginx 시작페이지가 잘 나오고 있음을 확인할 수 있었고

서버ip주소:8000/admin 을 통해 admin 사이트에 접속이 잘 됨을 확인 하였습니다.

이경우에 아까 말씀해주신 reverse_proxy 문제일까요?

늦은시간에도 답변 정말 감사합니다!

위에서 말씀드렸다시피, nginx 페이지가 뜨는 것은 nginx가 그 요청을 처리하고 있기 때문입니다.

default 설정에 reverse proxy 설정이 제대로 되었다면 그 페이지가 떠서는 안 될 것입니다.
지금은 nginx 기본설정으로 그대로 서버가 구동되고 있는 상황인 것이죠.

nginx 변경 후에 nginx 서버도 재시작해주셨나요?

tprpek님의 프로필

tprpek

질문자

2022.11.26

네 nginx 서버도 재시작 하였습니다!

tprpek님의 프로필

tprpek

질문자

2022.11.26

선생님 방금 막 오류 수정하였습니다!

django project가 있는 폴더에 run폴더를 만들어 gunicorn.sock이 저장되게 하였고

etc/nginx/conf.d 에 프로젝트.conf를 만들어

image

이러한 형태로 해주었더니 연동 성공했습니다!

근데 nginx로 통해 접속하면 static 파일들이 적용 되는것으로 알고있는데 지금 접속을 해보니 static이 적용 되지 않습니다!

location /static/ 를 root manage.py위치로 설정하였는데 이부분이 잘못된것일까요?

또한 제가 장바구니 api를 통해 장바구니를 생성하려고 할때 "detail": "CSRF Failed: CSRF token missing or incorrect."

이러한 오류가 뜨는데 코드에 @csrf_exempt를 사용해도 되는지 궁금합니다! api는 클래스기반함수로 구현하였습니다

nginx는 장고가 아니기 때문에 장고프로젝트 내 여러 폴더에 나눠진 static 경로를 알지 못합니다. 그러니 collectstatic 명령으로 한 경로로 static 파일들을 복사하신 후에, 복사된 경로의 파일들을 nginx를 통해서 서빙하셔야 합니다. settings.STATIC_ROOT 에 지정하신 경로로 collectstatic 명령이 static 파일들을 복사합니다.

그리고 nginx에서 직접 static 서빙을 하는 것이기에 원하는 경로의 파일이 원하시는 URL로 서빙되지 않을 경우 nginx 에러로그를 보셔야 합니다.

그리고 CSRF Token 이슈의 경우, 일반적인 웹페이지에서 Form 처리에서 csrf_exempt를 적용하여 POST요청에 대한 csrf 체크를 끌 이유가 없다고 생각합니다. 자세한 맥락에 대한 설명이 없어서, 더 설명드리기는 어렵네요.

이것 저것 동작할 때까지 설정을 수정하시면서 테스트하시기 보다, 장고와 nginx 자체의 설정을 차근차근 정리해보시며, 온전히 이해해보실려고 노력해보셨으면 합니다.

sites-enabled/ 가 아닌 conf.d/ 에 설정을 두었을 때 reverse proxy가 동작한다는 부분도 이상하긴 합니다. 설정 경로의 차이가 아닌, 뭔가 다른 차이가 있을 듯 하네요.

화이팅입니다. :-)

tprpek님의 프로필

tprpek

질문자

2022.11.26

넵 감사합니다 다시 차근차근해보고 질문드리겠습니다!! 감사합니다

tprpek님의 프로필

tprpek

질문자

2022.11.26

collectstatic 명령어를통해 static 파일 복사한후에

location /static/ {

alias static폴더가있는directory;

}

코드를 통해 지정을 해주었는데 media파일은 정상적으로 받아들이는데 static파일들만 받아들이지 못합니다image에러로그를 확인해보니 이런에러로그가 뜨는데 원래 /usr/share/nginx에서 static파일을 가져오는것이 맞나요?

tprpek님의 프로필

tprpek

질문자

2022.11.26

location /static/ {

alias static폴더가있는directory;

}

static 폴더가있는 directory를 적는과정에서 맨 앞에 / 를 빼먹어 안됐었습니다....

맨앞에 /를 추가해 오류 수정하였습니다! 감사합니다