티스토리 뷰
대기업에서 주피터 노트북은 전부 서버에 접속해서 사용한다.
자기들이 가지고 있는 데이터들이 외부로 나가면 안된다.
EC2 인스턴스 만드는 건 녹화본으로 제공한다.
WAS를 python으로 만들 것이기 때문에
mongodb 설치 : 27017 포트
그 다음에 flask를 사용한다.
80번 포트 혹은 8080번 포트
WAS 서버 프로그램을 실행한다.
기본적으로 localhost에서 서비스가 된다.(127.0.0.1)
이렇게 서비스를 하면 인터넷 망에서 서비스가 안된다.
그렇기에 localhost와 인터넷 망이랑 연결해주는 녀석이 있는데, 그게 바로 nginx이다.
실제로 서비스를 할 때는 pc에서 브라우저가 있고, 아이피가 있다면 nginx를 거쳐서 WAS에 접속된다.
아마존 AWS에 접속하면 리전을 확인하는 게 중요하다.
리전은 서버의 물리적인 위치이다.
서울에 있긴 있는데, 미국은 더 싸다.
아시아가 더 비싸다.
미국으로 설정하면 명령어 입력하면 몇초 있다가 반응을 한다.
그렇기에 웬만하면 서울로 설정하는 게 좋다.
AWS 서버의 정확한 위치는 공개하지 않는다.
AWS 개인으로 가입하려면 해외 결제 계좌, 카드가 필요하다.
그런데 AWS 쓸 때는 반드시 MFA라는 걸 등록해서 써야 한다.
ID 하고 PW로만 쓰면 해킹당하기가 겁나 쉽다.
비트코인 채굴당한다.
github에 실수로 이걸 올리게 되면, github에서 계속 봇으로 찾는다.
이걸 설명을 안해서 요금이 몇천만원씩 나온다.
AWS쪽에서 한번은 봐주지만, MFA는 무조건 설정해줘야 한다. MFA는 otp와 같다.
인스턴스 생성 방법
AWS
인스턴스에서 인스턴스 생성->
quick start에서 OS 선택 - ubuntu
ubuntu 버전 정보를 참고한다.
프리 티어 가용 가능 : 인스턴스 사용량 750시간까지 무료
24*31 = 744시간
1년 동안 한달에 서버 1대는 무조건 쓸 수 있다.
다만 트래픽 비용은 발생한다. 0.몇 달라 정도
그 다음에 인스턴스 유형을 고른다 - 서버의 스펙
t2 micro = 가장 안좋다.1시간에 0.00072달라
z1d = 1시간 쓰는데 5.4달라
개인용은 t2 small 정도면 딱 적당하다 2gb 메모리.
키 페어는 rsa를 생성하면 .pem 파일이 생성된다.
이걸로 접속하는 것이다.
네트워크 설정에서 ip = 활성화
그래서 ip가 자동으로 할당된다.
보안 그룹 - 방화벽, 보안 그룹에서 해당 IP를 가진 녀석들만 접속 가능하다.
어떤 포트를 열어줄지 지정해준다.
스토리지 구성 - 기본이 8gb
인스턴스 만들 때 인스턴스 개수 설정할 수 있다.
그냥 숫자 써가지고 만들면 된다.
다만 한꺼번에 너무 많이 만들면 문제가 생길 확률이 높아진다.
키 페어 설정하고 그냥 인스턴스 생성하면
대기 중에서 동작 중으로 된다.
그렇게 하면 바로 가상화가 된다.
여러 개의 인스턴스는 그룹을 묶어서 하나로 구별한다
인터넷 망에서 단일 인스턴스에 접속하는 건 public IP이다.
그런데 그룹 내에서 단일 인스턴스에 접속하는 건 private IP가 된다.
공유기와 인터넷 망 사이에는 public ip를 쓴다.
해당 공유기와 기기들 사이에는 private IP를 쓴다.
인터넷 망을 쓰려면 public ip를 써야 인터넷으로 나아갈 수 있다는 걸 이해하면 된다.
보안 - 인바운드 규칙(포트 설정)
따라서 포트가 열려 있지 않으면 8888(jupyter note book),22,8081,27017,80,8080 등 포트를 설정해줘야 한다.
원본
0.0.0.0/0은 모든 ip를 받아서 처리해주겠다는 뜻이다.
만약에 원본에 특정 ip를 써 넣으면 해당 ip만 처리한다.
0/8/16/24/32
회사 같은 경우는 회사 아이피 3번째 자리 까지만 고정이고, 나머지 끝자리 하나면 256까지 한다.
EC2 인스턴스 환경 설정
각 ip adress 를 알아야 한다.
git bash에서 SSH가 필요하다.
IP, ID, PW가 필요하다.
kt.pem 파일이 있는 곳으로 cd desktop
ssh -i <pem file path> <user name>@<server public ip>
yes or no에서 yes를 하면 접속된다.
이러면 클라이언트(git bash)에서 ec2 인스턴스 쪽으로 접속한 것이다.
해당 ubuntu에서 실행하는 명령어들은 전부 전달된다.
파이썬 환경을 설정하는 env파일을 다운로드 받는다.
해당 폴더를 kt.pem과 똑같은 경로에 붙여넣기 해준다.
ec2 인스턴스에 이 파일을 전달해야 한다.
파일을 전달할 때는 scp를 쓴다.
파일을 전달할 때는 4가지가 필요한데, ip,id,pw,path가 필요하다.
서버의 어느 디렉토리에 전달할지를 정해준다. 여기서는 ~/로 최상위 디렉토리로 할 것이다.
scp -ri <pem file path> <source file path> <user name>@<public ip>:<destination
file path>
실제 사례
scp를 몰라서 그냥 파일질라같은 걸 사용해서 s1에서 pc를 거쳐서 s2로 이동시켰다.
거의 하루가 걸린다.
ssh 접속하고 scp로 바로 보내면 1시간도 안 걸린다.
따라서 git 창을 하나 더 열어서 위에 있는 코드 양식으로 넣는다.
그 후에 해당 ubuntu에서 ls를 실행해서 살펴보면 된다.
cat ~/env/pyenv.sh
이 해당 패키지에 대한 설치 목록이 전부 적혀 있다.
pyenv versions를 보면 가상환경에 대한 것이 나온다.
그 후에는 ubuntu에서 실행해주면 된다.
# 설정에서 선택하는것이 나오면 모두 기본 값으로 설정 <tab + enter>
ubuntu $ source ~/env/pyenv.sh
# 파이썬 기본 버전을 3.8.5로 설정
ubuntu $ pyenv global 3.8.5
# requirements.txt에 정의된 파이썬 패키지 설치
ubuntu $ pip install -r ~/env/requirements.txt
4. 주피터 노트북 서버 설치 및 설정
# 주피터 노트북 설정 파일 생성
mkdir notebooks
cd ../env
cat requirements.txt
ubuntu $ jupyter notebook —generate-config
#config는 설정 파일이다.
숨겨진 파일이라 ls 눌러도 안나온다.
ls -al이라고 해야 나온다.
# 암호화된 패스워드 생성
ubuntu $ ipython
In [1]: from jupyter_server.auth import passwd
In [2]: passwd()
Enter password: # 보안의 이유로 실제로 입력문자가 출력되지는 않음
Verify password: # 보안의 이유로 실제로 입력문자가 출력되지는 않음
Out[3]: ''
In [4]: quit
#주피터 노트북 서버 설정
sudo vi /home/ubuntu/.jupyter/jupyter_notebook_config.py
c.NotebookApp.ip = '' # private ip address
c.NotebookApp.open_browser = False # 자동 브라우져 실행 설정
# 위에서 출력한 패스워드 설정
c.NotebookApp.password = '위의 out에서 나온 것'
주피터 노트북에 대해서 설정해주는 건 3가지가 있어야 한다.
pw,
browser= false(window가 없기 때문. 브라우저가 뜨지 않게 해야 한다.),
private ip 설정
로 놓아야 한다.
웹페이지에서 관리자도 pw를 알 수 없게 되어 있다.
그래서 pw를 변환해서 저장한다.
jupyter notebook 입력해서 접속하면 된다.
자신의 public ip: 8888로 접속하면 된다.
public ip라는 게 중요하다.
jupyter lab으로도 쓸 수 있다.
ctrl +c 누르면 서버가 중단된다.
세션을 나눠서 실행하기
tmux new -s kt
ctrl + b, c #윈도우 생성
ctrl + b, 0-9 #윈도우 이동
0번은 실행을 유지하고,
bash 1윈도우에서 jupyter lab을 실행할 수 있다.
만약 전의 쥬피터를 종료를 안하면, 포트가 1씩 올라가면서 실행된다.
관리자 ps -e 하면 실행되고 있는 명령어를 다 볼 수 있다.
ps -e | grep jupy와 같이 입력하면 해당 명령어로 찾을 수 있다.
중지하고 싶다면 kill -9 28227 와같이 레벨을 9로 주고, process id를 주면 된다.
9는 가장 강한 레벨이다. 강제로 프로그램 목록을 확인해서 중단시킨다.
하나의 세션에서 여러 개의 프로그램을 돌릴 수 있는 것과 같은 이치이다.
만약 jupyter notebook & 하면, 백그라운드로 실행된다.
창을 나누는 이유는, jupyter notebook 중간중간에 로그가 뜨기 때문이다.
백그라운드로 실행되고 있는 프로그램은 어떻게 종료해야 할까?
그럴 때 ps -e | grep jupy로 입력해서, kill -9로 종료해야 한다.
웹 어플리케이션 서버도 이런 식으로 나오므로, 프로세스 찾아서 중단할 수 있어야 한다.
주피터 노트북 자바스크립트 커널 설정
# javascript 실행을 위한 패키지 설치
ubuntu $ sudo apt-get install nodejs npm jupyter
# ipython에서 실행 가능한 javascript를 npm으로 설치 및 설정
ubuntu $ sudo npm install -g --unsafe-perm ijavascript
ubuntu $ sudo ijsinstall --install=global
아무것도 안나오면 잘 되는 것이다.
환경에 대한 주저리
unix에서 linux, osx가 나왔다.
redhat에서 나온 리눅스가 가장 좋으나, 비싸다.
무료 버전으로 나온 게 centos이다.
fedora라는 것도 있다. 새로운 기술들을 사용해볼 수 있는 os이다.
개인적으로 사용할 때는 ubuntu = 명령어나 인터페이스가 훨씬 깔끔하다.
다만 centos는 안정성이 훨씬 좋다. 그래서 회사에서 쓰는 것
windows server는 안정성도 떨어지고, 무료도 아니다. 그래서 인기가 떨어진다.
클라우드 기술의 핵심은 물리적인 16GB를 논리적으로 8G, 8G로 나눌 수 있게 하는 게 핵심이다.
EC2안에서 WAS, Jupyter, DB도 실행해볼 것이다.
하나 할 때마다 RAM이 들어가는데, 사실 회사에서는 서버를 각각 나눠서 쓴다.
강의할 때는 하나로 쓰고, 회사에서는 이 과정중에 사용하는 IP 주소만 바꿔서 쓰면 다 접속할 수 있다.
그렇기에 동일한 과정이라고 보면 된다.
MongoDB 설치
https://www.cherryservers.com/blog/install-mongodb-ubuntu-22-04
sudo apt install software-properties-common gnupg apt-transport-https cacertificates -y
curl -fsSL https://pgp.mongodb.com/server-7.0.asc | sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg --dearmor
#Next, add MongoDB 7.0 APT repository to the /etc/apt/sources.list.d directory.
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodbserver-7.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list
sudo apt update
sudo apt install mongodb-org -y
# MongoDB 서버 실행 및 실행확인
ubuntu $ sudo systemctl start mongod
ubuntu $ sudo systemctl status mongod
active running이 되면 정상적으로 된다.
q를 누르고 나온다.
DBS 서버 설정하기
서버는 항상 계정과 네트워크 설정이 필요하다.
# mongo shell 실행 및 관리자 계정 생성
ubuntu $ mongosh
————————————————————————————————————————
몽고 쉘 프롬프트로 변환
test> use admin
switched to db admin
admin> db.createUser({ user: "userid", pwd: "pwpw", roles: [ "root" ] })
{ ok: 1 }
admin> quit
————————————————————————————————————————
127.0.0.1로 설정되어 있으면 외부에서 접속이 안되므로, 0.0.0.0으로 바꿔준다.
그리고 계정에 pw를 설정했으므로, pw를 사용하도록 enabled 해준다.
외부 접속망에서 가능 한 것처럼 환경을 구성할 것이기 때문에, local에서도 접속이 가능하다.
몽고 DB는 자바스크립트 문법을 차용한다.
.conf는 설정 파일이다.
관리자 권한으로 에디터를 실행시킨다.
# 외부접속 허용 및 패스워드 사용설정
ubuntu $ sudo vi /etc/mongod.conf
————————————————————————————————————————
# network interfaces
net:
port: 27017
bindIp: 0.0.0.0
# security:
security:
authorization: enabled
————————————————————————————————————————
반드시 앞에 스페이스로 두 칸 띄어야 한다.
탭은 안된다. 무조건 스페이스로 두 칸이다.
입력한 뒤에 wq!를 누르고 나온다.
보통은 이렇게 설정하지 않는다.
설정 적용을 위한 mongodb 재시작 및 확인
sudo systemctl restart mongod
sudo systemctl status mongod
# 서버 접속 URI
URI : mongodb://<user>:<password>@<public ip>:<port>/?authSource=admin
mongosh mongodb://<user>:<password>@<public ip>:<port>/?authSource=admin과 같이 접속하면 된다.
sudo systemctl은 환경을 검사한다.
apt와 apt get은 관리자 버전이다.
Nginx 설치
sudo apt-get install nginx
# nginx 실행 확인
ubuntu $ sudo systemctl status nginx
index html 파일에서 브라우저로 서비스해보기
서버의 public ip를 입력해야 한다.
mkdir html
echo 'hello nginx!' > html/index.html
cd html로 html 디렉토리로 이동한다.
그러면 pwd를 쳤을 때 나오는 /home/ubuntu/html 경로를 기억해둔다.
이 상태에서 public ip에 입력하거나 80번 포트를 가면 서비스가 된다.
그러면 wellcome to nginx라고 뜬다.
# nginx 설정
ubuntu $ sudo vi /etc/nginx/sites-available/default
# 정적 파일 설정
————————————————————————————————————————
server {
listen 8080;
location / {
root /home/ubuntu/html;
}
}
————————————————————————————————————————
# ubuntu 디렉토리 실행권한(+x) 추가
ubuntu $ chmod +x /home/ubuntu
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
해당 config로 들어갔을 때, index.html이 없다면 기본페이지가 뜬다.
그렇기에 server 명령어로 해당 html을 지정해주는 것이다.
이렇게 한 뒤, public ip+8080으로 해당 웹페이지를 들어가면, html이 뜬다.
이렇게 입력하게 되면 80을 입력하면 인트로 페이지, 8080으로 하면 사용자 html이 뜬다.
서버가 집이면, 포트는 방이다.
서버 한 대에 포트를 다르게 해서 서비스를 여러개를 올릴 수 있다.
etc 디렉토리에 있는 파일은 sudo를 써야 한다. 관리자 디렉토리라서 그렇다. 그래야만 수정할 수 있다.
안 그러면 저장이 안된다.
ubuntu $ chmod +x /home/ubuntu 라는 해당 권한을 실행해야 nginx가 제대로 페이지로 나온다.
권한에 대한 설명
ls -l ..
ubuntu가 실행 권한이 없었다.
파일을 열려고 할 때, 해당 권한에 접속할 수 없다.
chmod로 실행 권한을 추가하면, x 실행권한이 생긴다.
만약 실행이 안되거나 제대로 안 나오면 권한을 확인해라
drwxr-x--x 15 ubuntu ubuntu 4096
각각 r, w, excute 권한을 가진다.
첫번째 3개는 소유자,
두번째는 그룹,
세번째는 그 외 다른 권한이다.
ubuntu 그룹의 home 소유자
# WAS 라우팅 설정
————————————————————————————————————————
server{
listen 8081;
location / {
proxy_pass http://localhost:5000;
}
}
————————————————————————————————————————
만약에 flask를 사용하게 되었다면 다음과 같이 하면 된다.
설정 적용하고 재시작하면 된다.
# 설정 적용을 위한 재시작
ubuntu $ sudo systemctl restart nginx
재시작했을 때 에러가 나면 설정에서 문제가 있는 것이다.