Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[0주차/웬티] 워크북(부록) 제출합니다. #12

Merged
merged 1 commit into from
Sep 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added keyword/chapter00/images-1/1-1-Wenty-VPC.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added keyword/chapter00/images-1/1-2-Wenty-Subnet.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added keyword/chapter00/images-1/1-3-Wenty-IG.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added keyword/chapter00/images-1/3-1-WentyWebServer.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added keyword/chapter00/images-1/4-1-config-작성.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added keyword/chapter00/images-2/1-nginx-location.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added keyword/chapter00/images-2/2-wenty-wenty.html.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added keyword/chapter00/images-2/5-web-welcom.html.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added keyword/chapter00/images-2/6-web-ddol.html.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added keyword/chapter00/images-2/7-text-hellotxt.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added keyword/chapter00/images-2/8-reverse-proxy-1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added keyword/chapter00/images-2/8-reverse-proxy-2.png
141 changes: 141 additions & 0 deletions keyword/chapter00/supplement-AWS-keyword.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
### 🎯핵심 키워드
---
- AWS
- Amazon Web Service
- 아마존이 제공하는 종합적인 클라우드 컴퓨팅 플랫폼
- 인프라 기술(컴퓨팅, 스토리지, 데이터베이스 등)부터 새로운 기술(기계학습 및 인공지능, 사물 인터넷 등)까지 많은 서비스와 서비스 내 기능을 제공한다.
- 기업 및 개발자가 애플리케이션을 보다 빠르고 효율적으로 개발하고 배포할 수 있도록 한다.
- 인프라 구축 비용을 절감하고 유연성을 높일 수 있다.
- 기존 애플리케이션을 클라우드로 이동하고 상상할 수 있는 거의 모든 것들을 구축할 수 있다.
- 리전과 가용영역
- 리전
- AWS에서 수많은 컴퓨팅 서비스를 하려면 대규모의 서버 컴퓨터를 모아 둔 곳이 필요한데, 한 곳에 전부 다 몰아두면 발생하는 문제점들을 해결하고자 서비스 하기 위한 자원들을 여러 곳에 분산해서 배치를 해둔 것이다.
- 가용영역
- 리전을 한번 더 분산해서 배치한 것
- 하나의 리전 내에서 독립적으로 운영되는 하나 이상의 데이터 센터 그룹
- 서브네팅
- IP 주소 낭비를 방지하기 위해 원본 네트워크를 여러 개의 서브넷으로 분리하는 과정
- 즉, 서브넷 마스크의 bit 수를 증가시키는 것
- 서브넷 마스크의 bit수를 1씩 증가시키면 할당할 수 있는 네트워크가 2배수로 증가하고 호스트 수는 2배수로 감소한다.
- ex. 192.168.32.0/24
- 할당 가능 네트워크 수 = 1, 할당 가능 호스트 수 = $2^8 - 2$
- 192 ≤ 192 ≤ 223 → C 클래스
- 24 + 1 bit 증가시켜 서브네팅하면 2(= $2^1$)개의 서브넷으로 분할된다.
- 192.168.32.0/25 → 11111111.1111111.11111111.00000000
- 192.168.32.128/25 → 11111111.1111111.11111111.10000000
- 할당 가능 네트워크 수 = 2
- 할당 가능 호수트 수 = $2^7 - 2$
- 만약 2-bit를 증가시켜 서브네팅하면 4(= $2^2$)개의 서브넷으로 분할된다.
- 192.168.32.0/27 → 11111111.1111111.11111111.00000000
- 192.168.32.64/27 → 11111111.1111111.11111111.01000000
- 192.168.32.128/27 → 11111111.1111111.11111111.10000000
- 192.168.32.192/27 → 11111111.1111111.11111111.11000000
- 라우팅
- 패킷에 포함된 주소 정보를 보고 패킷을 목적지까지 체계적으로 다른 네트워크에 전달하는 경로 선택 및 스위칭을 하는 과정
- 여러 네트워크들의 연결을 담당하는 라우터 장비가 패킷이 특정 방향으로 가는 빠르고 정확한 길을 찾아 전달해준다.
- (1) 라우터는 전달 받은 패킷에서 가장 먼저 목적지가 어디인지 IP 주소를 확인한다. → (2) 가장 빠른 경로가 어디인지 확인하고 그 경로로 가기 위해 자신의 어느 인터페이스로 패킷을 내보내야 하는 지 결정한다. → (3) 결정한 인터페이스로 전달된 패킷은 또 다른 라우터로 전달되어 (1), (2)의 과정을 목적지 네트워크에 도착할 때까지 반복한다.
- 패킷의 목적지 주소를 라우팅 테이블과 비교하여 어느 라우터에게 넘겨줄 지 판단한다.
- 라우팅 테이블
- 라우팅 프로토콜의 가장 중요한 목적
- 목적지까지 갈 수 있는 모든 경로들 중 가장 효율적이라고 판단되는 경로 정보를 모아둔 공간
- 패킷의 목적지와 목적지를 가려면 어느 인터페이스로 가야 하는 지에 대한 정보를 가지고 있다.
- VPC
- Virtual Private Cloud
- AWS에서 제공하는 논리적으로 격리된 네트워크 환경
- VPC는 기본적으로 가상의 네트워크 영역이기에 사설 아이피 주소를 가진다.
- 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/24
→ 이 3개의 대역을 가지며, 하나의 VPC에는 이 네트워크 대역, 혹은 서브넷 대역이 할당 가능하다.
- VPC 내에서 여러 서브넷을 생성하여 퍼블릭 또는 프라이빗으로 설정할 수 있다.
- 패킷이 이동할 경로를 설정하거나 인터넷 게이트웨이를 통해 퍼블릭 인터넷에 연결할 수 있습니다.
- 사설 IP주소
- 어떤 네트워크 안에서만 내부적으로 사용되는 고유한 주소
- 공유기에 연결되어 있는 가정이나 회사의 각 네트워크 기기에 할당된다.
- 하나의 네트워크 안에서 유일하며 네트워크 내부에서만 접근이 가능하다.
- 같은 대역의 IP를 할당 받은 모든 기기에 접속이 가능하다. 같은 대역의 사설 IP에 붙어있지 않은 경우(같은 와이파이에 붙어있지 않은 경우) 접속이 불가능하다.
- 포트포워딩
- 하나의 공용 아이피 주소를 가진 공유기가 자신의 포트를 통해 올바른 사설 아이피 주소를 가진 디바이스에게 데이터를 주는 것
- 외부에서 특정 포트로 들어오는 트래픽을 내부의 특정 장치로 전달해 외부에서 내부 서비스에 접근할 수 있게 한다(NAT의 확장).
- NAT는 포트포워딩을 통해 필요한 서비스에 대한 접근을 허용함으로써 유연한 네트워크를 구성한다.
- ex. 원격 데스크톱 연결
- 내부 PC의 IP: 192.168.1.100 / 원격 데스크톱 포트: 3389
- 라우터의 공인 IP의 포트 3389로 들어오는 트래픽을 192.168.1.100의 포트 3389로 전달
→ 외부에서 공인 IP 주소와 포트 3389로 접속하면 NAT 라우터가 해당 트래픽을 내부 PC로 전달해 원격 접속이 가능해진다.
- NAT 프로토콜
- Network Adress Translation
- 사설 IP와 공인 IP 간의 주소 변환을 통해 내부 네트워크의 장치들이 인터넷에 접속할 수 있게 한다.
- 사설 네트워크 내부에서 사설 IP 주소를 사용하고 외부 인터넷과의 통신을 위해선 하나의 공인 IP 주소를 통해 트래픽을 주고 받는다.
- ex. WIFI 공유기
- WIFI 공유기는 내부 네트워크의 장치들에게 사설 IP 주소를 할당하고 외부 인터넷과의 통신 시 NAT 기능을 통해 공인 IP 주소로 변환한다.
- 공유기의 물리적 포트는 장치들을 네트워크에 연결해주고 각 포트에 연결된 장치들에게 IP 주소를 부여한다.
- _포트번호_
- 0주차 워크북 참고

### 📦 실습
---
#### 실습 1 - VPC를 이용한 EC2 구축

![images-1/1-1-Wenty-VPC.png](images-1/1-1-Wenty-VPC.png)
- “Wenty-VPC” VPC 생성
- 사설 IP 대역 - 10.0.0.0/16

![images-1/1-2-Wenty-Subnet.png](images-1/1-2-Wenty-Subnet.png)
- Wenty-VPC 내에 “Wenty-Subnet” 서브넷 생성
- IP 대역: 10.0.1.0/24

![images-1/1-3-Wenty-IG.png](images-1/1-3-Wenty-IG.png)
- “Wenty-IG” 인터넷 게이트웨이 생성 및 Wenty-VPC 연결

![images-1/1-4-라우팅-편집.png](images-1/1-4-라우팅-편집.png)
- Wenty-VPC 라우팅 테이블 편집

![images-1/1-5-서브넷-연결.png](images-1/1-5-서브넷-연결.png)
- Wenty-IG를 거쳐 외부와 통신하도록 설정된 라우팅을 Wenty-Subnet에 연결한다.
- Wenty-Subnet은 퍼블릭 서브넷이 된다.

#### 실습 2 - 보안 그룹 생성하기

![images-1/2-1-Wenty-WebServerGroup-1.png](images-1/2-1-Wenty-WebServerGroup-1.png)
- 보안 그룹 "Wenty-WebServerGroup" 생성

![images-1/2-1-Wenty-WebServerGroup-2.png](images-1/2-1-Wenty-WebServerGroup-2.png)
- Wenty-WebServerGroup 인바운드 규칙 설정
- 인바운드 규칙: 클라이언트가 자신의 서버 데이터에 들어올 수 있는 규칙
1. 사용자 지정 TCP(port: 3000) - Node.js 서버에서 사용된다.
2. SSH(port: 22) - 원격 서버에 접속할 때 사용된다.
3. HTTPS(port: 443) - 웹 브라우저와 서버 간에 암호화된 통신을 할 때 사용된다.
4. MySQL/Aurora(port: 3306) - MySQL 데이터베이스에서 사용된다.
5. HTTP(port: 80) - 비암호화된 웹 트래픽을 처리한다.
6. 사용자 지정 TCP(port: 8080) - 테스트 및 개발 서버에 사용된다.

#### 실습 3 - EC2 생성하기

![images-1/3-1-WentyWebServer.png](images-1/3-1-WentyWebServer.png)
- "Wenty-WebServer" 인스턴스 생성
- VPC - Wenty-VPC 설정
- 서브넷 - Wenty-Subnet 설정
- 퍼블릭 IP 자동 할당 활성화
- "Wenty-KeyPair" 키 페어 생성
- 보안 그룸 - Wenty-WebServerGroup 설정

#### 실습 4 - 탄력적 IP 설정하기

과금 때문에 PASS 🥲
탄력적 IP를 설정하면 인스턴스의 인터넷 게이트웨이를 거쳐 통신 시 부여 받을 IP 주소를 고정시키기 때문에 EC2 인스턴스를 중지 후 재실행해도 IP 주소가 바뀌지 않는다.
하지만 지금은 탄력적 IP를 설정하지 않아 인스턴스를 중지 후 재실행하면 IP 주소가 바뀔 것이다.

![images-1/턴력적IP-설정X-1.png](images-1/턴력적IP-설정X-1.png)
↑ 중지 후 재실행 ↓
![images-1/턴력적IP-설정X-2.png](images-1/턴력적IP-설정X-2.png)
- 퍼블릭 IP 주소가 바뀌어져 있다.

#### 실습 4-2 - 원격 접속 - VSCode (Node.js)

![images-1/4-1-config-작성.png](images-1/4-1-config-작성.png)
- config 파일에 호스트 별명, 호스트 이름(EC2 퍼블릭 IP 주소), 접속할 사용자 이름(ubuntu), EC2 접속 시 필요한 .pem 키의 위치(키 페어 생성 시 download 폴더에 저장된다)를 작성한다.

![images-1/4-2-Wenty-test_ec2-connected.png](images-1/4-2-Wenty-test_ec2-connected.png)
- connected -> "Wenty-test-ec2" EC2 원격 접속 완료!

#### 실습 5(fin) NGINX 설치하고 브라우저에서 접속하기
![images-1/5-1-NGINX-설치-접속.png](images-1/5-1-NGINX-설치-접속.png)
- 브라우저에 EC2 퍼블릭 IP 주소로 접속 시 해당 화면이 뜬다 🤩
71 changes: 71 additions & 0 deletions keyword/chapter00/supplement-Server-keyword.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
### 🎯핵심 키워드
---
- TCP
- Transport layer에서 사용하는 프로토콜
- 장치들 사이에 논리적인 접속을 성립(Establish)하기 위하여 연결을 설정하여 신뢰성을 보장하는 연결형 서비스
- 3-way handshaking 과정을 통해 연결을 설정한다.
1. 클라이언트가 서버에 SYN을 보내고 SYN_SENT 상태로 대기한다.
2. 서버는 SYN_RCVD 상태로 바꾸고 SYN과 응답 ACK를 보낸다.
3. SYN과 응답 ACK을 받은 클라이언트는 ”Established” 상태로 변경하고 서버에게 응답 ACK를 보낸다.
4. 응답 ACK를 받은 서버는 ”Established” 상태로 변경한다.
- 신뢰성이 높은 전송을 보장한다.
- 정상적인 상황에서는 ACK이 연속적으로 전송된다. 그러나 ACK이 중복으로 올 경우 패킷 이상을 감지하고 재전송을 요청한다.
- 일정 시간 동안 ACK 값이 수신을 못할 경우 재전송을 요청한다.
- UDP
- User Datagram Protocol
- 일방적이며 비연결지향형 프로토콜이다.
- 순서 및 데이터 전송이 보장되지 않으며 TCP에 비해 빠르다.
- 간단한 데이터를 빠른 속도로 전송하고자 하는 애플리케이션에서는 UDP를 사용한다.
- 시스템 콜
- 운영 체제의 커널이 제공하는 서비스에 대해 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스
- 사용자 프로그램이 특권 명령(커널 모드)의 수행을 필요로 하는 경우, 운영체제에게 특권 명령의 대행을 요청한다.
1. 각 시스템 콜에는 번호가 할당되고 시스템 콜 인터페이스는 시스템 콜 번호와 시스템 콜 핸들러 함수 주소로 구성되는 시스템 콜 테이블을 유지한다.
2. 운영체제는 자신의 커널 영역에서 해당 인덱스가 가리키는 주소에 저장되어 있는 루틴을 수행한다.
3. 작업이 완료되면 CPU에게 인터럽트를 발생시켜 수행이 완료되었음을 알린다.
- 하드웨어 인터럽트
- 하드웨어가 발생시키는 인터럽트
- 인터럽트
1. CPU가 입출력 작업을 요청한 후 그 작업을 완료할 때까지 기다리는 동안 다른 작업을 수행한다(비동기 처리, 멀티태스킹).
2. 이 과정에서 CPU는 입출력 작업을 기다리지 않고 다른 프로세스나 스레드를 처리하며 CPU가 쉬는 시간을 최소화한다.
3. 입출력 작업이 완료되면 입출력 장치(ex. 디스크, 네트워크 장치 등)가 인터럽트를 CPU에 보내고 이 인터럽트는 CPU에게 입출력 작업이 완료되었음을 알린다.
4. CPU는 이를 처리하여 해당 작업의 후속 작업을 이어갈 수 있다.
- CPU가 아닌 다른 하드웨어 장치가 CPU에 어떤 사실을 알려주거나 CPU 서비스를 요청해야 할 경우 발생시킨다.
- 리눅스의 파일과 파일 디스크립터
- 리눅스의 파일
- 리눅스에서는 모든 것을 파일(프로세스 = 파일, 디렉토리 = 파일, App 프로세스 = 파일, ….)로 취급하며 소켓 또한 파일로 취급한다.
- 파일 디스크립터
- 리눅스 혹은 유닉스 시스템에서 프로세스가 파일을 다룰 때 사용하는 것으로 운영체제가 특정 파일에 할당해주는 정수값
- ex. 파일 디스크립터 값이 할당된 입출력
- stdin(표준입력) : 0 / stdout(표준출력) : 1 / stderr(표준에러) : 2
- socket() 시스템 콜
- socket(IP 주소 체계, 서비스 타입, 프로토콜)
- IPv4 통신(또는 IPv6 통신)을 위해 사용할지, TCP(또는 UDP)를 사용할지 미리 틀을 만들어두는 시스템 콜 → 소켓 생성
- bind() 시스템 콜
- bind(바인딩할 소켓, 바인딩할 소켓의 IP 주소, 소켓 IP 주소의 크기)
- 네트워크 통신을 위해 필요한 IP 주소와 port 번호를 고정해서 지정해 주는 시스템 콜
- 서버와 클라이언트는 1 : N 관계인데, 서버가 마음대로 IP 주소와 port 번호를 바꾸면 N에 해당하는 클라이언트는 혼동이 오기 때문에 서버는 IP 주소와 포트 번호가 고정되어야 한다(bind). 그러나 클라이언트는 그럴 필요가 없어 bind 시스템 콜이 없다(클라이언트는 통신 시 port 번호가 자동으로 부여된다).
- listen() 시스템 콜
- listen(소켓, TCP의 백로그 큐의 크기)
- 소켓을 클라이언트의 연결 요청을 받아들이도록 하며 backlog 크기만큼 backlog queue를 만드는 시스템 콜
- backlog: TCP에서의 backlog queue의 크기
- backlog queue: 클라이언트가 서버에 보내는 요청들을 저장하는 대기열
- 연결지향인 TCP에서만 사용된다.
- listen 시스템 콜을 통해 TCP를 연결 요청을 받아줄 수 있는 상태로 만든다. 즉, listen 시스템 콜은 TCP를 대기 상태로 만든다.
- 서버 측의 소켓은 listen 시스템 콜 이후 대기 상태에서 클라이언트의 연결 요청을 받아주기 위해 backlog queue를 가진 채로 기다린다.
- accept() 시스템 콜
- accept(소켓, 클라이언트의 주소 정보, 클라이언트의 주소 정보의 크기)
- backlog queue에서 SYN을 보내와 대기 중인 요청을 선입선출로 하나씩 연결에 대한 수립을 해주는 시스템 콜
- 선입선출 이후 3-way handshake를 수행한다.
- client가 보내는 SYN = listen 상태인 서버의 소켓에 연결 요청을 보내는 것
- 이후의 과정은 accept 시스템 콜 이후 진행하여 최종적으로 “Established” 상태를 수립하고 본격적인 데이터의 송/수신이 이뤄진다.
- 대기 중인 클라이언트의 요청을 차례로 수락함으로써 데이터를 주고 받을 수 있도록 한다.
- 멀티 프로세스
- 여러 개(2개 이상)의 프로세스가 동시에 실행하는 방식으로, 각각 독립적인 실행 흐름을 가진다.
- “동시에” → 동시성 vs 병렬성
1. 동시성(Concurrency): 은 CPU core가 1개(single core)일 때, 여러 process를 짧은 시간 동안 번갈아 가면서 연산을 하게 되는 시분할 시스템으로 실행되는 것. 동시에 여러 작업이 실행되는 것 같이 보인다.
2. 병렬성(Parallelism): CPU core가 여러 개(multi core)일 때 각각의 core가 각각의 process를 연산함으로써 process가 동시에 실행되는 것. 실제로 동시에 여러 작업이 처리된다.
- fork()는 멀티 프로세스를 구현하기 위해 사용되는 시스템 콜로, 부모 프로세스와 동일한 자식 프로세스를 복제한다. 생성된 자식 프로세스는 독립적으로 실행되고 부모는 자식의 종료를 처리해야 좀비 프로세스를 방지할 수 있다.
- 병렬 처리
- 여러 개의 작업을 (실제로) 동시에 실행해 효율을 높이는 처리 방식
- 멀티 코어 CPU 환경에서 하나의 작업을 분할해 각각의 코어가 병렬적으로 처리한다.
- 여러 쓰레드를 활용하는 멀티 쓰레딩과 여러 개의 프로세스를 활용하는 멀티 프로세싱이 있다.
Loading