티스토리 뷰

https://console.cloud.google.com/

 

Google Cloud Platform

하나의 계정으로 모든 Google 서비스를 Google Cloud Platform을 사용하려면 로그인하세요.

accounts.google.com

 

 

 

1. 위의 GCP 사이트에 회원가입하고 난 후에, 아래와 같은 페이지가 나타나면 오른쪽 상단에 "활성화" 버튼 클릭

 

 

 

 

 

2.  개인정보 입력 

 

 

 

 

3.  자동 결제 사용 설정 확인

 

 

 

 

4.  결제 옵션 설정 (신용카드만 가능)

 

 

 

 

5.  기다리기.. 생각보다 꽤 오래걸림 ;ㅠ

 

 

 

6.  compute Engine -> VM 인스턴스 

- 프로젝트가 자동으로 생성된다.

- 프로젝트가 생성되면 "만들기" 클릭

 

 

 

 

7.  프로젝트 설정 

- 이름 설정

- 리전은 그냥 가까운 서울

- 머신 유형 : 고성능은 필요 없으니까 제일 낮은 옵션

 

 

 

 

8. 부팅디스크 설정

- Centos 7 

- 크기는 20GB

 

 

 

9. 방화명 HTTP HTTPS 트래픽 허용 체크 -> "만들기" 클릭

 

 

 

 

10.  VM 인스턴스 생성. 가상 컴퓨터가 켜진 것이다. -> SSH 클릭

 

 

 

 

11. SSH 연결  ( 터미널 환경을 조성 )

 

- 터미널 창이 켜지면, 필요한 패키지들을 설치한다.

 

$ python --version

Python 2.7.5

$ sudo yum -y install epel-release

$ sudo yum -y install https://centos7.iuscommunity.org/ius-release.rpm

$ sudo yum -y install python36u-devel python36u-pip

$ sudo python3.6 -m pip install -U pip

$ sudo python3.6 -m pip install virtualenv

 

 

 

 

12. 파일 업로드 및 가상환경

 

- 오른쪽 상단의 톱니바퀴 모양을 누르고 압축파일 업로드 

 

$ ls

django_shoppingmall.zip

$ sudo yum -y install unzip

$ unzip <압축 파일>

$ python3.6 -m virtualenv venv

$ ls

db.sqlite3 django_shoppingmall manage.py order product templates users venv

$ source venv/bin/activate

(venv) $ $ pip install django==2.1.*

(venv) $ pip install djangorestframework

(venv) $ python manage.py runserver

 

 

 

 

 

13.  네트워크 설정

(1)

python manage.py runserver를 실행하고 웹페이지로 들어가면 아마도 실행이 안될 것이다. 

다시 VM 인스턴스 화면으로 이동해서 외부 IP 주소 복사해서 접속

http://34.64.186.247

 

 

(2)

포트번호를 입력해도 안됨  http://34.64.186.247:8000 

이유는 애초에 서버에 접속할 때에 127. ~~~ 으로만 접속할 수 있도록 설정해놨기 때문

 

 

 

(3)

모든 IP 주소로 접속할 수 있도록 한다.

(venv) $ python manage.py runserver 0.0.0.0:8000

 

 

 

(4)

이렇게 해도 안됨. 그 이유는 방화벽 때문. 방화벽을 끄거나, 해당 포트(8000)만 열어주면 됨

가장 간단한 방법인 방화벽을 끄는 방법 선택

(venv) $ sudo systemctl stop firewalld

 

 

 

(5)

그래도 안됨. 운영체제 설정, 방화벽 해제 다 했는데 글클라우드플랫폼에서 막고있기 때문이다.

내부 방화벽을 해제하기 위해 다시 VM 인스턴스 화면으로 와서 nic0 클릭

 

방화벽 규칙 -> + 방화벽 규칙 만들기

 

 

모든 인스턴스에 대해서 IP로 필터링 할 것이다.

IP는 0.0.0.0/0 을 사용하겠다. 즉, 모든 IP 를 사용하겠다는 의미

만들기 클릭

 

 

 

다시 Compute Engine -> VM 인스턴스 -> 해당 인스턴스 클릭해서 세부정보로 이동

위에서 설정한 네트워크가 적용된 것을 볼 수 있다.

 

 

 

 

 

(6)

다시 서버에 접속하면 포트는 뚫린 것을 알 수 있다.

(이때, python manage.py runserver 0.0.0.0:8000 으로 접속해야한다. )

 

 

하지만 "DisallowedHost at / "에러 발생

DisallowedHost at /

Invalid HTTP_HOST header: '34.64.186.247:8000'. You may need to add '34.64.186.247' to ALLOWED_HOSTS.

 

ALLOWED_HOSTS 에 문제가 있다는 것이다.

그러면 settings.py 파일로 들어가서 ALLOWED_HOSTS 부분을 수정해야한다. 

 

 

nano 편집기를 사용해서 편집하기 위해 nano 설치

(venv) $ sudo yum -y install nano

(venv) $ nano settings.py

 

ALLOWED_HOSTS =[] -> ALLOWED_HOSTS = ['*']  수정하기

 

 

 

 

(7)

이제 제대로 접속된다. 외부에서 접속할 수 있는 환경이 조성됐다. 

 

 

 

 

15. 데몬 진짜 배포

 

진짜 배포를 위해서는 uwsgi 가 필요.  uwsgi를 위해서는 gcc 필요

(venv) $ sudo yum -y install gcc

(venv) $ pip install uwsgi

 

 

uwsgi --http :8000 --home ~/venv --chdir ~/ --module django_shoppingmall.wsgi

 

http :  포트번호 지정

home : 가상환경 경로 지정

chdir : 프로그램이 시작할 경로 지정 ( 프로젝트 폴더 )

module : 프로젝트 폴더 안에서 어떤 파일을 실행시킬 것인지 

 


Error Handling

 

(1) 에러 내용

Internal Server Error 

ModuleNotFoundError: No module named 'django_shoppingmall'unable to load app 0 (mountpoint='') (callable not found or import error)*** no app loaded. going in full dynamic mode ****** uWSGI is running in multiple interpreter mode ***spawned uWSGI worker 1 (and the only) (pid: 3446, cores: 1)--- no python application found, check your startup logs for errors ---

 

 

 

(2) 문제점 파악

경로 문제였다.  django_shoppingmall 프로젝트 폴더 경로가 아래와 같고, 터미널 창에서는 상단의 django_shoppingmall 에서 시작했다. 

 

django_shoppingmall

├─django_shoppingmall 
│  └─wsgi.py
├─order 
├─product 
├─templates 
└─users 

 

원래는 --chdir ~/django_shoppingmall --module django_shoppingmall.wsgi 으로 입력했다.

chdir 에서 설정한 경로에서 django_shoppingmall 폴더를 찾고 그 안에서 wsgi.py 파일을 실행한다는 것이다. 

 

그런데 나는 django_shoppingmall의 경로에서 chdir을 django_shoppingmall 으로 설정하였으니 프로젝트 폴더가 django_shoppingmall으로 인식되고, 그 안에서 다시 django_shoppingmall 폴더 안에 있는 wsgi 파일을 찾으니 ModuleNotFoundError가 발생한 것이다. 

 

 

(3) 문제 해결

그래서 그냥 현재 폴더라고 인식할 수 있도록 --chdir ~/ --module django_shoppingmall.wsgi 라고 했더니 무사하게 웹서버에 접속되었고, 모든 작동이 정상적으로 수행됐다.

앞으로는 프로젝트 폴더 이름이랑 메인 폴더 이름이랑 구분할 수 있도록 해야겠다.

 


서버가 돌아가지만 그러면 터미널 창을 항상 켜놔야지만 서버에 접속할 수 있다는 점이다.

터미널 창을 꺼도 서버에 접속하려면 백그라운드로 실행되야 한다. 즉, 데몬으로 실행해야한다. 

 

(venv) $ nohup uwsgi --http :8000 --home ~/venv --chdir ~/ --module django_shoppingmall.wsgi &

[1] 3850

(venv) $ nohup: ignoring input and appending output to ‘nohup.out’

 

이렇게 해도 nohup 과 & 으로 해도 서버에 접속된다.

 

간혹가다 다시 Internal Server Error 가 뜬다면, 터미널 창에 ps 를 입력해서 아직 실행되고있는 uwsgi 들을 제거해야한다. 

kill -9 (uwsgi pid) 

 

 

 

 

댓글