본문 바로가기
개발

오라클 클라우드(oracle cloud) 우분투 서버에 flask 앱 설치하기

by developer's warehouse 2024. 1. 20.

이 글에서는 오라클 클라우드 우분투 서버에 flask 앱 설치하는 법에 대해서 설명합니다. 

기본적으로 flask 앱은 파이썬 및 관련 패키지를 설치하고 pip를 통해서 requirements들을 설치하게 됩니다. 

  • 파이썬 및 기본 패키지 설치
  • PIP를 통한 python 패키지 설치
  • gunicorn 설치 및 nginx 설치 및 설정

오라클 클라우드(oracle cloud) 우분투 서버에 flask 앱 설치하기 썸네일

오라클 클라우드 이미지

 

 

파이썬 및 기본 패키지 설치


먼저 우분투 서버를 받으면 일단, ssh로 접속해서 파이썬과 가상환경을 설정합니다. 

 

sudo apt update
sudo apt-get upgrade
sudo apt-get install -y libgl1-mesa-glx <-- 나중에 open cv에서 사용하는 라이브러리임

ubuntu@instance-20230803-1044:~$ python3 --version
Python 3.8.10
#만약 파이썬이 설치되어있지 않다면, sudo apt-get install python3
sudo apt-get install python3-pip
sudo apt-get install python3-venv
sudo python3 -m pip install wheel

python3 -m venv venv
ubuntu@instance-20230803-1044:~$ . venv/bin/activate
(venv) ubuntu@instance-20230803-1044:~$ ls
venv
python3 -m pip install --upgrade setuptools
pip install Flask gunicorn


 

 

PIP를 통한 python 패키지 설치


requirement.txt를 이용해서 패키지를 설치합니다. 

git clone 'your repository flask app'
(venv) ubuntu@instance-20230803-1044:~/flask$ pip install -r requirement.txt
Python 3.8.10
ERROR: Could not find a version that satisfies the requirement scipy==1.11.1 (from -r requirements.txt.all (line 67)) (from versions: 0.8.0, 0.9.0, 0.10.0, 0.10.1, 0.11.0, 0.12.0, 0.12.1, 0.13.0, 0.13.1, 0.13.2, 0.13.3, 0.14.0, 0.14.1, 0.15.0, 0.15.1, 0.16.0, 0.16.1, 0.17.0, 0.17.1, 0.18.0, 0.18.1, 0.19.0, 0.19.1, 1.0.0, 1.0.1, 1.1.0, 1.2.0, 1.2.1, 1.2.2, 1.2.3, 1.3.0, 1.3.1, 1.3.2, 1.3.3, 1.4.0, 1.4.1, 1.5.0, 1.5.1, 1.5.2, 1.5.3, 1.5.4, 1.6.0, 1.6.1, 1.6.2, 1.6.3, 1.7.0, 1.7.1, 1.7.2, 1.7.3, 1.8.0rc1, 1.8.0rc2, 1.8.0rc3, 1.8.0rc4, 1.8.0, 1.8.1, 1.9.0rc1, 1.9.0rc2, 1.9.0rc3, 1.9.0, 1.9.1, 1.9.2, 1.9.3, 1.10.0rc1, 1.10.0rc2, 1.10.0, 1.10.1)
ERROR: No matching distribution found for scipy==1.11.1 (from -r requirements.txt (line 67))

위와 같이 중간에 매칭되는 distribution이 없다고 나오면 해당 패키지의 버전을 제거하고 설치하면 됩니다. 저의 경우 scipy==1.11.1을 scipy로 변경후 pip install -r requirements.txt 명령을 재수행 하였습니다. 

이렇게 수행한 후 python app.py로 flask 앱을 실행해 줍니다. 그랬더니, 아래 에러가 납니다. 에러가 나면 해당 패키지를 설치해 주어야 합니다. 그런데, 좀 이상하네요.. 이미 다 설치가 되어있는데 에러가 납니다. 
Traceback (most recent call last):
  File "app.py", line 3, in <module>
    from flask_cors import CORS
ModuleNotFoundError: No module named 'flask_cors'
(venv) ubuntu@instance-20230803-1044:~/flask$ pip install flask_cors
 
지금 이 글을 작성하면서 실행할 때 Flask와 gunicorn을 처음에 설치 하지 않고 
먼저, pip install -r requirement.txt를 했더니 패키지가 일부 꼬였나 봅니다. 일단 pip install -r requirement.txt를 다시 수행해 봅니다. 
그래도 에러가 발생하는군요.. 잘 모르겠지만 일단 에러 나는 것들은 모두 다시 설치해 주는 수밖에 없는것 같습니다. 
Traceback (most recent call last):
  File "app.py", line 4, in <module>
    from youtube_sub_dl import youtube_sub_dl_bp
  File "/home/ubuntu/flask/youtube_sub_dl/__init__.py", line 2, in <module>
    import yt_dlp
ModuleNotFoundError: No module named 'yt_dlp'
(venv) ubuntu@instance-20230803-1044:~/flask$ pip install yt_dlp
 
pip install pycountry
pip install webvtt-py
 
한글 체크 패키지는 아래와 같이 github에서 직접 다운받아서 설치해야합니다..
pip install --no-cache-dir -e git+https://github.com/ssut/py-hanspell.git#egg=py-hanspell
pip install flask_sqlalchemy
 
위와같이 필요한 패키지들을 모두 수행 후 정리 되었습니다. 
 
이제 gunicorn과 nginx 설정을 진행합니다. 
 
 
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
 
 
 

오라클 클라우드 서버 설정하기


오라클 클라우드 무료 서버는 사양이 매우 안 좋습니다. 그래서, 다음과 같이 몇 가지 작업을 해야 그나마 동작을 시킬 수 있습니다. 

1. memory 공간 늘리기 

torch와 같은 큰 패키지를 설치하다보면 killed된다고 나옵니다. 이것은 설치중 메모리를 많이 사용해서 killed되는 현상입니다. 이를 해결하기 위해서는 swap을 늘려주어야 합니다. 

# 4GB의 swap 파일을 생성합니다.

sudo fallocate -l 4G /swapfile

 

# swap 파일 권한을 설정합니다.

sudo chmod 600 /swapfile

 

# swap 영역으로 파일을 설정합니다.

sudo mkswap /swapfile

 

# 시스템의 swap 공간으로 파일을 활성화합니다.

sudo swapon /swapfile

 

# /etc/fstab 파일에 swap 파일 정보를 추가하여 재부팅 후에도 계속 사용할 수 있게 합니다.

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

 

 

2. http/https 포트열기

Oracle Cloud 서버에서 Nginx를 사용하여 외부에서 IP 주소를 이용해 접속하려면 아래의 단계를 따라 진행하세요:

  1. 방화벽 설정: Oracle Cloud 서버에서 외부 트래픽을 허용하도록 방화벽을 구성하세요. SSH로 서버에 로그인하고, 다음 명령어를 사용해 ufw의 방화벽 설정을 업데이트합니다. Nginx를 사용하므로 HTTP 트래픽(포트 80) 및 HTTPS 트래픽(포트 443)을 허용해야 합니다.
  2.  
    sudo ufw allow 80/tcp
    sudo ufw allow 443/tcp
    sudo ufw allow 21/tcp
    sudo ufw reload
    
  3. Oracle Cloud 인스턴스 보안 규칙: Oracle Cloud Console에서 인스턴스에 대한 인바운드 보안 규칙을 구성해야 합니다. 이 작업은 웹 UI에서 수행하며, 관련 단계는 다음과 같습니다:
    • Oracle Cloud Console에 로그인합니다.
    • 좌측 메뉴에서 "인스턴스"를 선택하여 인스턴스 페이지로 이동합니다.
    • 인스턴스 목록에서 해당 인스턴스를 선택합니다.
    • "인스턴스 세부 정보" 페이지에서 "네트워크" 섹션으로 스크롤합니다.
    • "보안 규칙"에 있는 "인바운드 규칙"을 찾아 "추가 인바운드 규칙" 버튼을 클릭합니다.
    • HTTP 트래픽을 위해 소스 CIDR 차단을 "0.0.0.0/0"으로 하고 대상 포트 범위를 "80"으로 설정한 다음, 원하는 설명을 추가하고 규칙을 저장합니다.
    • HTTPS 트래픽을 위해 소스 CIDR 차단을 "0.0.0.0/0"으로 하고 대상 포트 범위를 "443"으로 설정한 다음, 원하는 설명을 추가하고 규칙을 저장합니다.
  4. Nginx 설정: Nginx 설치 및 구성이 완료되었다면, 기본 사이트 설정 파일을 수정하거나 새로운 사이트 설정 파일을 추가하여 원하는 도메인 또는 IP 주소에 대한 서버 블록(Server Block)을 구성해야 합니다. 설정 파일을 업데이트하거나 작성한 후, 다음 명령어를 사용하여 Nginx 구성에 오류가 있는지 확인하고 재시작하세요.
  5.  
    sudo nginx -t
    sudo systemctl restart nginx
    

이제 외부에서 인스턴스의 IP 주소를 이용하여 접속할 수 있습니다. 웹 브라우저에서 인스턴스의 IP 주소를 입력하고 접속해 보세요. 필요한 경우 도메인 이름을 IP 주소로 매핑하려면 DNS 설정을 업데이트하세요.

 
 
오라클 클라우드 로그인 상태에서 "컴퓨터" > "인스턴트" 메뉴를 선택하고 인스턴스 세부 내용에서 ① 서브넷을 선택합니다. 
 
 
VM Instance의 Subnet 의 보안 정책 변경
서브 넷을 선택하면  네트워킹 > 가상 클라우드 네트워크 화면으로 이동됩니다.
 
② 공용 서브넷 세부 항목에서 보안 목록을 선택합니다. 
 
③ 보안 목록에서 "송신(out bound)"과 "수신 (inbound)" 메뉴 중에서 "수신" 메뉴를 선택해서 보안 규칙을 추가합니다. 
 
VM Instance의 Subject의 보안 정책 적용
④ 수신 규칙 메뉴에서 세부 항목을 추가합니다. 
 
    - 수신 주소 선택 0.0.0.0/0 (모든 IP)를 입력
 
⑤ 허용하고자 하는 대상 포트를 입력합니다.
 
   - HTTP는 80, HTTPS 443 포트를 입력합니다.   8000 포트는 개발 중인 프로그램에서 사용하는 포트입니다.  여러 포트 입력 시 공백 없이 입력해야 합니다. 
 
⑥ 수신규칙 추가를 선택합니다. 
 
 
VM Subnet의 보안 적용 추가
 

VM Instance를 SSH로 원격 접속하고 iptables의 규칙을 수정합니다. 

$ sudo iptables -I INPUT 5 -i ens3 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT​

$ sudo iptables -I INPUT 5 -i ens3 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT​

$ sudo iptables -I INPUT 5 -i ens3 -p tcp --dport 8000 -m state --state NEW,ESTABLISHED -j ACCEPT

sudo iptables -I INPUT 5 -i ens3 -p tcp --dport 5000 -m state --state NEW,ESTABLISHED -j ACCEPT
sudo iptables -I INPUT 5 -i ens3 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT​
sudo iptables -I INPUT 5 -i ens3 -p tcp --dport 20 -m state --state NEW,ESTABLISHED -j ACCEPT​
오라클 클라우드 서버의 메모리 용량 늘리기 
오라클 클라우드 서버의 메모리는 기본 1G를 무료로 줍니다. 메모리가 턱없이 부족하므로 메모리를 늘리지 않으면 웬만한 것은 동작 조차 하지 않고 kill 됩니다. 
 
우분투에서 swap 파일 크기를 늘리려면 다음 단계를 수행하세요. 1. 현재 실행 중인 swap 파일 비활성화: ``` sudo swapoff /swapfile ``` 2. 새로운 크기로 swap 파일 생성 (여기서는 예시로 4GB로 늘립니다. 원하는 크기로 조정하세요): ``` sudo dd if=/dev/zero of=/swapfile bs=1M count=4096 ``` 3. 파일에 생성한 swap 영역 설정: ``` sudo mkswap /swapfile ``` 4. 새로 생성한 swap 영역 활성화: ``` sudo swapon /swapfile ``` 5. /etc/fstab 파일을 열어 새로운 swap 파일이 부팅 시 자동으로 적용되도록 설정: ``` sudo vi /etc/fstab ``` 기존 /swapfile 라인이 있을 경우, 해당 라인을 새 크기에 맞도록 수정 또는 존재하지 않을 경우에는 아래 문자열을 추가합니다. ``` /swapfile none swap sw 0 0 ``` 수정 후 파일을 저장하고 종료합니다 (Ctrl + X, Y, Enter). 6. 시스템이 새로운 swap 파일 크기를 정상적으로 사용하도록 재부팅합니다: ``` sudo reboot ``` 7. 재부팅 후, 새 swap 크기 확인: ``` free -h ``` 변경된 swap 크기를 확인할 수 있습니다.
 
 
 
추가 설정
 
sudo vi /etc/nginx/nginx.conf
파일 전송 사이즈 늘리기 
        client_max_body_size 50M;
를 http 섹션에 넣어줍니다.
http {
 
        ##
        # Basic Settings
        ##
 
        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        # server_tokens off;
        client_max_body_size 50M;
 
...
}
 
sudo vi /etc/nginx/sites-available/myflaskapp
timeout을 방지하기 위해서 timeout을 늘려줍니다. 
    proxy_connect_timeout       300;
    proxy_send_timeout          300;
    proxy_read_timeout          300;
    send_timeout                300;
nginx의 설정 server 섹션에 넣습니다. 
server {
 
    server_name ai.2story.org;
 
    location / {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://localhost:8090/;
    }
 
    proxy_connect_timeout       300;
    proxy_send_timeout          300;
    proxy_read_timeout          300;
    send_timeout                300;
 
...
 
}

생각 나는대로 작성해 보았습니다. 참고 될 만한 부분이 있으면 좋겠습니다. 고생하세요~
facebook twitter kakaoTalk kakaostory naver band shareLink