<nginx로 업스트림을 이용한 로드밸런싱>
■ 로드 밸런싱 기법
- 라운드로빈 방식 : 서버에 들어온 요청을 순서대로 돌아가며 배정하는 방식
Client가 요청한 순서대로 분배하기때문에 여러대가 동일한 스펙을 가지고있음
서버와의 연결이 오래 지속되지않는경우 활용하기 적합
- 가중 라운드로빈 방식 : 각 서버마다 가중치를 매기고 가중치가 높은 서버 Client 요청을
우선적으로 배분.
주로 서버의 트래픽 처리능력이 상이한 경우 사용되는
부하 분산 방식.
- IP 해시 방식 : Client의 IP주소를 특정 서버로 매핑하여 요청을 처리하는 방식.
사용자가 항상 동일한 서버로 연결되는 것을 보장함.
- 최소연결방식 : Client 요청이 들어온 시점에 가장 적은 연결상태를 보이는 서버에
우선적으로 트래픽 배분.
자주 세션이 길어지거나 서버에 분배된 트래픽들이 일정하지않을때 적합.
- 최소 응답 시간 방식 : 서버의 현재 연결 상태와 응답시간을 모두 고려하여 트래픽 배분
가장 적은 연결 상태와 가장 짧은 응답시간을 보이는 서버 우선적으로 로드배분.
cd /var/log/nginx
ls
ll
[에러로그 보는 명령어]
sudo tail error.log
[실시간으로 보는 명령어]
sudo tail -f error.log
끌때는 컨트롤+c
[경로확인명령어]
pwd
==================================================
ASCII 텍스트 파일 - cat tail head 로 볼수있는 파일
이진파일 - 기계어로 된것
==================================================
include : 전처리기 // 모듈별로 처리하려고씀
nginx.conf mime.types
include : 포함시킬 외부파일을 정의한다.
mime.types란 파일에 작성되어진 내용들을 현재 파일
로 가져오는 것을 뜻한다.
default_type : 웹서버의 기본 Content-Type을 정의한다.
log_format : 로그 형식을 지정한다. 후술한 로그 형태에 따라 로그가 작성되고 기록된다.
access_log : 접속 로그가 쌓이는 경로이다.
sendfile : sendfile() 함수의 사용여부를 지정한다.
sendfile() 함수는 한 파일의 디스크립터와
다른 파일의 디스크립터 간에 데이터를 복사하는 것으로
커널 내부에서 복사가 진행된다.
====================================================
[설치명령어]
net-tools : 네트워크 관련 명령이 있는 패키지
netstat, ifconfig ...
bind-utils : 네임서버 관련 명령이 있는 패키지
nslookup
man netstat
netstat -ant
listen 접속 대기상태
established 접속 완료상태
cd /usr/share/nginx/html
vim index.html (잠깐확인)
vim hello.html (만든거)
===================================================
<default.conf>
sudo vim /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html; #root의 시작위치
index index.html index.htm; #기본파일 위치
}
#error_page 404 /404.html; #본인오류
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html; #서버오류
location = /50x.html {
root /usr/share/nginx/html;
}
-------------------------아래연관----------------------------
/etc/nginx/nginx.conf : nginx 환경설정
/etc/nginx/conf.d/default.conf : default 환경설정
include /etc/nginx/conf.d/.conf; : default에있는 .conf를 가져와서 실행
#include : 포함시킬 외부파일을 정의한다. mime.types란 파일에 작성되어진 내용들을 현재 파일
로 가져오는 것을 뜻한다.
==============================================================
로드밸런스 ex) 게임에서 업데이트를 해야할때 서버 일부분을 업데이트시키는중
나머지서버에 유저를 몰아넣고 나눠서 업데이트
<Upstream을 이용한 로드 밸런싱 중 라운드로빈 기법> : 한번씩 나눠서 트래픽을 보냄
■ Round Robin (라운드 로빈)
서버의 가중치를 고려해, 실제 서버들을 처음부터 차례로 선택해 가며 모든 서버로 균등하게
분산 됨 (default)
-장점 : 거의 균등하게 분산 가능
-단점 : 경로가 보장 되지 않음
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
upstream web {
server 192.168.100.101:80;
server 192.168.100.102:80;
}
server {
location / {
root html;
index index.html;
proxy_pass http://web;
}
}
==============================================================
■ ip_hash
Hasing key 를 사용하여 IP 별로 Index 를 생성하여 경로를 지정
요청이 전송되는 서버는 클라이언트 IP 주소에서 결정됨
IPv4 주소의 처음 세개의 octets 또는 전체 IPv6 주소가 해시 값을 계산하는 데 사용됨
-장점 : 경로 보장 가능
-단점 : 균등한 분산이 어려움
/etc/nginx/nginx.conf => vim nginx.conf에서 server위에 ip_hash; 쓰면 됨
새로고침해도 마지막 열었던 IP만 열림
===============================================================
<Nginx를 이용한 HTTP 부하분산> : 1번 2~3번으로 나눠서 트래픽을 보냄
-가중 라운드로빈 방식
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
upstream web {
server 192.168.100.101:80 weight=1;
server 192.168.100.102:80 weight=2;
server 192.168.100.103:80 backup; #103서버가없어서 참고용
}
server {
listen 80;
server_name www.ryu.com;
location / {
root html;
index index.html;
proxy_pass http://web;
}
}
==================================================================
Proxy Server
클라이언트측
프록시 서버는 클라이언트가 자신을 통해서 다른 네트워크 서비스에 간접적으로 접속할 수 있게
해주는 컴퓨터 시스템이나 응용 프로그램을 가리킨다. 서버와 클라이언트 사이에 중계기로서 대리로
통신을 수행하는 것을 가리켜 '프록시', 그 중계 기능을 하는것을 프록시 서버라고 부른다.
캐싱 : 클라이언트가 요청한 내용을 캐싱해 두어 여러가지 부가적인 효과를 나타내게 한다.
익명성 : 클라이언트측에서 서버에 포워드 프록시를 거치면 서버는 프록시가 요청을 보낸것으로 인식
Reverse Proxy
서버측
캐싱 : 포워드 프록시와 동일
보안 : 서버의 정보를 클라이언트로부터 숨길 수 있다
====================================================================
■ 대칭키
암호화, 복호화 할 때 사용하는 키가 동일한 경우, 1개의 키 사용
어떤 키로 암호화 했다면, 수신자도 같은 키가 있어야 복호화 가능
말 그대로 대칭시켜 봐서 맞을 시 자물쇠가 열리는 개념
■ 비대칭키
암호화 할 때 사용하는 키와 복호화할 때 사용하는 키가 다른 경우
2개의 키를 사용하며, 비밀키(개인키)와 비밀키를 토대로 만든 공개키가 쌍을 이룬 형태
공개키(Public key): 사람들에게 공개된 키, 정보를 암호화 가능
비밀키(Private key): 사용자만 알고 있는 암호를 풀 수 있는 키
====================================================================
cd ~/.ssh
[putty ssh 키 생성 검색][client로 dns 원격 접속하기]
dns 에서 netstat -ant 로 확인
[centos@dns~] mkdir .ssh
[centos@dns~] cd .ssh
chmod 700 .ssh
[centos@dns~] vim authorized_keys
puttygen 들어가서 비밀키 생성한뒤에 비밀키 복사
vim /etc/ssh/sshd_config
38번째줄에있는 Permitroot 주석제거하면 root접속 허용하게할수있음
sudo systemctl restart sshd
putty 가서
connection -> ssh -> auth
client key 삽입
data -> username : centos
다시 dns가서 vim /etc/ssh/sshd_config 들어가서
65번째줄에있는 passwordauthentication yes 이부분 주석처리제거하면
패스워드 안치고 들어갈수있음
DNS - 공개키 : ~/.ssh/authorized_keys
ubuntu 공개키 : ~/.ssh/ubuntu_key.pub
win(Putty) - 개인키 : client-key.ppk
ubuntu 개인키 : ubuntu_key
==================================================
[client 키 생성해서 원격접속하기]
ssh-keygen -t rsa #현재 폴더에 개인키 공개키 만드는 명령어
ssh-copy-id centos@192.168.100.10
dns로가서 ls로 authorized_keys 확인하고
rm -rf authorized_keys 지웠다가 다시 client로가서 카피한뒤에
dns에서 ll쳐서 authorized_keys확인
dns에서는 cat authorized_keys
client에서는 cat id_rsa.pub
dns에서 ssh-keygen -t rsa : 파일만들어주고 개인키를 client에 전달
client에서 vim dns-key만들고 dns가서 cat id_rsa 치고 나온값복사해서
client에 vim dns-key 붙혀넣고 저장하고나와서 ll확인
client에서 ssh -i dns-key centos@192.168.100.10치면
dns로 원격접속하는데 패스워드 없어져야됨
========================================
[수정]
client에서 ~/.ssh 상태에서 ls해보면 dns-key id_rsa.pub known_hosts 삭제
dns에서 ll -al 해보면 .ssh 나오는거 삭제
=======================================
client에서 ssh-keygen -t rsa 만들고 ll
ssh-copy-id centos@192.168.100.10 // figer나오면 yes하고 password입력
==========================================
known_hosts : 서버와 클라이언트간 메시지 암호화
authorized_keys : 공개키
서버 : DNS
[클라이언트]
Ubuntu : ssh-keygen -t rsa -> ~/.ssh/id_rsa, id_rsa.pub(개인키,공개키)
ssh-copy-id centos@192.168.100.10 : id_rsa.pub => DNS의 ~/.ssh/authorized_keys로 복사
Win10(Putty) : Puttygen => Generate => private_key 저장 => Key 복사해서 DNS의
~/.ssh/authorized_keys로 복사
서버에서 키만들고 폴더이름을 다르게 저장할때는
client에서 키만들고 dns에서 따로 키만들고
dns 키설정 복사해서 client파일따로만들어서 복사저장