728x90

# 데이터베이스 원칙

1. data integrity (무결성)
데이터가 전송, 저장, 처리되는 과정에서 변경되거나 손상되지 않아야 함
완전성, 정확성, 일관성을 유지해야 함을 의미

2. data reliability (안전성)
데이터를 보호할 수 있는 방법인증/인가되지 않은 사용자로부터 데이터를 보호할 수 있어야 함
고장이 나지 않아야 하며, 고장이 나더라도 데이터의 변경/유실이 없어야 함

3. scalability (확장성)
데이터 양이나 사용자가 늘어날 때 대처 가능해야 함

# 관계형 데이터베이스의 트랜잭션 4원칙 (ACID)

1. Atomicity (원자성)
all or nothing
하나로 묶인 작업은 전부가 성공하거나 전부가 실패해야함을 의미 (일부만 성공하면 안됨)

2. Consistency (일관성)
DB에 저장된 데이터는 일관성이 있어야 함
트랜잭션 수행 전후로도 항상 일관된 데이터구조 및 제약을 가져야 함을 의미

3. Isolation (독립성)
각 트랜잭션은 독립된 상태여야 함
트랜잭션이 동시에 여러 개 실행되더라도 서로 간에 영향을 주지 않아야 함을 의미

4. Durability (지속성)
DB에 적용된 상태는 계속해서 지속되어야 함
DB가 임의의 사고로 중단되는 경우에도 영구적이어야 함을 의미 (데이터의 유실/변경이 없어야 함)

A가 B에게 송금을 한 경우 A계좌에서는 돈이 빠져나갔는데 B계좌에 입금이 되지 않은 경우가 절대 발생해서 안됨

이처럼 금융권 같이 데이터의 일관성이 반드시 보장되어야 하는 경우에 ACID 원칙을 따름

# 비관계형 데이터베이스의 원칙 (BASE)

1. Basically Available
기본적으로 사용 가능하고, 주서버가 안되더라도 백업서버는 동작해야함

2. Soft-state
데이터를 관리하지 않으면 사라질 수 있음

3. Eventually consistency
점차적으로 데이터가 일관성을 가지게 됨 (항상 일관적이지 않을 수 있음)

페이스북의 경우 내가 게시글을 작성했을 때 다른 사람이 바로 볼 수 있으면 좋지만, 시간이 조금 지난 후에 게시글을 볼 수 있어도 크게 문제가 없음

이처럼 현재 정확한 데이터가 아니더라도 사용자가 원하는 기능을 언제든지 사용할 수 있도록 하는 것이 중요한 경우 BASE 원칙을 따름

# CAP 이론

Consistency : 특정 시점에서 반드시 동일한 데이터가 존재하는 성질
Availability : 항상 이용 가능한 성질 (하나의 서버가 다운되더라도 다른 서버에서 처리)
Partition Tolerance : 서버를 늘려서 확장할 수 있는 성질

1. RDBMS

  • RDBMS에서는 데이터의 일관성과 안정성을 가장 중시함
    • C 최대화
    • C 확보를 위해서 데이터를 한 곳에서 관리하여 P를 달성하기 어려움
    • C를 확보하기 위하여 배타적 제어, 락처리로 인해 병목이 되기도 함

2. NoSQL

  • Availability와 Partition Tolerance를 중시하는 경우가 많음
    • 스케일 아웃을 통한 성능 향상으로 인하여 C를 달성하기 어려움 (많은 서버에 데이터가 흩어져 있으므로)
    • C가 약하기 때문에 어플리케이션에 일관성 및 일치성을 확인하는 로직을 두는 것을 권장함
    • P 확보를 위한 서버 간 데이터 복제가 병목지점이 되기도 함
728x90

'DataBase' 카테고리의 다른 글

데이터베이스의 종류  (0) 2023.02.22
728x90

DVC (Data Version Control)

DVC는 Git을 기반으로 하는 새로운 유형의 데이터 관리 무료 오픈소스

DVC 용도

일반적으로는 git과 함께 사용하여 git tag를 통해 대용량 데이터 버전관리를 할 때 유용하게 쓰인다.
git에서는 2GB 이상의 데이터를 push할 수 없기 때문에, 대용량 폴더는 dvc로 관리하고 git ignore에 명시하여 git이 추적하지 않도록 한다.

대용량 폴더는 dvc를 이용하여 데이터를 원격저장소에 저장한다.
dvc가 관리하는 파일들은 [폴더명.dvc]라는 메타정보파일이 남는다.
이 메타정보 파일에는 원격저장소에 저장된 데이터 경로와 데이터 size, 파일개수가 쓰여있다.
git은 이 메타정보 파일을 추적하여 버전관리를 한다.

예시)

Workspace를 보면 train.py, pred.py, data폴더, model폴더가 존재한다.
이 중 data와 model은 대용량폴더이기 때문에 dvc로 관리한다.
그렇게 되면 git repository에는 train.py, pred.py와 data와 model 폴더의 메타정보를 담은 data.dvc, model.dvc 파일이 관리되고, 데이터는 원격저장소로 push되어 원격저장소 내에 저장되어있다.
model.dvc 내용을 살펴보면 model의 원격저장소 위치와 size, 파일개수, path 정보가 들어있다.
원격저장소에서 c6/efae81ddbbf2a8a88d6d3790e60e61.dir을 찾아가서 살펴보면 원격저장소 파일경로와 실제파일명이 매칭되어 적혀있다.
10/d2a131081a3095726c5721ed31c21f의 내용을 확인하면 Workspace/model/model1.pt 파일내용을 볼 수 있다

 

dvc는 왜 파일을 이렇게 복잡한 파일명으로 관리하는걸까?
dvc는 해시값을 이용하여 데이터를 관리한다.
해시값이란 파일의 데이터를 해시 함수(Hash Funtion) 또는 해시 알고리즘(Hash Algorithm)을 통해 계산하여 산출된 값으로 이러한 값은 해당 파일의 고유한 값이다.
해시값은 고유한 값이기 때문에 두 파일의 해시값이 같다는 것은 두 파일이 동일한 파일임을 의미한다.
해시값을 이용하여 데이터를 저장하면 동일한 파일을 중복저장하지 않을 수 있다.
파일명만 다르고 내용이 동일한 파일이 있는 경우, 데이터는 한 번만 저장되고 동일한 해시 값을 참조한다.

# model1과 model2의 파일내용이 같다고 가정하면
[{“md5”:” 10d2a131081a3095726c5721ed31c21f”, “relpath”:”model/model1.pt},
{“md5”:” 10d2a131081a3095726c5721ed31c21f”, “relpath”:”model/model2.pt}]

DVC 장점

DVC 튜토리얼 (기본 사용법)

workspace로 사용하기 위한 gitrepo폴더를 만들고 그 안에서 작업함
gitrepo / samplemodel / modelfile 만듦

dvc 설치

pip install dvc

dvc 시작 (dvc init)

dvc → git과 같이 사용

cd C:\Users\stone\seokhwa_practice\DVC\gitrepo
# set git repository
git init
git remote add origin https://github.com/seokhwaLee/DVCtest
# set dvc
# pip install dvc
dvc init
# git commit
git commit -m "Initialize DVC"

dvc → git 없이 사용 가능

dvc init --no-scm
dvc remote add [remote명] [AI모델저장소storage경로]

파일 또는 디렉토리 추적 :  dvc add {추적할폴더}

aimodel폴더 내용 추적

dvc add samplemodel
git add samplemodel.dvc .gitignore
# git status : add 상태 확인
git commit -m "add model"

변경사항 반영 : dvc commit

# 추적설정 되어있는 폴더/파일의 변경사항 반영
dvc commit # git과 같이 commit message를 따로 넣어주는 옵션은 없음

저장 및 공유

원격 저장소 추가 : dvc remote add {원격저장소명} {원격저장소위치}

# 원격 저장위치 설정
# model 내용을 두 개의 원격저장소에 push해보기
dvc remote add aimodel C:\Users\stone\seokhwa_practice\DVC\aimodel
# 원격저장소 config git add
git add .dvc/config
git commit -m "Configure remote storage"

원격저장소에 push하기 : dvc push -r {원격저장소명} {add폴더}

# 원격저장소로 위에서 add한 data push
dvc push -r aimodel samplemodel
# add한 것 중 특정 데이터만 push 가능
dvc push aimodel.dvc -r aimodel samplemodel

하나의 git repository에서 여러 개의 원격저장소에 push 가능

# 원격 저장소 추가
dvc remote add data C:\Users\stone\seokhwa_practice\DVC\project
# 원격저장소 config git add
git add .dvc/config
git commit -m "Configure remote storage"

dvc add sampledata
git add sampledata.dvc .gitignore

# git status : add 상태 확인
git commit -m "add data"
dvc push -r data sampledata

이미 푸시한 내용 다른 원격저장소에 푸시 가능

# 새로운 원격 저장소 추가
dvc remote add testtest C:\Users\stone\seokhwa_practice\DVC\testtest
# 원격저장소 config git add
git add .dvc/config
git commit -m "Configure remote storage"

dvc push -r testtest sampledata

원격저장소로부터 데이터 불러오기 : dvc pull {불러올데이터파일명.dvc}

dvc pull samplemodel.dvc -r aimodel

데이터 삭제

dvc remove {삭제할데이터파일명.dvc} : dvc파일 삭제
dvc gc -w -c -r {원격저장소명} -f : 원격저장소에서 dvc workspace에서 추적하지 않는 파일 삭제

remove를 이용하여 추적 취소 후, gc를 이용하여 dvc workspace에서 추적하지 않는 파일 원격 저장소에서 삭제한다

dvc remove sampledata.dvc
dvc gc -w -c -r testtest -f

 

참고 링크

DVC homepage
DVC github
DVC docs

 

 

대용량 데이터 버전관리 오픈소스 LFS vs DVC

대용량 데이터를 체계적으로 관리하는 방안이 필요해져, 대표적인 두 가지 오픈소스를 비교해보았다. Git LFS는 유료 서비스라는 점에서 조건미달이었기 때문에, 깊이 공부하지 않고 DVC를 선택하

bigseok.tistory.com

 

728x90
728x90

프록시 설정 이유

하나의 서비스를 이루는 서버가 여러 개 있을 때,

사용자는 각 서버가 어떤 역할을 하는지 파악하고 원하는 서버에 요청을 해야할까? 

ex)

http://localhost:5000/service1/~~

http://localhost:5050/service2/~~

 

중간에 프록시 서버를 두면 프록시서버가 사용자의 요청을 분기처리하여 서비스를 호출한다

사용자는 프록시서버만 알면 된다

ex)

http://localhost:80/service1/~~

http://localhost:80/service2/~~

 

 

윈도우 nginx 설치

 

설정파일 설정

※ 사전준비 : 기동되고 있는 서버의 url

 

1. {nginx설치경로}/conf/sites-enabled/customizing.conf 파일 생성

upstream spring-frontend {
    server localhost:8080;
}
upstream flask-backend {
    server localhost:5000;
}
upstream fastapi-backend {
    server localhost:5050;
}

server {
    listen 80;
    proxy_max_temp_file_size 0;
    client_max_body_size 256M;

    location / {
        proxy_pass http://spring-frontend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
    }
    location /service1/ {
        proxy_pass http://flask-backend;
    }
    location ~^/service2/ {
        proxy_pass http://fastapi-backend;
    }
    location ~^/(docs|openapi.json)$ {
        proxy_pass http://fastapi-backend;
    }
}
  • upstream > 연결할 서버 url 정의
    • 예시 :
      upstream spring-frontend {server localhost:8080;}
  • server > location에 url mapping
    • 예시 : localhost/service1/ 로 들어오는 요청은 flask-backend(http://localhost:5000/service1)로 연결
      location /service1/ { proxy_pass http://flask-backend; }

2. {nginx설치경로}/conf/nginx.conf 파일에 위에서 만든 conf 파일 불러오도록 설정

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include mime.types;
    include sites-enabled/*.conf;
}

3. nginx 재기동

nginx -s stop # 멈추기
nginx # 시작

 

접속 확인

위의 설정파일에서 localhost/docslocalhost:5050/docs 연결했음 > 브라우저에서 localhost/docs에 접속하여 localhost:5050/docs 를 접속했을 때와 같은 서버가 뜬다면 성공

 

 

 

 

nginx 기초

nginx > 웹서버 정적 파일을 처리하는 HTTP 서버로서의 역할 HTML, CSS, Javascript, 이미지와 같은 정보들을 웹브라우저에 전송하는 역할 응용프로그램 서버에 요청을 보내는 리버스 프록시로서의 역할

bigseok.tistory.com

728x90

'Python > Web' 카테고리의 다른 글

FastAPI 개발자가 직접 개발한 FastAPI backend 프로젝트 구조  (0) 2024.03.03
WSGI와 ASGI 단순 비교  (0) 2024.02.28
FastAPI 비동기 처리  (1) 2024.02.26
FastAPI async 비동기 동시 처리  (1) 2024.02.26
nginx 기초  (0) 2022.10.25
728x90

대용량 데이터를 체계적으로 관리하는 방안이 필요해져, 대표적인 두 가지 오픈소스를 비교해보았다.

Git LFS는 유료 서비스라는 점에서 조건미달이었기 때문에, 깊이 공부하지 않고 DVC를 선택하여 서비스를 구현하였다.

DVC 사용법 관련 포스팅은 추후 다른 게시글에서 자세히 다루어볼 예정이다.

 

Git LFS (Large File Storage)

Git LFS는 대용량 파일을 별도의 서버에 올리고, 원래 위치에는 포인터를 남긴다.

즉, 대용량 파일은 다른 서버에서 받아오고 있지만, 포인터가 설정되어 있기 때문에 사용자 입장에서는 Git, Push, Pull 등을 그대로 사용할 수 있다.

Git LFS는 실제 파일(다른 곳에 저장됨)에 대한 참조 역할을 하는 포인터 파일을 만든다.

GitHub는 저장소에서 이 포인터 파일을 관리한다.

저장소를 clone할 때, GitHub는 포인터 파일을 보고 큰 파일을 찾아온다.

사용중인 Git LFS version을 추적한 다음 파일의 고유 식별자(oid)를 추적한다.

Git LFS pointer 예시

version https://git-lfs.github.com/spec/v1
oid sha256:4cac19622fc3ada9c0fdeadb33f88f367b541f38b89102a3f1261ac81fd5bcb5
size 84977953

Price

github

gitlab

 

DVC (Data Version Control)

DVC는 Git을 기반으로 하는 새로운 유형의 데이터 버전 관리 무료 오픈소스이다.

DVC는 설치가 빠르고 특별한 인프라가 필요하지 않으며 API나 외부 서비스에 의존하지 않는 독립 실행형 CLI 도구이다.

Git으로 .gitignore(데이터파일이 git에 저장되는 것 방지)과 .dvc(dvc 정보)파일을 통해 데이터 버전 정보를 관리한다.

Git의 Tag/Branch 등을 이용해 dataset과 ML model을 versioning하고 관리

.gitignore : 대용량데이터폴더는 git에서 무시하도록 git ignore에 명시

/[대용량데이터폴더명]

.dvc/config : 등록된 원격저장소 정보 (실제 대용량 데이터 저장 위치)

[core]
    remote = datas
['remote "datas"']
    url = C:\Users\stone\seokhwa_practice\DVC\data-repo

[대용량데이터폴더명].dvc : [대용량데이터폴더]의 사이즈, 파일개수, 경로, 원격저장소 메타정보 위치

outs:
- md5: c6efae81ddbbf2a8a88d6d3790e60e61.dir
  size: 3980577
  nfiles: 185
  path: datas

DVC를 통해 실제 데이터를 관리

간단한 명령어를 통해 원격저장소(S3, Google Cloud, Azure, HDFS, SSH server 등)와 연결하여 데이터를 push 하거나 pull 할 수 있다.

dvc remote add -d datas C:\Users\stone\seokhwa_practice\DVC\data-repo

 

LFS vs DVC

두 가지 서비스 모두 사용법은 유사하다.

하지만 LFS 서버를 무료로 사용할 경우 데이터 사이즈 제약이 있고, DVC 의 경우 무료 > data 를 저장할 storage 만 설정해주면 된다.

 

참고 사이트

728x90

'AI > ML ops' 카테고리의 다른 글

Makefile을 이용한 빌드 자동화 스크립트  (0) 2024.04.21
DVC 기초 및 사용법  (0) 2022.11.02
728x90

윈도우용 Docker Desktop을 아래 링크에서 다운로드 받아서 설치

 

Kubernetes 활성화

작업도구 모음창에서 도커 아이콘을 우클릭해서 Settings로 들어가 kubernetes를 활성화

 

쿠버네티스 명령어 날려보기

kubectl version # 쿠버네티스 버전 보기

 

 

k9s 설치 (선택)

SCOOP 설치 > Windows Powershell  관리자 권한으로 실행 후 아래 명령어 입력 (cmd에서는 안됨)

# scoop 설치
Set-ExecutionPolicy RemoteSigned -scope CurrentUser 
$env:SCOOP = 'C:\Scoop'
iex (new-object net.webclient).downloadstring('https://get.scoop.sh')

# k9s 설치
scoop install k9s
728x90
728x90

WSL (Windows Subsystem For Linux 2)

  • WSL은 가상머신이나 멀티부팅을 사용하지 않고 윈도우 내에서 리눅스 콘솔 환경을 사용할 수 있게 해주는 시스템
    • WSL은 윈도우 환경 위에 가상머신없이 리눅스 배포판 버전을 설치 가능하게 함
    • 리눅스의 네이티브 바이너리를 윈도우 환경에서 돌아가도록 해준다
  • Docker for Windows를 이용해 Windows 내에서 Linux 개발 환경을 구축할 수 있음
    • 하지만 Docker for Windows는 Windows Pro 이상버전이 요구되기 때문에 Windows Home 버전에서는 이용할 수 없다 (pro에서만 제공되는 Hyper-v 때문)

 

Install WSL

  • 설치를 위해서 64비트 PC, Windows 10 1607 이상 버전으로 업그레이드
  • Win + Q 를 눌러 윈도우 검색창에서 Windows 기능 켜기/끄기 클릭
  • “Linux용 Windows 하위 시스템” 체크하여 활성화 후 재부팅
  • 재부팅 후, 시작 – “Microsoft Store” - 클릭
  • 검색 – “Ubuntu” 검색 – 원하는버전의 Ubuntu 클릭

  • Ubuntu 실행 후 username, password 입력
  • 설치과정 중간에 WSL용 아이디와 비밀번호 설정까지 마치면 설치 완료
  • Package 업데이트를 위해 root 권한으로 전환하는 “sudo -i”, password 입력
  • Root 권한에서 “apt-get update”를 입력해서 업데이트 진행
  • gcc/g++ 설치를 위해 “apt-get -y install gcc g++” 입력
  • vim 설치를 위해 “apt-get -y install vim” 입력(이미 설치되었을 수도 있음)
  • “su 사용자명”을 입력하여 root 권한 나가기(사용자명 "7"에서 입력한 username)

 

Install Window Terminal

  • Microsoft Store에서 Window Terminal 다운로드
  • 설치 후 관리자 권한으로 실행하여 하단의 명령어 실행
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
  • 탭 상단의 + 아이콘 옆의 v 를 클릭후 설치한 버전의 Ubuntu 클릭
  • 완료

 

Linux basic command

pwd:현재 작업중인 디렉토리 정보 출력
cd:경로 이동
ls:디렉토리 목록확인
ls -a: 숨겨진 파일이나 디렉토리 출력 
ls -l: 상세내용을 출력한다.
ls -al: 디렉토리 상세 정보 출력 
cp: 파일 혹은 디렉토리를 복사 (디렉토리 복사시 -r 옵션 필요)
mv: 파일 혹은 디렉토리 이동,이름을 변경하는 용도로도 사용한다.
mkdir:디렉토리 생성 -p 옵션을 주면 하위 디렉토리까지 생성완료 
rm:파일이나 디렉토리 삭제 (디렉토리 삭제시 -r 옵션 필요)
cat: 파일내용 출력,생성,덧붙이기, 하나로 합치기 등등 다양한 기능
find [검색경로] -name [파일명]: 특정 파일이나 디렉토리를 검색한다

 

728x90

'etc' 카테고리의 다른 글

Oracle VM VirtualBox 설치 & VM에 Ubuntu 설치  (0) 2022.10.26
윈도우 cuda 여러 버전 설치 및 사용  (1) 2022.10.25
728x90

설치 버전 : virtualbox 6.0.24 , ubuntu 22.04

Oracle VM VirtualBox 설치하기

1. 설치파일 다운로드

다운로드 링크 : https://www.virtualbox.org/

 

2. 설치

다운로드 실행파일 > 옵션 추가 세팅 없이 Next 눌러서 설치함

 

3. Extension Pack 세팅

 

4. 가상파일 저장위치 설정

 

VirtualBox에 Ubuntu 설치하기

1. Ubuntu 다운로드

다운로드 링크 : https://ubuntu.com/download/desktop

다운로드 버튼 클릭

 

2. 우분투 설치를 위한 가상디스크 만들기

 

3. 다운받은 우분투 ISO 설치 디스크 추가하기

 

4. 우분투 설치하기

가상디스크가 시작되면 광학 드라이버에 추가한 ISO 파일을 로딩하고 설치가 진행됨

한국어 선택 후 Ubuntu 설치

 

참고 링크

 

버추얼박스(VirtualBox) 우분투 설치하는 방법 - 익스트림 매뉴얼

이전 포스트에서 버추얼박스(VirtualBox)를 이용한 윈도우 가상화 사용 방법에 대해 알아봤습니다. 이번엔 리눅스 배포판중 설치가 쉽고 사용자층이 많아 비교적 정보를 쉽게 얻을수 있는 우분투(U

extrememanual.net

 

버추얼박스(VirtualBox) 이용해서 우분투(Ubuntu) 설치하기

버추얼박스(VirtualBox) 를 이용해서 다양한 OS 를 자신의 컴퓨터에 설치할 수 있습니다. 저는 직업 특성상 리눅스 OS 를 접할 일이 많습니다. 별도로 컴퓨터를 마련해서 리눅스 테스트 환경을 갖추

mainia.tistory.com

 

728x90

'etc' 카테고리의 다른 글

window10에 linux 설치하기  (0) 2022.10.26
윈도우 cuda 여러 버전 설치 및 사용  (1) 2022.10.25
728x90

NVIDIA 드라이버 다운로드 및 설치

https://www.nvidia.co.kr/Download/index.aspx?lang=kr 

 

CUDA toolkit 다운로드 및 설치

https://developer.nvidia.com/cuda-toolkit-archive

쿠다 여러 개 설치 중 you already have a newer version of the nvidia frameview sdk installed 에러가 나는 경우

→ 원인 : 최신버전의 nvidia frameview sdk가 이미 설치되어 있어서 나타나는 현상

→ [프로그램추가/제거]에서 nvidia frameview sdk 삭제 후 설치 (새로 설치 될 것이기 때문에 삭제해도 무관)

 

CuDNN 다운로드 및 설치

https://developer.nvidia.com/rdp/cudnn-download#a-collapse714-92

다운로드된 zip파일을 압축해제 후 내용물을 CUDA 설치경로로 복사 붙여넣기

좌 : CUDA 설치 디렉토리 / 우 : CuDNN 압축해제 디렉토리

 

시스템변수 등록

내 PC 우클릭 > 속성 > 고급시스템설정 > 시스템변수

CUDA_PATH, NVCUDASAMPLES_ROOT에 default로 사용할 CUDA 버전으로 변경해주기

Path에 default로 사용할 CUDA버전을 위로 이동해주기

※ 다른버전 쿠다를 사용하고 싶은데 안잡힐 때 위와같이 시스템변수 조정해주면 잡힘

728x90

'etc' 카테고리의 다른 글

window10에 linux 설치하기  (0) 2022.10.26
Oracle VM VirtualBox 설치 & VM에 Ubuntu 설치  (0) 2022.10.26
728x90

nginx > 웹서버

  • 정적 파일을 처리하는 HTTP 서버로서의 역할
    • HTML, CSS, Javascript, 이미지와 같은 정보들을 웹브라우저에 전송하는 역할
  • 응용프로그램 서버에 요청을 보내는 리버스 프록시로서의 역할
    • 클라이언트가 가짜 서버에 요청하면, 프록시 서버가 배후서버(reverse server)로부터 데이터를 가져오는 역할을 한다.
    • 프록시 서버가 Nginx, 리버스 서버가 응용프로그램 서버를 의미
    • 웹 응용프로그램 서버에 리버스 프록시(Nginx)를 두는 이유는 요청에 대한 버퍼링 때문
    • 클라이언트가 직접 App 서버에 요청하는 경우 프로세스 1개가 응답 대기상태가 되어야 하기 때문에, 프록시 서버를 둠으로서 요청을 배분하는 역할을 함
      • nginx.conf 파일에서 location 지시어를 사용하여 요청을 배분
      • Nginx는 비동기 처리 방식(Event-Drive) 방식을 채택

설치

  • 리눅스 설치
su - # 관리자모드 
apt-get update # apt-get 업데이트 
sudo apt-get install nginx # nginx 설치 
nginx -v # nginx 버전
  • 윈도우 설치

nginx 기본 명령어

## nginx.exe가 존재하는 위치에서 아래 명령어 사용 ##

# 버전
nginx -v

# 시작 : nginx 설치경로로 가서 nginx.exe 더블클릭
nginx (nginx 명령어로 시작 가능하지만 cmd 멈춤.. 끄고 다른 cmd창 열어야함)

# 기동 중인 nginx에 명령하기
## 설정파일 변경 반영을 위해 reload (내린 후 다시 로드해야 되는 경우도 있음)
nginx -s reload;  
## 멈추기
nginx -s stop

nginx 디렉토리 구조 (리눅스 버전)

sudo find / -name nginx.conf # 디렉토리 찾기
cd /etc/nginx # nginx 경로로 이동

sudo apt-get install tree # 트리명령어 사용을 위해 설치
tree . # 현재 디렉토리 트리구조로 보기

nginx.conf 기본 환경설정 튜닝하기

nginx.conf 파일은 Nginx가 동작해야 할 방식을 설정 값을 통해 지정

root 계정만 수정이 가능하기 때문에, 수정이 필요하다면 sudo vim nginx.conf 를 통해 파일 열기

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 768;
        # multi_accept on;
}

http {

        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        # server_tokens off;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # SSL Settings
        ##

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        ##
        # Logging Settings
        ##

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        ##
        # Gzip Settings
        ##

        gzip on;

        # gzip_vary on;
        # gzip_proxied any;
        # gzip_comp_level 6;
        # gzip_buffers 16 8k;
        # gzip_http_version 1.1;
        # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}


#mail {
#       # See sample authentication script at:
#       # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
#       # auth_http localhost/auth.php;
#       # pop3_capabilities "TOP" "USER";
#       # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
#       server {
#               listen     localhost:110;
#               protocol   pop3;
#               proxy      on;
#       }
#
#       server {
#               listen     localhost:143;
#               protocol   imap;
#               proxy      on;
#       }
#}

최상단(Core 모듈)

user  seokhwa; # (default : www-data)
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
  • user : NGINX 프로세스가 실행되는 권한
    • nginx는 마스터(master)와 워커(worker) 프로세스로 나뉜다.
    • 워커 프로세스가 실질적인 웹서버 역할을 수행한다.
    • user 지시어는 워커 프로세스의 권한을 지정한다.
    • 워커 프로세스를 악의적 사용자가 제어하면 해당 머신을 최고 사용자의 권한으로 원격제어하는 것이기 때문에 위험하다.
  • work_processes : NGINX 프로세스 실행 가능 수
    • 위에서 언급한 워커 프로세스이다. 실질적인 웹서버 역할을 한다.
    • auto도 무방하지만, 명시적으로 서버에 장착되어 있는 코어 수 만큼 할당하는 것이 보통이며, 더 높게도 설정 가능하다.
  • pid : NGINX 마스터 프로세스 ID 정보가 저장됨

events 블락

events { 
    worker_connections  1024;
    # multi_accept on; (디폴트값 : off) 
}
  • NGINX의 특징인 비동기 이벤트 처리 방식에 대한 옵션 설정
  • worker_connections는 하나의 프로세스가 처리할 수 있는 커넥션의 수
  • 최대 접속자수 = {worker_processes} X {worket_connections}

http 블락

http { 
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
 
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';
 
    access_log  /var/log/nginx/access.log  main;
 
    sendfile        on;
 
    #tcp_nopush     on; 
 
    keepalive_timeout  65;
 
    #gzip  on; 
 
    include /etc/nginx/conf.d/*.conf;
}
  • keepalive_timeout : 접속시 커넥션을 몇 초동안 유지할지에 대한 설정값
    • 이 값이 높으면 불필요한 커넥션(접속)을 유지하기 때문에 낮은 값 또는 0을 권장한다. (default=10)
  • servers token : NGINX의 버전을 숨길것인가에 대한 옵션
    • 보안상 주석을 제거하여 설정하는 것이 좋다.
  • types_hash_max_size, server_names_hash_bucket_size 호스트의 도메인 이름에 대한 공간 설정
    • 이 값이 낮을 경우 많은 가상 호스트 도메인을 등록한다거나, 도메인 이름이 길 경우 bucket 공간이 모자라 에러가 생길 수 있으므로 넉넉하게 설정하는 것이 좋다.

기타

  • include옵션 : 가상 호스트 설정이나 반복되는 옵션 항목을 inlcude를 통해 불러올 수 있다.
    • 리버스 프록시를 각 도메인에 설정한다고 했을 떄 헤더 처리 옵션등을 conf.d디렉토리에 넣어두고 incldue 명령을 통해 불러올 수 있다.
728x90
728x90

파이썬 설치 (Windows 기준)

1. Windows installer 필요한 버전 다운로드

https://www.python.org/downloads/windows/

default로 사용할 파이썬 버전 한 개만 PATH에 등록 체크하여 설치

2. 설치 경로

  • default : Install Now를 통해 설치하면 C:\Users\{usr_name}\AppData\Local\Programs\Python\Python310 경로에 설치됨
  • 사용자지정 : Customize installation을 통해 설치 경로 지정 가능

3. 설치된 파이썬 확인

  • cmd에서 아래 명령어를 통해 설치된 파이썬 리스트를 확인 가능
## 설치된 파이썬 리스트
py --list
# Installed Pythons found by py Launcher for Windows
# -3.10-64 *
# -3.7-64

## 설치된 파이썬 리스트와 경로
py --list-paths
# Installed Pythons found by py Launcher for Windows
# -3.10-64       C:\project\common\Python\Python310\python.exe *
# -3.7-64        C:\project\common\Python\Python37\python.exe

## py 도움말 : # py -h를 통해 출력 가능

## 파이썬이 여러 개 설치되어있는 경우 py -버전 명령어를 통해 실행 가능
py -3.7  # 3.7버전 실행

## pip 사용 시 -m 옵션을 주어 py 명령라인에서 pip 실행 가능
py -3.7 -m pip install 라이브러리명

 

파이썬 개발환경 관리 (pipenv)

pipenv는 파이썬에서 격리된 가상 환경(virtual environment)과 프로젝트 단위의 패키지 관리를 가능하게 하는 도구

서로 다른 환경의 프로젝트를 컴퓨터 한 대로 개발해야 하는 경우 각 프로젝트 별로 격리된 환경 필요

pipenv를 통해 격리된 가상환경 구성 가능

cmd에서 아래 명령어를 실행하여 pipenv 사용 가능

1. 설치

# 파이썬을 설치한지 오래 된 경우 pip 업그레이드가 필요할 수 있음 (pip install --upgrade pip)
pip install pipenv

2. 가상환경 만들기

# 프로젝트 경로로 이동
cd project1

# 가상환경에서 사용할 파이썬 버전을 --python 옵션에 명시하여 pipenv 커맨드를 실행하면 가상환경 생성됨
pipenv --python 3.10

프로젝트 디렉터리에 Pipfile이 생성됨

프로젝트의 메타 정보가 저장됨

3. 가상환경 사용

# 가상환경 shell에 접속 / 나가기
pipenv shell
exit

# 가상환경 제거
pipenv --rm

# 가상환경 내에 패키지 설치 > 설치한 패키지가 pipfile에 자동으로 명시됨
# pipfile을 통해 어디에서든 동일한 파이썬 개발환경 구성 가능 (동일한 환경을 구성하고 싶은 경로에 pipfile을 복사 후 pipenv install)
pipenv install 패키지명

# 파이썬 실행 / 중단
pipenv run python
exit()

# 프로젝트에 설치된 패키지들을 트리구조로 시각화하여 보여줌
pipenv graph

# 보안취약점이 있는 패키지가 설치되어있는지 체크
pipenv check
728x90

+ Recent posts