CS 지식
1. 컴퓨터 구조란?
컴퓨터 구조는 컴퓨터 시스템의 기본적인 구성 요소와 그들 간의 상호작용을 설명하는 개념입니다.
이를 통해 컴퓨터가 데이터를 어떻게 처리하고, 저장하고, 전달하는지 이해할 수 있습니다. 주요 구성 요소는 다음과 같습니다:
입력 장치 (Input Devices)
- 역할: 사용자가 데이터를 컴퓨터에 입력할 수 있도록 도와줍니다.
- 예시: 키보드, 마우스, 스캐너, 터치스크린 등.
출력 장치 (Output Devices)
- 역할: 컴퓨터가 처리한 데이터를 사용자에게 전달합니다.
- 예시: 모니터, 프린터, 스피커 등.
중앙 처리 장치 (CPU, Central Processing Unit)
- 역할: 컴퓨터의 '뇌' 역할을 하며, 모든 데이터 처리 작업을 수행합니다.
- 구성 요소:
- 제어 장치 (Control Unit): 컴퓨터의 작업을 지시하고 조정합니다.
- 산술 논리 장치 (ALU, Arithmetic Logic Unit): 산술 연산(덧셈, 뺄셈 등)과 논리 연산(AND, OR 등)을 수행합니다.
메모리 (Memory)
- 역할: 데이터를 저장하고 필요할 때 CPU가 사용할 수 있도록 제공합니다.
- 종류:
- 휘발성 메모리 (Volatile Memory): 전원이 꺼지면 데이터가 사라지는 메모리. 예: RAM.
- 비휘발성 메모리 (Non-Volatile Memory): 전원이 꺼져도 데이터가 유지되는 메모리. 예: 하드 드라이브, SSD.
데이터 처리 과정
컴퓨터가 데이터를 처리하는 과정은 다음과 같습니다:
입력 받기 (Input)
- 사용자가 입력 장치를 통해 데이터를 입력합니다.
- 예: 키보드로 텍스트를 입력하거나 마우스로 클릭.
데이터 저장 (Storage)
- 입력된 데이터는 메모리에 저장됩니다.
- 메모리는 임시 저장소 역할을 하며, CPU가 데이터를 빠르게 접근할 수 있도록 합니다.
데이터 처리 (Processing)
- CPU가 데이터를 처리합니다.
- 산술 연산: 덧셈, 뺄셈, 곱셈, 나눗셈 등.
- 논리 연산: AND, OR, NOT 등의 논리적 조작.
출력 (Output)
- 처리된 데이터는 출력 장치를 통해 사용자에게 전달됩니다.
- 예: 화면에 결과를 표시하거나 프린터로 문서를 출력.
워크플로우 제어 (Workflow Control)
- 제어 장치는 전체적인 데이터 처리 과정을 관리하고 조정합니다.
- 입력, 저장, 처리, 출력의 순서와 타이밍을 제어합니다.
세부 구성 요소
- 레지스터 (Register): CPU 내부의 작은 저장 공간으로, 임시 데이터를 저장합니다.
- 내장 메모리 (Cache Memory): CPU에 가까이 위치한 메모리로, 자주 사용되는 데이터를 저장하여 접근 속도를 높입니다.
예시를 통한 이해
- 입력: 사용자가 키보드를 통해 "Hello"를 입력합니다.
- 저장: 입력된 "Hello"는 RAM에 저장됩니다.
- 처리: CPU는 "Hello"를 대문자로 변환하는 작업을 수행합니다 (산술 논리 연산).
- 출력: 변환된 "HELLO"가 모니터에 표시됩니다.
- 제어: 제어 장치는 이 모든 과정을 순서대로 수행하도록 조정합니다.
2. CPU
CPU란?
CPU(Central Processing Unit)는 컴퓨터의 두뇌로서, 모든 유형의 데이터 처리 작업을 수행하고 컴퓨터의 모든 부분의 작동을 제어합니다.
CPU가 없으면 컴퓨터는 작동할 수 없습니다.
CPU는 여러 가지 기능과 구조를 가지고 있습니다.
CPU의 주요 기능
- 데이터 처리: 모든 유형의 데이터를 처리합니다.
- 데이터 저장: 중간 결과와 명령어를 저장할 수 있는 내부 저장 장치를 갖추고 있습니다.
- 명령어 저장: 프로그램의 명령어를 저장하고 실행합니다.
- 제어: 컴퓨터의 모든 부분의 작동을 제어합니다.
CPU의 구성 요소
CPU는 세 가지 주요 구성 요소로 이루어져 있습니다:
산술 논리 장치(ALU, Arithmetic Logic Unit)
- 역할: 산술 연산(덧셈, 뺄셈, 곱셈, 나눗셈)과 논리 연산(AND, OR, NOT, 비교 등)을 수행합니다.
제어 장치(Control Unit)
- 역할: 컴퓨터의 모든 부분의 작동을 제어합니다. 제어 장치는 실제 데이터 처리 작업을 수행하지 않지만, CPU가 데이터를 어떻게 처리할지 지시하고 조정합니다.
레지스터(Register)
- 역할: 매우 빠른 속도로 데이터와 명령어를 임시로 저장합니다. 중간 결과를 저장하고, 연산에 필요한 데이터를 빠르게 접근할 수 있도록 도와줍니다.
메모리와 저장 장치
CPU 내부에도 데이터를 임시로 저장할 수 있는 메모리 기능이 있습니다.
이것은 메인 메모리(RAM)와는 다르며, CPU 내부에서 연산 중간 결과를 저장하기 위한 것입니다.
- RAM(Random Access Memory): CPU가 빠르게 접근할 수 있는 주 메모리로, 프로그램과 데이터가 실행되는 동안 임시로 저장됩니다.
- 내장 메모리(Cache): CPU와 가까운 위치에 있는 고속 메모리로, 자주 사용되는 데이터를 저장하여 연산 속도를 높입니다.
제어 장치의 주요 기능
제어 장치는 CPU의 중요한 부분으로, 다음과 같은 기능을 수행합니다:
- 데이터 및 명령 전송 제어: 컴퓨터의 다른 장치 간의 데이터와 명령 전송을 제어합니다.
- 장치 관리 및 조정: 모든 장치를 관리하고 조정합니다.
- 명령어 해석 및 실행 지시: 메모리에서 명령을 받아 해석하고 작동을 지시합니다.
- 작업 순서 제어: 작업의 순서를 제어하고, 다음에 실행할 명령어를 결정합니다.
- 시스템 상태 모니터링: 시스템의 상태를 모니터링하고 필요한 조정을 수행합니다.
예시를 통한 이해
- 데이터 입력: 사용자가 키보드를 통해 "2 + 3"을 입력합니다.
- 데이터 저장: 입력된 데이터는 RAM에 저장됩니다.
- 데이터 처리: CPU의 제어 장치는 "2 + 3" 명령을 ALU로 보냅니다. ALU는 연산을 수행하여 결과 값인 "5"를 계산합니다.
- 중간 결과 저장: 연산 결과 "5"는 레지스터에 임시 저장됩니다.
- 출력: 제어 장치는 결과 값을 출력 장치(모니터)로 보내어 사용자에게 표시합니다.
이와 같이, CPU는 데이터를 입력받아 처리하고, 중간 결과를 저장하며, 최종 결과를 출력하는 과정을 통해 컴퓨터의 핵심적인 역할을 수행합니다.
CPU 내부의 다양한 구성 요소와 그 기능을 이해하면 컴퓨터가 데이터를 어떻게 처리하고 작동하는지 알 수 있습니다.
3. 메모리
메모리란 무엇인가?
메모리는 컴퓨터가 데이터를 저장하고 접근하는 데 사용하는 장치입니다.
인간의 뇌가 기억을 저장하고 꺼내는 것과 유사합니다.
컴퓨터의 메모리는 데이터를 임시로 저장하거나 영구적으로 저장하는 기능을 가지고 있습니다.
메모리의 주요 기능
- 데이터와 명령어 저장: 컴퓨터가 작업을 수행할 때 필요한 데이터를 저장합니다.
- 메모리 주소: 각 데이터는 특정 주소에 저장되며, 컴퓨터는 이 주소를 통해 데이터를 찾아서 사용합니다.
메모리의 종류
메모리는 크게 세 가지로 나눌 수 있습니다: 캐시 메모리, 주 메모리, 보조 메모리.
캐시 메모리 (Cache Memory)
- 위치: CPU 내부에 위치합니다.
- 역할: 자주 사용하는 데이터를 임시로 저장하여 CPU가 빠르게 접근할 수 있도록 합니다.
- 특징:
- 속도: 매우 빠르지만 용량이 작고 비쌉니다.
- 비용: 성능이 좋지만 가격이 비싸서 용량이 제한적입니다.
- 용도: 주로 고성능 컴퓨터에 많이 사용됩니다.
주 메모리 (Main Memory)
- 유형: RAM과 ROM으로 나뉩니다.
- RAM (Random Access Memory): 휘발성 메모리로, 전원이 꺼지면 데이터가 사라집니다. 데이터를 읽고 쓸 수 있습니다.
- ROM (Read-Only Memory): 비휘발성 메모리로, 전원이 꺼져도 데이터가 유지됩니다. 데이터를 읽을 수만 있습니다.
- 특징:
- RAM: 주로 컴퓨터가 실행 중일 때 필요한 데이터를 저장하는 데 사용됩니다. 빠른 속도로 데이터를 읽고 쓸 수 있습니다.
- ROM: 컴퓨터의 기본적인 동작에 필요한 데이터를 저장하는 데 사용됩니다. 예를 들어, 컴퓨터가 부팅될 때 필요한 프로그램이 ROM에 저장됩니다.
- 유형: RAM과 ROM으로 나뉩니다.
보조 메모리 (Secondary Memory)
- 유형: 하드디스크, SSD, CD-ROM, DVD 등.
- 역할: 대용량 데이터를 영구적으로 저장합니다. 데이터를 읽고 쓸 수 있습니다.
- 특징:
- 속도: RAM보다 속도가 느리지만, 데이터를 영구적으로 저장할 수 있습니다.
- 용량: 용량이 크고, 컴퓨터가 꺼져도 데이터가 유지됩니다.
- 사용 예시: 파일 저장, 프로그램 설치 등.
예시를 통한 이해
- 캐시 메모리: CPU가 자주 접근하는 데이터나 명령어를 캐시 메모리에 저장하여 작업 속도를 높입니다.
- RAM: 현재 실행 중인 프로그램과 데이터를 저장하여 빠르게 접근할 수 있도록 합니다.
- ROM: 컴퓨터가 부팅될 때 필요한 기본 프로그램을 저장합니다.
- 보조 메모리: 사용자가 작성한 문서나 설치한 프로그램을 하드디스크나 SSD에 저장합니다.
정리
메모리는 데이터를 저장하고 접근하는 데 사용되며, 각 유형의 메모리는 속도와 용량, 비용 측면에서 각각의 역할을 가지고 있습니다.
캐시 메모리는 가장 빠르지만 용량이 작고 비싸며, 주 메모리는 컴퓨터의 작동에 필수적인 역할을 하고, 보조 메모리는 대용량 데이터를 영구적으로 저장하는 역할을 합니다.
이 세 가지 메모리가 함께 작동하여 컴퓨터가 효율적으로 데이터를 처리하고 저장할 수 있도록 돕습니다.
4. RAM
RAM이란?
RAM(Random Access Memory, 램)은 컴퓨터의 메모리 중 하나로, 데이터를 자유롭게 읽고 쓸 수 있는 메모리입니다.
프로그램을 실행하거나 데이터를 처리할 때 필요한 임시 저장 공간으로 사용됩니다.
RAM의 주요 특징
- 읽기와 쓰기 가능:
RAM은 데이터를 읽고 쓸 수 있습니다. - 휘발성: 컴퓨터를 끄면
RAM에 저장된 데이터는 모두 사라집니다. - 빠른 접근 속도:
RAM은 매우 빠르게 데이터를 읽고 쓸 수 있지만, 상대적으로 비쌉니다.
RAM의 종류
RAM은 크게 두 가지 종류로 나눌 수 있습니다: SRAM과 DRAM.
정적 램 (SRAM, Static RAM)
특징:
- 전원이 공급되는 동안 데이터가 유지됩니다.
- 데이터를 새로 고칠 필요가 없습니다.
- 빠르고 신뢰성이 높습니다.
- 가격이 비싸고, 크기가 큽니다.
- 전력 소비가 높습니다.
사용 예시: 주로
CPU의 캐시 메모리로 사용됩니다.
동적 램 (DRAM, Dynamic RAM)
특징:
- 지속적으로 데이터를 새로 고쳐야 합니다(초당 수백 번).
SRAM보다 느리지만, 가격이 저렴합니다.- 데이터 수명이 짧고, 계속해서 새로고침이 필요합니다.
- 용량이 크고, 가격이 저렴합니다.
사용 예시: 컴퓨터의 주 메모리로 사용됩니다.
예시를 통한 이해
SRAM: 예를 들어,CPU가 자주 사용하는 데이터를SRAM에 저장하면,CPU는 이 데이터를 매우 빠르게 접근할 수 있습니다. 이는 프로그램 실행 속도를 높이는 데 도움이 됩니다.DRAM: 컴퓨터의 주 메모리로 사용되며, 실행 중인 프로그램과 그 프로그램이 처리하는 데이터를 저장합니다. 예를 들어, 웹 브라우저를 실행할 때, 웹 페이지의 데이터는DRAM에 저장되어 빠르게 접근할 수 있습니다.
RAM의 역할
- 데이터 저장: 프로그램이 실행되는 동안 필요한 데이터를 저장합니다.
- 연산 지원:
CPU가 연산을 수행할 때 필요한 임시 데이터를 저장합니다. - 빠른 접근: 하드디스크보다 훨씬 빠른 속도로 데이터를 읽고 쓸 수 있어 프로그램의 실행 속도를 높입니다.
정리
RAM은 컴퓨터의 핵심적인 메모리로, 프로그램 실행과 데이터 처리를 지원합니다.
정적 램(SRAM)과 동적 램(DRAM) 두 가지 종류가 있으며, 각각의 장단점이 있습니다.SRAM은 빠르고 신뢰성이 높지만 비싸고 크며, DRAM은 가격이 저렴하고 용량이 크지만 지속적인 새로 고침이 필요합니다.
이 두 종류의 RAM이 함께 사용되어 컴퓨터의 효율적인 작동을 지원합니다.
5. ROM
ROM이란?
ROM(Read-Only Memory, 롬)은 읽기 전용 메모리로, 전원이 꺼져도 데이터가 사라지지 않는 비휘발성 메모리입니다.
컴퓨터가 부팅할 때 필요한 기본적인 지침들이 ROM에 저장되어 있으며, 이 작업을 부트스트랩(bootstrap)이라고 합니다.ROM은 다양한 전자제품에도 사용됩니다.
ROM의 주요 특징
- 읽기 전용: 한 번 데이터가 저장되면 읽기만 가능하고, 일반적으로 수정이 불가능합니다.
- 비휘발성: 전원이 꺼져도 데이터가 유지됩니다.
- 다양한 전자제품에 사용: 컴퓨터뿐만 아니라 세탁기, 전자레인지, 텔레비전 등에서도 사용됩니다.
ROM의 종류
ROM은 여러 가지 유형으로 나눌 수 있으며, 각 유형마다 특징이 있습니다.
- 마스크 ROM (Mask ROM)
- 특징: 최초의 ROM으로, 제조 과정에서 데이터가 한 번만 써져서 변경이 불가능합니다.
- 사용 예시: 특정 전자기기에서 고정된 데이터를 저장하는 용도로 사용됩니다.
- 프로그래밍 가능한 ROM (PROM)
- 특징: 사용자가 한 번만 데이터를 쓸 수 있습니다. 한 번 데이터가 쓰여지면 삭제하거나 수정할 수 없습니다.
- 사용 예시: 특정 설정이 필요한 장치에서 사용됩니다.
- 지울 수 있는 PROM (EPROM)
- 특징: 자외선을 이용해 데이터를 삭제할 수 있습니다. 최대 40분 동안 자외선에 노출시켜 데이터를 지울 수 있습니다. 다시 데이터를 쓸 수 있습니다.
- 사용 예시: 개발 및 테스트 환경에서 자주 데이터를 변경해야 하는 경우 사용됩니다.
- 전기적으로 지울 수 있는 PROM (EEPROM)
- 특징: 전기적으로 데이터를 삭제하고 다시 쓸 수 있습니다. 자주 데이터를 수정해야 하는 경우 유용합니다.
- 사용 예시: 설정값을 자주 변경해야 하는 전자기기에서 사용됩니다.
ROM의 장점
- 데이터 유지: 전원이 꺼져도 데이터가 유지됩니다.
- 안정성: 데이터가 변경되지 않아서 안정적으로 작동합니다.
- 비용: RAM보다 저렴합니다.
- 다양한 용도: 세탁기, 텔레비전 등 다양한 전자기기에서 사용됩니다.
예시를 통한 이해
- 컴퓨터 부팅: 컴퓨터를 켤 때 기본적인 부팅 지침이 ROM에 저장되어 있어, 컴퓨터가 정상적으로 작동합니다.
- 전자기기: 세탁기나 전자레인지처럼 껐다 켜도 설정이 유지되는 전자기기에서 ROM이 사용됩니다.
정리
ROM은 읽기 전용 메모리로, 데이터를 영구적으로 저장할 수 있으며, 전원이 꺼져도 데이터가 유지되는 비휘발성 메모리입니다.
다양한 유형의 ROM이 있으며, 각각의 특성에 따라 다양한 용도로 사용됩니다.
ROM은 컴퓨터뿐만 아니라 많은 전자기기에서도 사용되어 안정적이고 신뢰성 있는 데이터를 제공하는 역할을 합니다.
6. 단위, 숫자체계
메모리 단위와 숫자 체계
컴퓨터 메모리 단위와 숫자 체계에 대해 알기 쉽게 설명하겠습니다.
메모리 단위
비트(bit)와 바이트(byte)
비트(Bit):
- 정의: 컴퓨터에서 가장 작은 데이터 단위입니다.
- 표현: 0과 1로만 이루어져 있습니다.
- 예시: 0, 1, 0, 1, 1, 0, 1, 0
니블(Nibble):
- 정의: 4비트입니다.
- 예시: 1010 (4비트)
바이트(Byte):
- 정의: 8비트입니다.
- 사용 예시: 대부분의 데이터 크기를 바이트 단위로 표현합니다.
- 예시: 01010101 (8비트)
주요 메모리 단위
- 킬로바이트(KB): 1KB = 1024바이트
- 메가바이트(MB): 1MB = 1024KB
- 기가바이트(GB): 1GB = 1024MB
- 테라바이트(TB): 1TB = 1024GB
- 페타바이트(PB): 1PB = 1024TB
숫자 체계
컴퓨터는 여러 가지 숫자 체계를 사용합니다.
10진수(Decimal)
- 정의: 우리가 일상적으로 사용하는 숫자 체계입니다.
- 표현: 0부터 9까지의 숫자 사용.
- 예시: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
2진수(Binary)
- 정의: 컴퓨터가 사용하는 기본 숫자 체계입니다.
- 표현: 0과 1만 사용.
- 예시: 0, 1, 10, 11, 100
8진수(Octal)
- 정의: 8개의 숫자로 구성된 숫자 체계입니다.
- 표현: 0부터 7까지의 숫자 사용.
- 예시: 0, 1, 2, 3, 4, 5, 6, 7
16진수(Hexadecimal)
- 정의: 16개의 숫자로 구성된 숫자 체계입니다.
- 표현: 0부터 9까지, 그리고 A부터 F까지의 문자 사용.
- 예시: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F
실수 표현 방식
컴퓨터는 실수를 표현하는 방법이 두 가지가 있습니다.
고정 소수점(Fixed Point)
- 정의: 소수점의 위치가 고정된 방식으로 실수를 표현합니다.
- 구성: 부호(양수/음수), 정수부, 소수부로 나눠집니다.
- 예시: 3.14, -45.67
부동 소수점(Floating Point)
- 정의: 소수점의 위치가 가변적인 방식으로 실수를 표현합니다.
- 구성: 가수부(Significand)와 지수부(Exponent)로 나눠집니다.
- 예시: 3.14는 3.14 × 10^0로 표현.
- 장점: 더 넓은 범위의 실수를 표현할 수 있습니다.
- 오차: 근사값으로 표현되기 때문에 약간의 오차가 발생할 수 있습니다.
부동 소수점 오차:
0.1을 1000번 더하면 100이 되어야 하지만, 실제로는 99.999가 될 수 있습니다.
이는 컴퓨터의 이진수 표현 방식 때문에 발생하는 오차입니다.
요약
- 비트와 바이트: 컴퓨터에서 데이터를 표현하는 기본 단위입니다.
- 메모리 단위: KB, MB, GB, TB, PB 등으로 구성됩니다.
- 숫자 체계: 10진수, 2진수, 8진수, 16진수가 있습니다.
- 실수 표현 방식: 고정 소수점과 부동 소수점 방식이 있습니다.
- RAM과 ROM: 메모리의 읽기, 쓰기 특성과 휘발성 여부가 다릅니다.
7. 네트워크
컴퓨터 네트워킹 기초
컴퓨터 네트워킹은 여러 컴퓨터가 서로 연결되어 데이터를 교환하는 시스템을 말합니다.
네트워킹을 통해 컴퓨터 A와 컴퓨터 B가 데이터를 공유할 수 있습니다.
네트워크의 구성 요소와 주요 개념을 쉽게 설명드리겠습니다.
네트워크의 기본 구성 요소
노드(Node)
- 정의: 네트워크에 연결된 모든 장치를 노드라고 합니다.
- 예시: 컴퓨터, 서버, 프린터, 라우터, 스위치 등
링크(Link)
- 정의: 노드 간의 데이터를 전달하는 통신 경로입니다.
- 예시: 케이블, 무선 신호 등
프로토콜(Protocol)
- 정의: 데이터 통신을 위한 규칙입니다.
- 예시: TCP/IP, HTTP, FTP 등
네트워크 용어
네트워크(Network)
- 정의: 여러 컴퓨터나 장치들이 연결되어 데이터를 주고받는 시스템입니다.
IP 주소(IP Address)
- 정의: 네트워크에서 각 장치를 식별하기 위한 고유 주소입니다.
- 예시: 192.168.1.1
DNS(Domain Name System)
- 정의: 도메인 이름을 IP 주소로 변환해 주는 시스템입니다.
- 예시: google.com → 216.58.214.14
방화벽(Firewall)
- 정의: 네트워크 보안을 위해 트래픽을 모니터링하고 제어하는 장치입니다.
네트워크 토폴로지(Topology)
- 정의: 네트워크 장치들이 물리적, 논리적으로 배열된 방식입니다.
- 종류: 버스, 스타, 링, 메시, 트리 등
네트워크 유형
LAN(Local Area Network)
- 정의: 소규모 지역(예: 집, 학교, 사무실) 내의 네트워크
- 예시: 가정, 사무실, 학교, 대학교 캠퍼스 내의 네트워크 등
WAN(Wide Area Network)
- 정의: 광범위한 지역(예: 도시, 국가, 대륙)을 연결하는 네트워크
- 예시: 인터넷, 글로벌 기업의 네트워크 등
클라우드 네트워크(Cloud Network)
- 정의: 클라우드 서비스 제공업체에서 호스팅되는 네트워크
- 예시: 클라우드 서비스(예: AWS, Azure, Google Cloud)를 사용하는 네트워크
네트워크 아키텍처
클라이언트-서버(Client-Server):
- 정의: 중앙 서버가 클라이언트 요청을 처리하는 구조.
- 예시: 웹 서버와 클라이언트.
피어-투-피어(Peer-to-Peer):
- 정의: 중앙 서버 없이 각 노드가 직접 데이터를 주고받는 구조.
- 예시: 파일 공유 네트워크.
OSI 모델 (Open Systems Interconnection Model)
OSI 모델은 네트워크 통신을 7개의 계층으로 나눈 모델입니다.
- 물리 계층(Physical Layer): 전기 신호, 광 신호 등 물리적 특성을 다룹니다.
- 데이터 링크 계층(Data Link Layer): 오류 감지 및 수정, 프레임 전송을 담당합니다.
- 네트워크 계층(Network Layer): 데이터의 경로를 결정하고 전송합니다.
- 전송 계층(Transport Layer): 데이터 전송의 신뢰성을 보장하고 에러를 복구합니다.
- 세션 계층(Session Layer): 통신 세션을 설정, 유지, 종료합니다.
- 표현 계층(Presentation Layer): 데이터 형식 변환, 암호화 등을 담당합니다.
- 응용 계층(Application Layer): 사용자와 직접 상호작용하는 애플리케이션 서비스를 제공합니다.
네트워크 장치
- 라우터(Router): 서로 다른 네트워크를 연결하고 데이터 패킷을 전달합니다.
- 스위치(Switch): 같은 네트워크 내에서 장치들을 연결하고 데이터 패킷을 전달합니다.
- 허브(Hub): 네트워크 장치들을 연결하는 기본 장치로, 데이터를 모든 포트로 전달합니다.
- 브리지(Bridge): 두 개의 네트워크를 연결하고 데이터를 필터링합니다.
네트워크 용어 정리
MAC 주소(Media Access Control Address):
- 정의: 네트워크 인터페이스 카드(NIC)에 할당된 고유 주소입니다.
포트(Port):
- 정의: 데이터 전송을 위한 논리적 채널입니다.
- 예시: HTTP의 포트 번호는 80.
소켓(Socket):
- 정의: IP 주소와 포트 번호의 조합으로, 네트워크 통신의 종단점을 나타냅니다.
요약
컴퓨터 네트워킹은 여러 컴퓨터와 장치들이 연결되어 데이터를 교환하는 시스템입니다.
네트워킹을 이해하기 위해 노드, 링크, 프로토콜 등의 기본 개념을 알아야 하며, LAN, WAN 등의 네트워크 유형과 OSI 모델 등 다양한 구조와 용어를 이해해야 합니다.
네트워크 장치와 프로토콜, 그리고 주소 체계 등을 통해 네트워크가 어떻게 구성되고 작동하는지 알 수 있습니다.
8. OSI 7계층
OSI 7계층 모델
OSI(Open Systems Interconnection) 7계층 모델은 네트워크 통신을 일곱개의 계층으로 나누어 각각의 계층이 서로 협력하여 데이터를 전송하는 방식을 설명합니다.
이 모델은 네트워킹을 체계적으로 이해하고 접근하는 데 도움을 줍니다.
1. 물리 계층(Physical Layer)
역할: 데이터의 물리적 전송을 담당합니다.
주요 기능
- 비트 전송: 0과 1의 비트 형태로 데이터를 전송합니다.
- 물리적 매체 연결: 케이블, 스위치 등의 물리적 장치를 통해 데이터가 이동합니다.
- 비트 동기화: 비트들이 정확하게 전송되도록 동기화합니다.
장치 예시: 케이블, 허브, 리피터
2. 데이터 링크 계층 (Data Link Layer)
- 역할: 물리 계층을 통해 전송된 데이터를 프레임 단위로 처리합니다.
- 주요 기능
- 프레임 전송: 데이터를 프레임 단위로 나누어 전송합니다.
- 물리적 주소 지정: MAC 주소를 사용하여 데이터를 전달합니다.
- 오류 제어: 전송 중 발생할 수 있는 오류를 검출하고 수정합니다.
- 흐름 제어: 데이터 전송 속도를 조절합니다.
- 장치 예시: 스위치, 브리지
3. 네트워크 계층 (Network Layer)
- 역할: 데이터를 목적지까지 가장 적합한 경로를 통해 전달합니다.
- 주요 기능
- 라우팅: 데이터를 목적지까지 전달하기 위해 최적의 경로를 결정합니다.
- 논리적 주소 지정: IP 주소를 사용하여 데이터를 전달합니다.
- 장치 예시: 라우터
4. 전송 계층 (Transport Layer)
- 역할: 신뢰할 수 있는 데이터 전송을 제공합니다.
- 주요 기능
- 데이터 분할 및 재조립: 데이터를 작은 세그먼트로 나누고, 수신 시 다시 조립합니다.
- 오류 복구: 전송 중 발생한 오류를 복구합니다.
- 흐름 제어: 데이터 전송 속도를 조절합니다.
- 프로토콜 예시: TCP, UDP
5. 세션 계층 (Session Layer)
- 역할: 응용 프로그램 간의 세션을 설정하고 관리합니다.
- 주요 기능
- 세션 설정, 유지, 종료: 두 통신 장치 간의 세션을 설정하고 유지하며 종료합니다.
- 동기화: 데이터 전송을 동기화합니다.
- 대화 제어: 데이터를 주고받는 순서를 제어합니다.
6. 표현 계층 (Presentation Layer)
- 역할: 데이터의 형식을 변환하고, 암호화/복호화, 압축/해제를 담당합니다.
- 주요 기능
- 데이터 변환: 데이터를 응용 프로그램이 이해할 수 있는 형식으로 변환합니다.
- 암호화 및 복호화: 데이터를 암호화하여 보안을 유지하고, 수신시 복호화합니다.
- 압축 및 해제: 데이터를 압축하여 전송 효율을 높이고, 수신 시 압축을 해제합니다.
- 데이터 형식 예시: JPEG, MPEG, GIF
7. 응용 계층 (Application Layer)
역할: 사용자와 직접 상호작용하는 응용 프로그램을 제공합니다.
주요 기능
- 네트워크 가상 터미널: 원격으로 다른 시스템을 제어합니다.
- 파일 전송, 접근 및 관리(FTAM): 파일 전송 및 관리를 제공합니다.
- 이메일 서비스: 이메일을 송수신합니다.
- 디렉토리 서비스: 네트워크 자원에 대한 정보를 제공합니다.
프로토콜 예시: HTTP, FTP, SMTP.
요약
OSI 7계층 모델은 네트워크 통신을 7개의 계층으로 나누어 각 계층이 특정한 역할을 담당합니다.
이를 통해 데이터가 한 장치에서 다른 장치로 효과적으로 전달됩니다.
각각의 계층은 아래 계층의 서비스를 이용하고, 위 계층에 서비스를 제공합니다.
이를 통해 네트워킹이 체계적이고 효율적으로 이루어집니다.
9. L4 스위치 (Layer 4 Switch)
정의
L4 스위치(Layer 4 Switch)는 OSI 모델의 4계층인 전송 계층에서 동작하는 스위치입니다.
이 스위치는 IP 주소뿐만 아니라 TCP/UDP 포트 번호와 같은 전송 계층 정보를 기반으로 트래픽을 처리합니다.
주요 기능
로드 밸런싱:
- L4 스위치는 서버 로드 밸런싱을 제공하여 여러 서버에 트래픽을 분산시킵니다.
이는 웹 서버, 데이터베이스 서버 등 여러 서버 간의 부하를 분산시키는 데 사용됩니다.
- L4 스위치는 서버 로드 밸런싱을 제공하여 여러 서버에 트래픽을 분산시킵니다.
트래픽 제어
- 전송 계층의 포트 번호를 기반으로 트래픽을 필터링하고 라우팅할 수 있습니다.
예를 들어, HTTP 트래픽(포트 80)과 HTTPS 트래픽(포트 443)을 다른 서버로 보낼 수 있습니다.
- 전송 계층의 포트 번호를 기반으로 트래픽을 필터링하고 라우팅할 수 있습니다.
고가용성 및 장애 조치:
- 서버가 다운되었을 때 자동으로 다른 서버로 트래픽을 전환하여 서비스의 연속성을 보장합니다.
보안 기능:
- 간단한 보안 기능을 제공하여 특정 포트로의 접근을 제한할 수 있습니다.
사용 예시
- 웹 트래픽 분산: 여러 웹 서버 간의 부하를 분산시키기 위해 사용됩니다.
- 게임 서버: 트래픽을 여러 게임 서버로 분산시켜 서버 과부하를 방지합니다.
10. L7 스위치 (Layer 7 Switch)
정의
L7 스위치(Layer 7 Switch)는 OSI 모델의 7계층인 응용 계층에서 동작하는 스위치입니다.
이 스위치는 HTTP, HTTPS, FTP 등과 같은 응용 계층 프로토콜을 기반으로 트래픽을 처리합니다.
주요 기능
애플리케이션 레벨 로드 밸런싱:
- HTTP 헤더, URL, 쿠키 등의 정보를 기반으로 트래픽을 분산시킵니다.
예를 들어, 특정 URL 패턴에 따라 다른 서버로 요청을 라우팅할 수 있습니다.
- HTTP 헤더, URL, 쿠키 등의 정보를 기반으로 트래픽을 분산시킵니다.
콘텐츠 스위칭:
- 요청 내용에 따라 다른 서버나 서비스로 트래픽을 라우팅할 수 있습니다.
예를 들어, 이미지 요청은 이미지 서버로, API 요청은 API 서버로 보낼 수 있습니다.
- 요청 내용에 따라 다른 서버나 서비스로 트래픽을 라우팅할 수 있습니다.
트래픽 관리 및 최적화:
- 캐싱, 압축 등 다양한 트래픽 최적화 기능을 제공하여 네트워크 성능을 향상시킵니다.
고급 보안 기능:
- 웹 애플리케이션 방화벽(WAF), SSL 종단, DDoS 방어 등 고급 보안 기능을 제공합니다.
사용자 인증 및 권한 부여:
- 사용자 인증 및 권한 부여 기능을 통해 보안을 강화할 수 있습니다.
사용 예시
- 웹 애플리케이션: HTTP 요청을 분석하여 적절한 서버로 라우팅합니다.
- API 게이트웨이: API 요청을 분석하고 처리하여 적절한 API 서버로 보냅니다.
- SSL 종료: SSL 트래픽을 해독하여 내부 네트워크에서는 복호화된 트래픽으로 처리할 수 있도록 합니다.
11. L4 스위치와 L7 스위치의 차이점
처리 계층:
- L4 스위치: 전송 계층(4계층)에서 동작하며, IP 주소와 TCP/UDP 포트 번호를 기반으로 트래픽을 처리합니다.
- L7 스위치: 응용 계층(7계층)에서 동작하며, HTTP 헤더, URL, 쿠키 등 응용 계층 정보를 기반으로 트래픽을 처리합니다.
기능:
- L4 스위치: 기본적인 로드 밸런싱과 트래픽 제어 기능을 제공합니다.
- L7 스위치: 고급 로드 밸런싱, 콘텐츠 스위칭, 보안 기능, 트래픽 최적화 등 더 복잡하고 다양한 기능을 제공합니다.
복잡성 및 비용:
- L4 스위치: 상대적으로 간단하고 비용이 저렴합니다.
- L7 스위치: 더 복잡하고 비용이 높습니다. 하지만 더 많은 기능과 유연성을 제공합니다.
이와 같이, L4 스위치와 L7 스위치는 각각의 계층에서 다양한 기능을 제공하며, 특정 네트워크 요구 사항에 따라 선택하여 사용할 수 있습니다.
궁금증 1. 요청 분기처리 위한 nginx, apache?
Apache나 Nginx 같은 웹 서버를 사용하여 요청을 분기처리할 수 있습니다.
이러한 웹 서버는 리버스 프록시(Reverse Proxy)로 사용되어 클라이언트 요청을 여러 서버로 분산시키거나, 요청을 적절한 서버로 라우팅할 수 있습니다.
다음은 프론트/백엔드 물리적 서버 1대, 논리적 서버로만 구분되어있는 경우의 실습이다.
Nginx 설정 (물리적 서버 1대, 백/프론트 논리적 서버는 구분되어있음)
Nginx를 예로 들어, 프론트엔드와 백엔드 요청을 분기처리하는 설정 방법을 설명하겠습니다.
- 프론트엔드:
/경로로 오는 모든 요청을 프론트엔드로 전달 - 백엔드:
/api경로로 오는 모든 요청을 백엔드로 전달
Nginx 설정 파일 (nginx.conf 또는 사이트별 설정 파일)
server {
listen 80;
server_name example.com;
# 프론트엔드 요청 처리
location / {
proxy_pass http://localhost:3000; # 프론트엔드 서버 주소
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 X-Forwarded-Proto $scheme;
}
# 백엔드 요청 처리
location /api {
proxy_pass http://localhost:5000; # 백엔드 서버 주소
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 X-Forwarded-Proto $scheme;
}
}설정 설명
server 블록: Nginx가 요청을 수신할 서버 블록입니다.
- listen 80: Nginx가 80번 포트에서 HTTP 요청을 수신합니다.
- server_name example.com: example.com 도메인으로 들어오는 요청을 처리합니다.
location / 블록: 기본 경로로 오는 모든 요청을 프론트엔드 서버로 전달합니다.
- proxy_pass http://localhost:3000: 프론트엔드 서버로 요청을 전달합니다.
- proxy_set_header: 요청 헤더를 설정합니다.
location /api 블록:
/api경로로 시작하는 모든 요청을 백엔드 서버로 전달합니다.- proxy_pass http://localhost:5000: 백엔드 서버로 요청을 전달합니다.
(백엔드 서버가 localhost의 5000번 포트에서 실행 중입니다.)
- proxy_pass http://localhost:5000: 백엔드 서버로 요청을 전달합니다.
proxy_set_header:
- 원본 요청 헤더를 백엔드 서버로 전달하기 위해 설정합니다.
- 이 설정은 클라이언트의 IP 주소와 호스트 정보를 보존하는 데 유용합니다.
Apache 설정 (물리적 서버 1대, 백/프론트 논리적 서버는 구분되어있음)
Apache를 사용하여 비슷한 설정을 할 수도 있습니다.
예를 들어, httpd.conf 또는 사이트별 설정 파일에 다음과 같은 내용을 추가합니다.
<VirtualHost *:80>
ServerName example.com
# 프론트엔드 요청 처리
ProxyPass / http://localhost:3000/
ProxyPassReverse / http://localhost:3000/
# 백엔드 요청 처리
ProxyPass /api http://localhost:5000/
ProxyPassReverse /api http://localhost:5000/
</VirtualHost>설정 설명
VirtualHost블록:Apache가 요청을 수신할 가상 호스트 블록입니다.ServerName example.com: 해당 설정이 적용될 도메인 이름을 지정합니다.
ProxyPass및ProxyPassReverse: 요청을 프록시 서버로 전달하고, 응답을 클라이언트로 다시 전달합니다./경로는 프론트엔드 서버로,/api경로는 백엔드 서버로 전달합니다.
이와 같이, Nginx나 Apache 설정을 통해 클라이언트 요청을 적절하게 분기 처리하여 프론트엔드와 백엔드 서버로 전달할 수 있습니다.
궁금증 2. Nginx나 Apache가 필요한 이유
리버스 프록시 설정
클라이언트는 단일 도메인(예: example.com)을 통해 프론트엔드와 백엔드에 접근할 수 있습니다.
이 경우 Nginx나 Apache를 리버스 프록시로 설정하여 클라이언트의 요청을 적절한 서버로 라우팅할 수 있습니다.
보안 강화
웹 서버를 통해 보안 설정을 적용할 수 있습니다.
예를 들어, HTTPS 설정, CORS 관리, DDoS 방어 등을 웹 서버 레벨에서 처리할 수 있습니다.
로드 밸런싱
백엔드 서버가 여러 대인 경우, Nginx나 Apache를 사용하여 로드 밸런싱을 구현할 수 있습니다.
정적 파일 서빙
프론트엔드 서버가 정적 파일을 제공하는 경우, Nginx나 Apache를 사용하여 정적 파일을 효과적으로 제공할 수 있습니다.
예시: 프론트엔드와 백엔드가 각기 다른 서버에 배포된 경우의 Nginx 설정
- 프론트엔드 서버: frontend.example.com
- 백엔드 서버: backend.example.com
Nginx 설정 파일 (nginx.conf 또는 사이트별 설정 파일 - 물리적 서버 2대(백/프론트), 논리적 서버도 당연히 2대)
server {
listen 80;
server_name example.com;
# 프론트엔드 요청 처리
location / {
proxy_pass http://frontend.example.com; # 프론트엔드 서버 주소
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 X-Forwarded-Proto $scheme;
}
# 백엔드 요청 처리
location /api {
proxy_pass http://backend.example.com; # 백엔드 서버 주소
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 X-Forwarded-Proto $scheme;
}
}설정 설명
server 블록: Nginx가 요청을 수신할 서버 블록입니다.
- listen 80: Nginx가 80번 포트에서 HTTP 요청을 수신합니다.
- server_name example.com: 해당 설정이 적용될 도메인 이름을 지정합니다.
location / 블록: 기본 경로로 오는 모든 요청을 프론트엔드 서버로 전달합니다.
- proxy_pass http://frontend.example.com: 프론트엔드 서버가 frontend.example.com에 있습니다.
location /api 블록: /api 경로로 시작하는 모든 요청을 백엔드 서버로 전달합니다.
- proxy_pass http://backend.example.com: 백엔드 서버가 backend.example.com에 있습니다.
Apache 설정
Apache를 사용하여 비슷한 설정을 할 수도 있습니다.
예를 들어, httpd.conf 또는 사이트별 설정 파일에 다음과 같은 내용을 추가합니다.
<VirtualHost *:80>
ServerName example.com
# 프론트엔드 요청 처리
ProxyPass / http://frontend.example.com/
ProxyPassReverse / http://frontend.example.com/
# 백엔드 요청 처리
ProxyPass /api http://backend.example.com/
ProxyPassReverse /api http://backend.example.com/
</VirtualHost>설정 설명
VirtualHost블록:Apache가 요청을 수신할 가상 호스트 블록입니다.ServerName example.com: 해당 설정이 적용될 도메인 이름을 지정합니다.
ProxyPass및ProxyPassReverse: 요청을 프록시 서버로 전달하고, 응답을 클라이언트로 다시 전달합니다./경로는 프론트엔드 서버로,/api경로는 백엔드 서버로 전달합니다.
결론
프론트엔드와 백엔드가 물리적으로 각기 다른 서버에 배포되어 있는 경우에도, Nginx나 Apache 같은 웹 서버를 사용하여 리버스 프록시 설정을 통해 요청을 분기 처리하고, 보안 및 성능 최적화를 할 수 있습니다.
이러한 설정은 단일 도메인으로 여러 서버에 분산된 서비스를 효율적으로 관리하는 데 매우 유용합니다.
리버스 프록시(Reverse Proxy)란?
리버스 프록시는 클라이언트(사용자)의 요청을 받아 백엔드 서버로 전달하고, 백엔드 서버의 응답을 클라이언트에게 다시 전달하는 중간 서버 역할을 합니다.
리버스 프록시는 다양한 목적을 위해 사용되며, 웹 서버, 로드 밸런서, 보안 장치 등으로 활용됩니다.
리버스 프록시의 주요 기능
1. 로드 밸런싱 (Load Balancing):
리버스 프록시는 여러 백엔드 서버로 트래픽을 분산시켜 서버 부하를 균형 있게 분배합니다.
이는 서버의 성능을 향상시키고 장애가 발생했을 때 다른 서버로 트래픽을 전환하여 가용성을 높입니다.
2. 보안 강화:
클라이언트와 백엔드 서버 사이에 위치하여 보안 계층을 추가합니다.
SSL/TLS 암호화를 통해 데이터 전송을 보호하고, DDoS 공격 등을 방어할 수 있습니다.
방화벽 역할을 하여 허가되지 않은 접근을 차단할 수 있습니다.
3. 캐싱 (Caching):
정적 콘텐츠(이미지, CSS 파일 등)를 캐싱하여 백엔드 서버의 부하를 줄이고, 클라이언트에게 더 빠른 응답을 제공합니다.
4. IP 숨기기:
백엔드 서버의 IP 주소를 클라이언트로부터 숨겨 보안을 강화합니다.
클라이언트는 리버스 프록시 서버의 IP 주소만 알 수 있습니다.
5. SSL 종단 (SSL Termination):
SSL 암호화된 요청을 해독하여 백엔드 서버로 평문 데이터를 전달하고, 백엔드 서버의 부담을 줄여줍니다.
리버스 프록시의 동작 방식
클라이언트 요청:
- 클라이언트(사용자)가 웹 브라우저에서 URL을 입력하여 요청을 보냅니다.
리버스 프록시 서버:
- 클라이언트의 요청을 받아 백엔드 서버로 전달합니다.
이때, 리버스 프록시 서버는 요청을 적절한 백엔드 서버로 분배합니다.
- 클라이언트의 요청을 받아 백엔드 서버로 전달합니다.
백엔드 서버 응답:
- 백엔드 서버가 요청을 처리하고 응답을 리버스 프록시 서버로 보냅니다.
리버스 프록시 서버 응답:
- 리버스 프록시 서버가 백엔드 서버의 응답을 클라이언트에게 전달합니다.
리버스 프록시와 L4 스위치, L7 스위치
리버스 프록시와 L4, L7 스위치는 다릅니다.
두 개념 모두 네트워크 트래픽을 관리하고 분배하는 역할을 하지만, 그 방식과 작동하는 계층이 다릅니다.
아래에 각각의 차이점을 설명합니다.
리버스 프록시 (Reverse Proxy)
정의
- 리버스 프록시는 클라이언트 요청을 받아 백엔드 서버로 전달하고, 백엔드 서버의 응답을 클라이언트로 다시 전달하는 중간 서버입니다.
주요 기능
- 로드 밸런싱: 여러 백엔드 서버로 트래픽을 분산합니다.
- 보안 강화: SSL/TLS 암호화, 방화벽 기능 등.
- 캐싱: 정적 콘텐츠를 캐싱하여 응답 속도를 향상시킵니다.
- IP 숨기기: 백엔드 서버의 IP 주소를 클라이언트로부터 숨깁니다.
- SSL 종단: SSL 암호화를 해독하여 백엔드 서버로 평문 데이터를 전달합니다.
예시
- Nginx, Apache, HAProxy: 리버스 프록시로 자주 사용되는 소프트웨어입니다.
L4 스위치 (Layer 4 Switch)
정의
- L4 스위치는 OSI 모델의 4계층(전송 계층)에서 동작하며, IP 주소와 TCP/UDP 포트 번호를 기반으로 트래픽을 처리합니다.
주요 기능
- 포트 기반 로드 밸런싱: IP 주소와 포트 번호를 기반으로 트래픽을 분산합니다.
- 기본 보안 기능: 특정 포트에 대한 접근을 제한할 수 있습니다.
- 고가용성: 서버 장애 시 트래픽을 다른 서버로 전환합니다.
예시
- F5 BIG-IP, Citrix NetScaler: L4 스위치로 자주 사용되는 하드웨어입니다.
L7 스위치 (Layer 7 Switch)
정의
- L7 스위치는 OSI 모델의 7계층(응용 계층)에서 동작하며, HTTP, HTTPS, FTP 등 응용 계층 프로토콜을 기반으로 트래픽을 처리합니다.
주요 기능
- 애플리케이션 레벨 로드 밸런싱: HTTP 헤더, URL, 쿠키 등 응용 계층 정보를 기반으로 트래픽을 분산합니다.
- 콘텐츠 스위칭: 요청 내용에 따라 다른 서버로 트래픽을 라우팅합니다.
- 고급 보안 기능: 웹 애플리케이션 방화벽(WAF), SSL 종단, DDoS 방어 등을 제공합니다.
- 트래픽 관리 및 최적화: 캐싱, 압축 등.
예시
- F5 BIG-IP, Citrix NetScaler: L7 스위치로도 사용됩니다.
차이점 요약
- 리버스 프록시 vs. L4 스위치 vs. L7 스위치:
- 작동 계층:
- 리버스 프록시: 주로 7계층(응용 계층)에서 동작.
- L4 스위치: 4계층(전송 계층)에서 동작.
- L7 스위치: 7계층(응용 계층)에서 동작.
- 트래픽 처리 방식:
- 리버스 프록시: 클라이언트 요청을 백엔드 서버로 전달하고 응답을 클라이언트로 반환.
- L4 스위치: IP 주소와 포트 번호를 기반으로 트래픽을 분산.
- L7 스위치: HTTP 헤더, URL, 쿠키 등의 정보를 기반으로 트래픽을 분산.
- 기능:
- 리버스 프록시: 로드 밸런싱, 보안 강화, 캐싱, IP 숨기기 등.
- L4 스위치: 포트 기반 로드 밸런싱, 기본 보안 기능.
- L7 스위치: 애플리케이션 레벨 로드 밸런싱, 고급 보안 기능, 트래픽 관리 및 최적화.
- 작동 계층:
리버스 프록시와 L4/L7 스위치는 모두 네트워크 성능을 향상시키고 보안을 강화하는 데 중요한 역할을 하지만, 작동하는 계층과 제공하는 기능이 다르기 때문에 특정 용도와 요구 사항에 따라 선택하여 사용해야 합니다.
중요!! 1. ***** 로컬에서 아파치 서버 설정해보기 *****
로컬 환경에서 Apache 서버를 설정하여 프론트엔드와 백엔드 요청을 분기 처리하는 방법을 단계별로 자세히 설명하겠습니다.
1. Apache 설치
먼저, Apache 서버가 설치되어 있는지 확인합니다. 설치되어 있지 않다면, 아래 명령어를 사용하여 설치합니다.
# Ubuntu/Debian:
sudo apt update
sudo apt install apache2# CentOS/RHEL:
sudo yum update
sudo yum install httpdMacOS (현재 사용하고 있는 PC가 MacOS라 MacOS 기준으로 실습)
# MacOS:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew update
brew install java
export PATH="/usr/local/opt/openjdk/bin:$PATH"
java -version
# Homebrew를 사용하여 Apache 설치
brew install httpd
# Apache 설정
# 설치가 완료되면, 기본 설정 파일을 편집하여 필요한 설정을 할 수 있습니다.
# 설정 파일은 /usr/local/etc/httpd/httpd.conf에 위치해 있습니다.
sudo nano /usr/local/etc/httpd/httpd.conf
# ServerName 설정 추가
# 파일을 열고 ServerName 지시문을 추가하거나 주석 처리가 되어 있으면 주석을 제거하고 적절한 값을 설정합니다.
# 예를 들어, 로컬 호스트를 서버 이름으로 설정하려면 다음과 같이 입력합니다:
ServerName localhost:80
# 파일 저장 및 닫기
# Nano 에디터를 사용 중이라면, 다음 키를 눌러 파일을 저장하고 닫습니다:
# Ctrl + O: 파일 저장
# Enter: 파일명 확인
# Ctrl + X: 편집기 종료
# ----------------------------------------------------------------
# httpd.conf 파일 경로가 잘못되어있는 이슈
# /usr/local/etc/httpd/httpd.conf 여기가 아님
# MacOS에서 httpd.conf 경로 알아내는 방법
httpd -V
# 위 명령어를 실행하면 아래와 같은 메시지들이 나오는데, 아래에서 -D SERVER_CONFIG_FILE 항목을 확인하면 된다.
Server version: Apache/2.4.58 (Unix)
Server built: Feb 10 2024 01:12:11
Server's Module Magic Number: 20120211:129
Server loaded: APR 1.5.2, APR-UTIL 1.5.4, PCRE 8.44 2020-02-12
Compiled using: APR 1.5.2, APR-UTIL 1.5.4, PCRE 8.44 2020-02-12
Architecture: 64-bit
Server MPM: prefork
threaded: no
forked: yes (variable process count)
Server compiled with....
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_FLOCK_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=256
-D HTTPD_ROOT="/usr"
-D SUEXEC_BIN="/usr/bin/suexec"
-D DEFAULT_PIDLOG="/private/var/run/httpd.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="/private/etc/apache2/mime.types"
-D SERVER_CONFIG_FILE="/private/etc/apache2/httpd.conf"
# /private/etc/apache2/httpd.conf 이 경로가 Apache 설정 파일이 있는 경로이다.# 내용 복사
cat /private/etc/apache2/httpd.conf
# Lynx 설치
brew install lynx
sudo nano /private/etc/apache2/httpd.conf
# Ctrl + W (검색 프롬프트)
# 검색어 입력 후 Enter
ServerName localhost:80
# 파일 저장 및 닫기
# Nano 에디터를 사용 중이라면, 다음 키를 눌러 파일을 저장하고 닫습니다:
# Ctrl + O: 파일 저장
# Enter: 파일명 확인
# Ctrl + X: 편집기 종료
# MacOS에서 자꾸 다음과 같은 에러 발생
# error AH00558: httpd: Could not reliably determine the server's fully qualified domain name
# 해결책
# Apache가 2개 설치되어 있는데, 하나는 시스템과 함께 제공되고 하나는 brew install httpd를 사용하여 설치한 것입니다.
# brew uninstall httpd를 실행할 때 오류가 사라졌습니다.
# 즉, 2개 설치되어서 에러가 발생했던 것. 다음 명령어로 하나 삭제.
brew uninstall httpd
# Apache 서버 실행
sudo apachectl start
# Apache 서버 상태 확인
sudo apachectl status
# Go to http://localhost:80/server-status in the web browser of your choice.
# Note that mod_status must be enabled for this to work.
# Apache 서버 중지 및 재시작
sudo apachectl stop
# 서버를 재시작하려면 다음 명령어를 사용합니다.
sudo apachectl restart
# 웹 브라우저에서 확인
# 웹 브라우저를 열고 http://localhost에 접속하여 Apache 서버가 제대로 작동하는지 확인합니다.
# 기본적으로 Apache의 환영 페이지가 표시됩니다.
# 자동 실행 설정
# Apache 서버를 MacOS가 부팅될 때 자동으로 시작하려면 brew services를 사용합니다.
brew services start httpd
# 중지하려면 다음 명령어를 사용합니다.
brew services stop httpd
위와 같이 잘 접속됨
현재 아파치 설정 파일 (httpd.conf)
cat /private/etc/apache2/httpd.conf#
# This is the main Apache HTTP server configuration file. It contains the
# configuration directives that give the server its instructions.
# See <URL:http://httpd.apache.org/docs/2.4/> for detailed information.
# In particular, see
# <URL:http://httpd.apache.org/docs/2.4/mod/directives.html>
# for a discussion of each configuration directive.
#
# Do NOT simply read the instructions in here without understanding
# what they do. They're here only as hints or reminders. If you are unsure
# consult the online docs. You have been warned.
#
# Configuration and logfile names: If the filenames you specify for many
# of the server's control files begin with "/" (or "drive:/" for Win32), the
# server will use that explicit path. If the filenames do *not* begin
# with "/", the value of ServerRoot is prepended -- so "logs/access_log"
# with ServerRoot set to "/usr/local/apache2" will be interpreted by the
# server as "/usr/local/apache2/logs/access_log", whereas "/logs/access_log"
# will be interpreted as '/logs/access_log'.
#
# ServerRoot: The top of the directory tree under which the server's
# configuration, error, and log files are kept.
#
# Do not add a slash at the end of the directory path. If you point
# ServerRoot at a non-local disk, be sure to specify a local disk on the
# Mutex directive, if file-based mutexes are used. If you wish to share the
# same ServerRoot for multiple httpd daemons, you will need to change at
# least PidFile.
#
ServerRoot "/usr"
#
# Mutex: Allows you to set the mutex mechanism and mutex file directory
# for individual mutexes, or change the global defaults
#
# Uncomment and change the directory if mutexes are file-based and the default
# mutex file directory is not on a local disk or is not appropriate for some
# other reason.
#
# Mutex default:/private/var/run
#
# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, instead of the default. See also the <VirtualHost>
# directive.
#
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
<IfDefine SERVER_APP_HAS_DEFAULT_PORTS>
Listen 8080
</IfDefine>
<IfDefine !SERVER_APP_HAS_DEFAULT_PORTS>
Listen 80
</IfDefine>
#
# Dynamic Shared Object (DSO) Support
#
# To be able to use the functionality of a module which was built as a DSO you
# have to place corresponding `LoadModule' lines at this location so the
# directives contained in it are actually available _before_ they are used.
# Statically compiled modules (those listed by `httpd -l') do not need
# to be loaded here.
#
# Example:
# LoadModule foo_module modules/mod_foo.so
# LoadModule my_custom_module /usr/local/libexec/mod_my_custom.so "My Signature Authority"
#
#LoadModule mpm_event_module libexec/apache2/mod_mpm_event.so
LoadModule mpm_prefork_module libexec/apache2/mod_mpm_prefork.so
#LoadModule mpm_worker_module libexec/apache2/mod_mpm_worker.so
LoadModule authn_file_module libexec/apache2/mod_authn_file.so
#LoadModule authn_dbm_module libexec/apache2/mod_authn_dbm.so
#LoadModule authn_anon_module libexec/apache2/mod_authn_anon.so
#LoadModule authn_dbd_module libexec/apache2/mod_authn_dbd.so
#LoadModule authn_socache_module libexec/apache2/mod_authn_socache.so
LoadModule authn_core_module libexec/apache2/mod_authn_core.so
LoadModule authz_host_module libexec/apache2/mod_authz_host.so
LoadModule authz_groupfile_module libexec/apache2/mod_authz_groupfile.so
LoadModule authz_user_module libexec/apache2/mod_authz_user.so
#LoadModule authz_dbm_module libexec/apache2/mod_authz_dbm.so
#LoadModule authz_owner_module libexec/apache2/mod_authz_owner.so
#LoadModule authz_dbd_module libexec/apache2/mod_authz_dbd.so
LoadModule authz_core_module libexec/apache2/mod_authz_core.so
#LoadModule authnz_ldap_module libexec/apache2/mod_authnz_ldap.so
LoadModule access_compat_module libexec/apache2/mod_access_compat.so
LoadModule auth_basic_module libexec/apache2/mod_auth_basic.so
#LoadModule auth_form_module libexec/apache2/mod_auth_form.so
#LoadModule auth_digest_module libexec/apache2/mod_auth_digest.so
#LoadModule allowmethods_module libexec/apache2/mod_allowmethods.so
#LoadModule file_cache_module libexec/apache2/mod_file_cache.so
#LoadModule cache_module libexec/apache2/mod_cache.so
#LoadModule cache_disk_module libexec/apache2/mod_cache_disk.so
#LoadModule cache_socache_module libexec/apache2/mod_cache_socache.so
#LoadModule socache_shmcb_module libexec/apache2/mod_socache_shmcb.so
#LoadModule socache_dbm_module libexec/apache2/mod_socache_dbm.so
#LoadModule socache_memcache_module libexec/apache2/mod_socache_memcache.so
#LoadModule socache_redis_module libexec/apache2/mod_socache_redis.so
#LoadModule watchdog_module libexec/apache2/mod_watchdog.so
#LoadModule macro_module libexec/apache2/mod_macro.so
#LoadModule dbd_module libexec/apache2/mod_dbd.so
#LoadModule dumpio_module libexec/apache2/mod_dumpio.so
#LoadModule echo_module libexec/apache2/mod_echo.so
#LoadModule buffer_module libexec/apache2/mod_buffer.so
#LoadModule data_module libexec/apache2/mod_data.so
#LoadModule ratelimit_module libexec/apache2/mod_ratelimit.so
LoadModule reqtimeout_module libexec/apache2/mod_reqtimeout.so
#LoadModule ext_filter_module libexec/apache2/mod_ext_filter.so
#LoadModule request_module libexec/apache2/mod_request.so
#LoadModule include_module libexec/apache2/mod_include.so
LoadModule filter_module libexec/apache2/mod_filter.so
#LoadModule reflector_module libexec/apache2/mod_reflector.so
#LoadModule substitute_module libexec/apache2/mod_substitute.so
#LoadModule sed_module libexec/apache2/mod_sed.so
#LoadModule charset_lite_module libexec/apache2/mod_charset_lite.so
#LoadModule deflate_module libexec/apache2/mod_deflate.so
#LoadModule xml2enc_module libexec/apache2/mod_xml2enc.so
#LoadModule proxy_html_module libexec/apache2/mod_proxy_html.so
LoadModule mime_module libexec/apache2/mod_mime.so
#LoadModule ldap_module libexec/apache2/mod_ldap.so
LoadModule log_config_module libexec/apache2/mod_log_config.so
#LoadModule log_debug_module libexec/apache2/mod_log_debug.so
#LoadModule log_forensic_module libexec/apache2/mod_log_forensic.so
#LoadModule logio_module libexec/apache2/mod_logio.so
LoadModule env_module libexec/apache2/mod_env.so
#LoadModule mime_magic_module libexec/apache2/mod_mime_magic.so
#LoadModule expires_module libexec/apache2/mod_expires.so
LoadModule headers_module libexec/apache2/mod_headers.so
#LoadModule usertrack_module libexec/apache2/mod_usertrack.so
##LoadModule unique_id_module libexec/apache2/mod_unique_id.so
LoadModule setenvif_module libexec/apache2/mod_setenvif.so
LoadModule version_module libexec/apache2/mod_version.so
#LoadModule remoteip_module libexec/apache2/mod_remoteip.so
#LoadModule proxy_module libexec/apache2/mod_proxy.so
#LoadModule proxy_connect_module libexec/apache2/mod_proxy_connect.so
#LoadModule proxy_ftp_module libexec/apache2/mod_proxy_ftp.so
#LoadModule proxy_http_module libexec/apache2/mod_proxy_http.so
#LoadModule proxy_fcgi_module libexec/apache2/mod_proxy_fcgi.so
#LoadModule proxy_scgi_module libexec/apache2/mod_proxy_scgi.so
#LoadModule proxy_uwsgi_module libexec/apache2/mod_proxy_uwsgi.so
#LoadModule proxy_fdpass_module libexec/apache2/mod_proxy_fdpass.so
#LoadModule proxy_wstunnel_module libexec/apache2/mod_proxy_wstunnel.so
#LoadModule proxy_ajp_module libexec/apache2/mod_proxy_ajp.so
#LoadModule proxy_balancer_module libexec/apache2/mod_proxy_balancer.so
#LoadModule proxy_express_module libexec/apache2/mod_proxy_express.so
#LoadModule proxy_hcheck_module libexec/apache2/mod_proxy_hcheck.so
#LoadModule session_module libexec/apache2/mod_session.so
#LoadModule session_cookie_module libexec/apache2/mod_session_cookie.so
#LoadModule session_dbd_module libexec/apache2/mod_session_dbd.so
LoadModule slotmem_shm_module libexec/apache2/mod_slotmem_shm.so
#LoadModule slotmem_plain_module libexec/apache2/mod_slotmem_plain.so
#LoadModule ssl_module libexec/apache2/mod_ssl.so
#LoadModule dialup_module libexec/apache2/mod_dialup.so
#LoadModule http2_module libexec/apache2/mod_http2.so
#LoadModule lbmethod_byrequests_module libexec/apache2/mod_lbmethod_byrequests.so
#LoadModule lbmethod_bytraffic_module libexec/apache2/mod_lbmethod_bytraffic.so
#LoadModule lbmethod_bybusyness_module libexec/apache2/mod_lbmethod_bybusyness.so
##LoadModule lbmethod_heartbeat_module libexec/apache2/mod_lbmethod_heartbeat.so
LoadModule unixd_module libexec/apache2/mod_unixd.so
#LoadModule heartbeat_module libexec/apache2/mod_heartbeat.so
#LoadModule heartmonitor_module libexec/apache2/mod_heartmonitor.so
#LoadModule dav_module libexec/apache2/mod_dav.so
LoadModule status_module libexec/apache2/mod_status.so
LoadModule autoindex_module libexec/apache2/mod_autoindex.so
#LoadModule asis_module libexec/apache2/mod_asis.so
#LoadModule info_module libexec/apache2/mod_info.so
<IfModule !mpm_prefork_module>
#LoadModule cgid_module libexec/apache2/mod_cgid.so
</IfModule>
<IfModule mpm_prefork_module>
#LoadModule cgi_module libexec/apache2/mod_cgi.so
</IfModule>
#LoadModule dav_fs_module libexec/apache2/mod_dav_fs.so
#LoadModule dav_lock_module libexec/apache2/mod_dav_lock.so
#LoadModule vhost_alias_module libexec/apache2/mod_vhost_alias.so
LoadModule negotiation_module libexec/apache2/mod_negotiation.so
LoadModule dir_module libexec/apache2/mod_dir.so
#LoadModule imagemap_module libexec/apache2/mod_imagemap.so
#LoadModule actions_module libexec/apache2/mod_actions.so
#LoadModule speling_module libexec/apache2/mod_speling.so
#LoadModule userdir_module libexec/apache2/mod_userdir.so
LoadModule alias_module libexec/apache2/mod_alias.so
#LoadModule rewrite_module libexec/apache2/mod_rewrite.so
#PHP was deprecated in macOS 11 and removed from macOS 12
#LoadModule perl_module libexec/apache2/mod_perl.so
LoadModule hfs_apple_module libexec/apache2/mod_hfs_apple.so
<IfModule unixd_module>
#
# If you wish httpd to run as a different user or group, you must run
# httpd as root initially and it will switch.
#
# User/Group: The name (or #number) of the user/group to run httpd as.
# It is usually good practice to create a dedicated user and group for
# running httpd, as with most system services.
#
User _www
Group _www
</IfModule>
# 'Main' server configuration
#
# The directives in this section set up the values used by the 'main'
# server, which responds to any requests that aren't handled by a
# <VirtualHost> definition. These values also provide defaults for
# any <VirtualHost> containers you may define later in the file.
#
# All of these directives may appear inside <VirtualHost> containers,
# in which case these default settings will be overridden for the
# virtual host being defined.
#
#
# ServerAdmin: Your address, where problems with the server should be
# e-mailed. This address appears on some server-generated pages, such
# as error documents. e.g. admin@your-domain.com
#
ServerAdmin you@example.com
#
# ServerName gives the name and port that the server uses to identify itself.
# This can often be determined automatically, but we recommend you specify
# it explicitly to prevent problems during startup.
#
# If your host doesn't have a registered DNS name, enter its IP address here.
#
ServerName localhost:80
#
# Deny access to the entirety of your server's filesystem. You must
# explicitly permit access to web content directories in other
# <Directory> blocks below.
#
<Directory />
AllowOverride none
Require all denied
</Directory>
#
# Note that from this point forward you must specifically allow
# particular features to be enabled - so if something's not working as
# you might expect, make sure that you have specifically enabled it
# below.
#
#
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "/Library/WebServer/Documents"
<Directory "/Library/WebServer/Documents">
#
# Possible values for the Options directive are "None", "All",
# or any combination of:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
# The Options directive is both complicated and important. Please see
# http://httpd.apache.org/docs/2.4/mod/core.html#options
# for more information.
#
Options FollowSymLinks Multiviews
MultiviewsMatch Any
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# AllowOverride FileInfo AuthConfig Limit
#
AllowOverride None
#
# Controls who can get stuff from this server.
#
Require all granted
</Directory>
#
# DirectoryIndex: sets the file that Apache will serve if a directory
# is requested.
#
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
#
# The following lines prevent .htaccess and .htpasswd files from being
# viewed by Web clients.
#
<FilesMatch "^\.([Hh][Tt]|[Dd][Ss]_[Ss])">
Require all denied
</FilesMatch>
#
# Apple specific filesystem protection.
#
<Files "rsrc">
Require all denied
</Files>
<DirectoryMatch ".*\.\.namedfork">
Require all denied
</DirectoryMatch>
#
# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a <VirtualHost>
# container, error messages relating to that virtual host will be
# logged here. If you *do* define an error logfile for a <VirtualHost>
# container, that host's errors will be logged there and not here.
#
ErrorLog "/private/var/log/apache2/error_log"
#
# LogLevel: Control the number of messages logged to the error_log.
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
#
LogLevel warn
<IfModule log_config_module>
#
# The following directives define some format nicknames for use with
# a CustomLog directive (see below).
#
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
# You need to enable mod_logio.c to use %I and %O
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
#
# The location and format of the access logfile (Common Logfile Format).
# If you do not define any access logfiles within a <VirtualHost>
# container, they will be logged here. Contrariwise, if you *do*
# define per-<VirtualHost> access logfiles, transactions will be
# logged therein and *not* in this file.
#
CustomLog "/private/var/log/apache2/access_log" common
#
# If you prefer a logfile with access, agent, and referer information
# (Combined Logfile Format) you can use the following directive.
#
#CustomLog "/private/var/log/apache2/access_log" combined
</IfModule>
<IfModule alias_module>
#
# Redirect: Allows you to tell clients about documents that used to
# exist in your server's namespace, but do not anymore. The client
# will make a new request for the document at its new location.
# Example:
# Redirect permanent /foo http://www.example.com/bar
#
# Alias: Maps web paths into filesystem paths and is used to
# access content that does not live under the DocumentRoot.
# Example:
# Alias /webpath /full/filesystem/path
#
# If you include a trailing / on /webpath then the server will
# require it to be present in the URL. You will also likely
# need to provide a <Directory> section to allow access to
# the filesystem path.
#
# ScriptAlias: This controls which directories contain server scripts.
# ScriptAliases are essentially the same as Aliases, except that
# documents in the target directory are treated as applications and
# run by the server when requested rather than as documents sent to the
# client. The same rules about trailing "/" apply to ScriptAlias
# directives as to Alias.
#
ScriptAliasMatch ^/cgi-bin/((?!(?i:webobjects)).*$) "/Library/WebServer/CGI-Executables/$1"
</IfModule>
<IfModule cgid_module>
#
# ScriptSock: On threaded servers, designate the path to the UNIX
# socket used to communicate with the CGI daemon of mod_cgid.
#
#Scriptsock cgisock
</IfModule>
#
# "/Library/WebServer/CGI-Executables" should be changed to whatever your ScriptAliased
# CGI directory exists, if you have that configured.
#
<Directory "/Library/WebServer/CGI-Executables">
AllowOverride None
Options None
Require all granted
</Directory>
<IfModule headers_module>
#
# Avoid passing HTTP_PROXY environment to CGI's on this or any proxied
# backend servers which have lingering "httpoxy" defects.
# 'Proxy' request header is undefined by the IETF, not listed by IANA
#
RequestHeader unset Proxy early
</IfModule>
<IfModule mime_module>
#
# TypesConfig points to the file containing the list of mappings from
# filename extension to MIME-type.
#
TypesConfig /private/etc/apache2/mime.types
#
# AddType allows you to add to or override the MIME configuration
# file specified in TypesConfig for specific file types.
#
#AddType application/x-gzip .tgz
#
# AddEncoding allows you to have certain browsers uncompress
# information on the fly. Note: Not all browsers support this.
#
#AddEncoding x-compress .Z
#AddEncoding x-gzip .gz .tgz
#
# If the AddEncoding directives above are commented-out, then you
# probably should define those extensions to indicate media types:
#
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
#
# AddHandler allows you to map certain file extensions to "handlers":
# actions unrelated to filetype. These can be either built into the server
# or added with the Action directive (see below)
#
# To use CGI scripts outside of ScriptAliased directories:
# (You will also need to add "ExecCGI" to the "Options" directive.)
#
#AddHandler cgi-script .cgi
# For type maps (negotiated resources):
#AddHandler type-map var
#
# Filters allow you to process content before it is sent to the client.
#
# To parse .shtml files for server-side includes (SSI):
# (You will also need to add "Includes" to the "Options" directive.)
#
#AddType text/html .shtml
#AddOutputFilter INCLUDES .shtml
</IfModule>
#
# The mod_mime_magic module allows the server to use various hints from the
# contents of the file itself to determine its type. The MIMEMagicFile
# directive tells the module where the hint definitions are located.
#
#MIMEMagicFile /private/etc/apache2/magic
#
# Customizable error responses come in three flavors:
# 1) plain text 2) local redirects 3) external redirects
#
# Some examples:
#ErrorDocument 500 "The server made a boo boo."
#ErrorDocument 404 /missing.html
#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
#ErrorDocument 402 http://www.example.com/subscription_info.html
#
#
# MaxRanges: Maximum number of Ranges in a request before
# returning the entire resource, or one of the special
# values 'default', 'none' or 'unlimited'.
# Default setting is to accept 200 Ranges.
#MaxRanges unlimited
#
# EnableMMAP and EnableSendfile: On systems that support it,
# memory-mapping or the sendfile syscall may be used to deliver
# files. This usually improves server performance, but must
# be turned off when serving from networked-mounted
# filesystems or if support for these functions is otherwise
# broken on your system.
# Defaults: EnableMMAP On, EnableSendfile Off
#
#EnableMMAP off
#EnableSendfile on
TraceEnable off
# Supplemental configuration
#
# The configuration files in the /private/etc/apache2/extra/ directory can be
# included to add extra features or to modify the default configuration of
# the server, or you may simply copy their contents here and change as
# necessary.
# Server-pool management (MPM specific)
Include /private/etc/apache2/extra/httpd-mpm.conf
# Multi-language error messages
#Include /private/etc/apache2/extra/httpd-multilang-errordoc.conf
# Fancy directory listings
Include /private/etc/apache2/extra/httpd-autoindex.conf
# Language settings
#Include /private/etc/apache2/extra/httpd-languages.conf
# User home directories
#Include /private/etc/apache2/extra/httpd-userdir.conf
# Real-time info on requests and configuration
#Include /private/etc/apache2/extra/httpd-info.conf
# Virtual hosts
#Include /private/etc/apache2/extra/httpd-vhosts.conf
# Local access to the Apache HTTP Server Manual
#Include /private/etc/apache2/extra/httpd-manual.conf
# Distributed authoring and versioning (WebDAV)
#Include /private/etc/apache2/extra/httpd-dav.conf
# Various default settings
#Include /private/etc/apache2/extra/httpd-default.conf
# Configure mod_proxy_html to understand HTML4/XHTML1
<IfModule proxy_html_module>
Include /private/etc/apache2/extra/proxy-html.conf
</IfModule>
# Secure (SSL/TLS) connections
#Include /private/etc/apache2/extra/httpd-ssl.conf
#
# Note: The following must must be present to support
# starting without SSL on platforms with no /dev/random equivalent
# but a statically compiled-in mod_ssl.
#
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>
Include /private/etc/apache2/other/*.conf--앞으로 실습하는 프로젝트들은 아파치 서버로 서빙할 것이기 때문에 DocumentRoot를 변경해주면서 하자.--