개발환경

AWS 백엔드 개발용 서버 설정하기

AWS 백엔드 개발용 서버 설정하는 방법을 정리해두려고 합니다.

제 기억을 저장하고자 작성하는 것이므로 개인적인 설정들이 포함되어 있습니다.

AWS 인스턴스 만들기

ubuntu 18 t2.micro로 하되 볼륨을 16G로 인스턴스를 종료했을때 볼륨이 삭제되지 않도록 합니다.

Python은 3.6 이상을 사용합니다. 현재 AWS ubuntu 18을 설치하면 python 3.6.9가 설치되어 있습니다.

가끔 실수로 종료시켜버릴경우 그동안 내용이 모두 날라가버리니까요.

Elastic IP 설정

Hosting 역할을 하기 위해서 Elastic IP를 사용하여 고정적으로 IP를 사용할 수 있도록 합니다.

Inbound HTTP, HTTPS 추가

AWS instance의 inbound 설정을 위한 메뉴를 찾기가 쉽지 않습니다.

아래 링크를 누르면 설정 메뉴로 갑니다.

AWS 백엔드 개발용 서버 Inbound 설정 메뉴

SSH 접속하기

secure key를 저장해둔 것을 다음과 같이 ssh 접속합니다.

ssh -I “<secure key>” ubuntu@<IP address>

또는 비밀번호로 접속하기 위해서 다음 파일을 변경하면 됩니다.

/etc/ssh/sshd_config

PasswordAuthentication yes

sudo passed

VSCode Remote Connection 접속하기

VSCode Extension 으로 Remote Connection을 설치합니다.

config file에 Host 설정을 저장합니다.

Secure key로 id_ed25519로 사용하였습니다.

Host <이름>
HostName <IP address 또는 도메인 이름>
User ubuntu
IdentityFile ~/.ssh/id_ed25519

Github를 위한 SSH key 생성

ssh-keygen -t rsa -b 4096

그리고 이 키를 github에 등록후 git clone

mysql 설치하기

sudo apt-get install mysql-server
sudo mysql_secure_installation
sudo systemctl start mysql
sudo systemctl enable mysql

mysql> create database <DB 이름> default character set utf8;
mysql> create user 'ubuntu'@'localhost' IDENTIFIED BY '<비밀번호>';
mysql> grant all privileges on *.* to ubuntu@localhost;
mysql> flush privileges;

Nginx 설치하기

sudo apt-get update
sudo apt-get install nginx
sudo systemctl start nginx.service

browser로 http://<ip address> 이동하면 nginx default page가 나옵니다.

이제 원하는 nginx 설정을 해줍니다.

sudo vi /etc/nginx/sites-avaiable/default
location / {
    root <원하는 web page path>;
    add_header 'Access-Control-Allow-Origin' '*';
}

sudo systemctl reload nginx.service

Gunicorn 설치하기

flask api를 사용하기 위해서 Gunicorn을 통해서 WSGI(Web Service Gateway Interface)를 제공합니다.

gunicorn은 python WSGI이므로 pip으로 install합니다.

pip3 install gunicorn

설치후 버젼을 확인해보면 설치 여부 확인 가능합니다.

/home/ubuntu/.local/bin/gunicorn --version

flask+WSGI 백그라운드 서비스로 실행하기

flask app 생성 (다른 페이지에서 설명하도록 하겠습니다.)

원하는 폴더에 wsgi.py 파일 작성합니다.

from <flask app 파일> import app

if __name__ == '__main__':
    app.run()

/etc/systemd/system/<서비스이름>.service 파일을 만듭니다.

[Unit]
 Description=Gunicorn instance to serve myproject
 After=network.target

[Service]
 User=ubuntu
 Group=www-data
 WorkingDirectory=<wsgi.py 파일이 있는 PATH>
 Environment="PATH=<wsgi.py 파일이 있는 PATH>"
 ExecStart=/home/ubuntu/.local/bin/gunicorn --workers 1 -m 007 wsgi:app --log-file <wsgi.py 파일이 있는 PATH>/gunicorn.log --log-level DEBUG --reload --access-logfile <wsgi.py 파일이 있는 PATH>/gunicornaccess.log --capture-output

[Install]
 WantedBy=multi-user.target

위와 같이 설정한 다음 service 제어는 다음과 같이 합니다.

sudo systemctl start <서비스이름>.service
sudo systemctl status <서비스이름>.service
sudo systemctl restart <서비스이름>.service
sudo systemctl stop <서비스이름>.service
sudo systemctl enable <서비스이름>.service.  => system booting시 자동 실행되도록 합니다.

nginx wsgi로 proxy 설정하기

gunicorn 으로 의해서 생성된 web server인 127.0.0.1:8000 으로 proxy_pass를 지정하도록 하여 http://<IP address>/api/ url이 flask app에서 처리되도록 합니다.

sudo vi /etc/nginx/sites-avaiable/default
upstream <원하는 이름>{
    server 127.0.0.1:8000;
}
...
    location ~ /api/(.*)$ {             
        add_header 'Access-Control-Allow-Origin' '*';                
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;             
        proxy_set_header X-Forwarded-Proto $scheme;             proxy_set_header HOST $http_host;             
        proxy_pass http://<원하는 이름>/$1?${args};               
        proxy_redirect off;     
     }


sudo systemctl reload nginx.service

마치며

hosting service를 위해서 domain 등록과 https를 위한 ssl 적용을 추가로 할 예정입니다.

Leave a Reply