본문 바로가기

클라우드 서비스

[Cloud] 구글 클라우드 플랫폼(GCP)에 파이썬 서비스 올리기

이번 포스팅은 구글 클라우드에 파이썬으로 개발한 웹서비스를 올리는 방법에 대해서 정리했습니다.

 

환경 설정 및 https 설정까지 진행 예정으로 도메인이 필요합니다. 

 

VM 인스턴스 생성부분은 생략합니다.

 

1. Docker 설치

$ sudo apt update
$ sudo apt upgrade
$ sudo apt update

$ sudo apt install apt-transport-https ca-certificates curl software-properties-common

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
$ sudo apt update
$ sudo apt install docker-ce

$ docker --version

 

2. Docker 관리용 Portainer 설치(포트설정, 볼륨설정).

# portainer 에서 사용할 볼륨 생성
$ sudo mkdir -p /data/portainer/data

# portainer 설치
$ sudo docker run -d -p 9000:9000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v /data/portainer/data:/data portainer/portainer

# 접속 테스트
http://<아이피>:9000

 

구글클라우드에서 방화벽 설정에서 9000 번 포트를 열어주면 외부에서 접속 및 확인 가능합니다. 

주의 사항은 IP범위를 설정시, "0.0.0.0/0" 으로 해야 합니다. 

 

 

3. Docker 네트워크 생성

docker network create myweb-network

 

4. MongoDB 설치(Docker 버전)

# 몽고DB를 저장할 디렉토리 생성
$ sudo mkdir -p /mongodb/data

# 도커 컨테이너 실행
$ docker run --name mongo --net myweb-network -v /mongodb/data:/data/db -d -p 27017:27017 --restart always mongo

 

5. Nginx 설치

# nginx는 우분투에서 웹서버를 구동하게 해주는 패키지 입니다.
# 먼저 우분투에 nginx 를 설치합니다

$ sudo apt-get install nginx

 

6. Python3 구성

# python3 버전 pip 설치
$ sudo apt-get install python3-pip

# 파이썬 프로젝트 폴더 생성 및 이동
$ mkdir myweb
$ cd myweb

# 생성후 프로젝트 관련 소스를 myweb(프로젝트 폴더)폴더로 모두 복사한다.

# 가상환경 설치
myweb$ pip3 install virtualenv

# 가상환경 생성
myweb$ /home/계정명/.local/bin/virtualenv -p /usr/bin/python3 venv

# 가상환경 적용
myweb$ source venv/bin/activate

 

7. uWSGI 및 Flask 설치

(venv)$ pip3 install uwsgi flask

 

8. uWSGI 설정

(venv)$ vi uwsgi.ini

[uwsgi]
module=run:app
# uWSGI 마스터모드에서 실행
master=true
# 요청 처리를 위한 프로세스 갯수
processes=5

# 생성할 유닉스 소켓파일
socket=myweb.sock
#소켓에 대한 권한 변경, chmod 가 맞는 문법임
chmod-socket=660
# 프로세스가 중지되면 소켓을 정리함
vacuum=true

# init 시스템과 uWSGI가 각각의 프로세스에 대해 동일한 가정가지고 동작할 수 있도록 함
die-on-term=true

#location of log files
logto = %n.log

 

9. 기타 패키지 설치(각자의 프로젝트에 따라 설정하면 됩니다)

# 개발환경에서 설치한 패키지 목록을 생성하여 운영환경에 설치
(venv)$ pip3 install -r requirements_min.txt

# 프로젝트의 메인 파일을 실행하여 정상동작하는지 확인
(venv)$ python3 run.py

# bson 관련 오류가 발생하여 패키지를 삭제하고 특정버전으로 재설치함
(venv)$ pip3 uninstall -y pymongo
(venv)$ pip3 install pymongo==3.7.2

 

10. 데몬 생성 절차

(venv)$ sudo vi /etc/systemd/system/myweb.service

[Unit]
# 설명
Description=uWSGI flask app
# init 시스템으로 하여금 네트워크 타겟에 도달했을때 실행
After=network.target

[Service]
User=계정명
Group=www-data
# 프로젝트 디렉토리
WorkingDirectory=/home/계정명/myweb
# 가상환경의 실행파일 경로
Environment="PATH=/home/계정명/myweb/venv/bin"
# uwsgi 전체 실행파일 경로와 ini 파일
ExecStart=/home/계정명/myweb/venv/bin/uwsgi --ini uwsgi.ini

[Install]
# 멀티 유저 시스템이 구동중일때 서비스가 시작
WantedBy=multi-user.target
# 서비스 시작
(venv)$ sudo systemctl start myweb

# 서비스 활성화
(venv)$ sudo systemctl enable myweb

# 서비스 상태확인
(venv)$ sudo systemctl status myweb

 

11. Nginx 서버 블록 설정

여기서 도메인 구매가 필요합니다.

server_name 뒷부분에 본인이 구매한 도메인 정보를 입력하면 됩니다

 

(venv)$ sudo vi /etc/nginx/sites-available/myweb

server {
    listen 80;
    server_name 도메인.kr www.도메인.kr;

    location / {
        include uwsgi_params;
        uwsgi_pass unix:///home/계정명/myweb/myweb.sock;
    }
}
# Nginx 서버 블록 링크 설정
(venv)$ sudo ln -s /etc/nginx/sites-available/myweb /etc/nginx/sites-enabled

Nginx 설정 구문오류 체크
(venv)$ sudo nginx -t

# Nginx 재시작
(venv)$ sudo systemctl restart nginx

# uWSGI + Flask 재시작
(venv)$ sudo systemctl restart myweb

# 방화벽 처리
(venv)$ sudo ufw allow 'Nginx Full'

 

12. 오류 로그 확인하는 방법

(venv)$ sudo less uwsgi.log

(venv)$ sudo less /var/log/nginx/error.log: checks the Nginx error logs.

(venv)$ sudo less /var/log/nginx/access.log: checks the Nginx access logs.

(venv)$ sudo journalctl -u nginx: checks the Nginx process logs.

(venv)$ sudo journalctl -u myproject: checks your Flask app’s uWSGI logs.

 

13. HTTPS 설정

sudo apt install certbot python3-certbot-nginx

sudo certbot --nginx -d 도메인.kr -d www.도메인.kr

 

2번째 명령어에서 입력하는 부분이 있는데, 여기서 2번을 선택함.

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you re confident your site works on HTTPS. You can undo this
change by editing your web server s configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2

 

14. 서비스 확인 및 https 적용 확인

 

"주의요함" 부분이 2번째 그림에서 "열쇠모양"으로 변경되었다.