-
[정글 Week08_WebServer] 키워드카테고리 없음 2025. 5. 2. 20:59
🗝️ CGI(Common Gateway Interface)
: 웹 서버가 동적으로 실행 가능한 외부 프로그램을 호출해서 그 프로그램의 출력 결과를 HTTP 응답으로 클라이언트에게 전달하기 위한 표준 프로토콜
CGI의 조건
1. 웹 서버에 의해 실행됨
2. 클라이언트 입력을 환경변수 또는 표준입력(stdin)으로 전달받음
3. 표준출력(stdout)으로 HTML 등 HTTP 응답 생성
4. 웹 클라이언트에게 동적 컨텐츠 제공
CGI 프로그램 예시
1. 사용자가 웹에서 GET /cgi-bin/adder?num1=3&num2=4 HTTP/1.1 요청
2. 웹서버는 adder라는 외부 프로그램 실행
* 환경변수 QUERY_STRING="num1=3&num2=4" 설정
3. adder는 두 숫자를 더해 HTML을 생성하고 stdout으로 출력
4. 웹서버는 그 출력을 사용자에게 전송
/* * adder.c - a minimal CGI program that adds two numbers together */ /* $begin adder */ #include "csapp.h" int main(void) { char *buf, *p; char arg1[MAXLINE], arg2[MAXLINE], content[MAXLINE]; int n1 = 0, n2 = 0; /* Extract the two arguments */ if ((buf = getenv("QUERY_STRING")) != NULL) { p = strchr(buf, '&'); *p = '\0'; strcpy(arg1, buf); strcpy(arg2, p + 1); n1 = atoi(strchr(arg1, '=') + 1); n2 = atoi(strchr(arg2, '=') + 1); } /* Make the response body */ sprintf(content, "QUERY_STRING=%s\r\n<p>", buf); sprintf(content + strlen(content), "Welcome to add.com: "); sprintf(content + strlen(content), "THE Internet addition portal.\r\n<p>"); sprintf(content + strlen(content), "The answer is: %d + %d = %d\r\n<p>", n1, n2, n1 + n2); sprintf(content + strlen(content), "Thanks for visiting!\r\n"); /* Generate the HTTP response */ printf("Content-type: text/html\r\n"); printf("Content-length: %d\r\n", (int)strlen(content)); printf("\r\n"); printf("%s", content); fflush(stdout); exit(0); } /* $end adder */
💫 CGI는 "웹 요청 → 외부 프로그램 실행 → 응답 반환"의 인터페이스이다.
🗝️ Fast-CGI
CGI는 클라이언트의 요청이 1건 올 때마다 fork()로 자식 프로세스를 생성하고, exec()로 스크립트를 실행하는 방식이기 때문에 초당 수십~수백 요청만 와도 서버가 터질 수 있고, 스케일에 부적합해서 실제 서비스 운영에는 부적절함
반면, Fast-CGI는 미리 실행된 인터프리터가 계속 실행 상태로 대기하는 방식으로 하나의 프로세스를 유지함
(요청이 올 때마다 소켓으로 데이터 전달하므로 fork() / exec() 없이 바로 응답 처리 가능)
또한 여러 요청을 병렬로 처리할 수 있고, 프로세스 풀, 요청 큐, 타임아웃 등을 관리할 수 있어서 확장성이 뛰어남
출처: https://fastcgi-archives.github.io/FastCGI_A_High-Performance_Web_Server_Interface_FastCGI.html 항목 CGI(Common Gateway Interface) FastCGI 방식 요청마다 새로운 프로세스 생성 프로세스를 미리 실행해두고 요청마다 재사용 성능 매우 느림 (fork + exec 오버헤드 큼) 빠름 (persistent 프로세스) 리소스 낭비 심함 적음 상태 유지 없음 가능 (long - running) 주 사용처 초기 웹 환경, 간단한 테스트 현대 웹 서버 연동(PHP, Python 등)
⚙️ 실제 환경 예시1. PHP-FPM
: PHP의 FastCGI 구현체
PHP-FPM은 웹 서버(Nginx)로부터 요청을 받아 FastCGI 프로토콜을 통해 PHP 스크립트를 처리하고 해당 결과를 다시 반환함.
고성능 프로세스 풀 관리, 동시 처리에 유리
* Ningx 자체는 스크립트를 실행하지 않음. 대신 PHP-FPM이나 uWSGI 같은 백엔드와 FastCGI로 통신하여 요청을 위임하고 응답을 받아 클라이언트에게 전달함
출처: https://cpanel.net/blog/tips-and-tricks/how-to-use-php-fpm-with-cpanel/ PHP + Nginx 요약 흐름
1) 클라이언트가 index.php 요청
2) Nginx가 .php 요청을 감지하고 FastCGI로 PHP-FPM에 전달
3) PHP-FPM이 스크립트를 실행하고 결과 생성
4) Ningx를 통해 다시 클라이언트에게 결과 전달
🧚🏻 이때, Nginx와 PHP-FPM은 FastCGI 소켓(Unix domain socket 또는 TCP socket)을 통해 통신2. uWSGI(WSGI 기반, FastCGI 지원)
: Python 웹 어플리케이션(Django, Werkzeug)을 실행하기 위한 서버
uWSGI는 기본적으로 WSGI 인터페이스를 사용하지만 FastCGI 프로토콜도 지원하므로 Nginx 등과 연동 가능
* WSGI(Web Server Gateway Interface): 웹서버와 Python 웹 어플리케이션 사이의 통신 표준 인터페이스
출처: https://velog.io/@ddonghyeo_/Django-uWSGI-NGINX-%EC%97%B0%EB%8F%99 🗝️ Webserver
: 클라이언트(브라우저)로부터 요청을 받아서 웹 페이지나 리소스를 응답으로 돌려주는 프로그램 또는 하드웨어
웹 서버 주요 역할
1. 웹페이지 콘텐츠 제공
1) 클라이언트의 HTTP(S) 요청 수신
2) 요청에 따라 적절한 파일 또는 응답 생성
3) 클라이언트에게 HTTP(S) 응답 전송
2. 가상 호스팅(Virtual Hosting)
: 하나의 IP 주소에서 도메인 이름 기반으로 여러 웹 사이트를 동시에 호스팅 가능
즉, 하나의 서버에서 여러개의 웹 사이트를 동시에 서비스할 수 있음
* 웹 서버 설정 예시(Nginx)
10.1.3.15에서 아래와 같이 설정하면
브라우저가 www.site1.com으로 접근하면 site1으로, www.site2.com으로 접근하면 site2로 연결되며, 두 사이트 모두 같은 IP(10.1.3.15)의 80번 포트에서 도메인 이름 기반의 가상 호스팅으로 운영됨
# /etc/nginx/sites-available/site1.conf server { listen 80; server_name site1.com www.site1.com; root /var/www/site1; index index.html index.htm; location / { try_files $uri $uri/ =404; } }
# /etc/nginx/sites-available/site2.conf server { listen 80; server_name site2.com www.site2.com; root /var/www/site2; index index.html index.htm; location / { try_files $uri $uri/ =404; } }
3. 대용량 파일 지원
: LFS(Large File Support) 설정을 통해 32비트 운영체제에서도 64비트 오프셋을 사용할 수 있게 되어 파일 크기 제한(2GB)을 초과하는 대용량 파일 전송 지원 가능
- 32비트 시스템에서 long이나 off_t 타입은 기본적으로 4바이트(2^32 = 약 4GB)
- 보통은 signed이기 때문에 최대 표현 가능한 크기는 2GB(2^31 - 1) 정도
- 따라서 기본 설정으로는 2GB 넘는 파일을 열거나 읽으면 에러 발생
- 아래와 같이 _FILE_OFFSET_BITS 64 매크로를 정의하면 off_t, lseek(), fopen() 등에서 내부적으로 64비트 버전 함수/타입으로 대체
#define _FILE_OFFSET_BITS 64 #include <stdio.h> int main() { FILE *fp = fopen("large_file.dat", "rb"); fseek(fp, 5L * 1024 * 1024 * 1024, SEEK_SET); // 5GB 위치로 이동 // ... }
* 64비트 운영체제에서는 기본으로 대용량 파일 지원4. 대역폭 관리 및 조절
: 네트워크 과부하 방지를 위해 클라이언트당 전송 속도 또는 연결 수 제한 가능
5. 서버측 스크립팅
: PHP, Python, Perl 등 서버 측 스크립트 언어를 실행해서 동적으로 HTML 페이지나 데이터 생성 가능
이러한 동작은 CGI, FastCGI, WAS(Web Application Server), 내장 인터프리터 등을 통해 처리됨
* CGI는 요청마다 새로운 프로세스를 생성해서 매우 느리고 리소스 낭비가 심하기 때문에 초기 웹 환경에서만 사용되었음
⚙️ 대표적인 웹 서버
- Apache2: 리눅스 기반의 무료 오픈소스 웹서버
- Nginx: 2004년 러시아의 이고르 시셰프(Игорь Сысоев)가 개발한 무료 오픈소스 웹서버. 2011년에 엔진엑스사를 설립해 유료 기술지원도 함
- IIS(Internet Information Services): 마이크로소프트사의 윈도우 시스템에서 사용하는 웹서버 프로그램
출처: https://raonctf.com/essential/study/web/webserver_server 🖥️ 서버 OS 종류
: 서버 컴퓨터에서 실행되는 운영 체제
1. Windows Server
- 마이크로소프트에서 개발한 서버용 운영 체제로 Windows 환경에서 작업하는 웹 애플리케이션 및 웹 서비스에 적합함
- .NET 프레임워크 등 Microsoft 기술과의 통합이 원활함
- 보안 기능과 관리 도구가 잘 갖춰져 있어 관리가 용이함2. Linux
- 오픈 소스 운영 체제로, 다양한 배포판(데비안, 우분투, CentOS 등)이 있음
- 높은 안정성과 보안성을 제공하며, 웹 서버 운영에 매우 흔히 사용됨
- 서버의 용도와 환경에 따라 다양한 커스터마이징 가능3. MacOS
- 애플에서 개발한 서버용 운영 체제로 Mac 기기와의 통합성이 뛰어나며, Mac 환경에서 웹 서비스 구축이나 앱 개발에 적합함
- 시스템 관리와 보안 기능이 잘 갖추어져 있음
- 주로 중소규모 또는 Mac 중심의 웹 애플리케이션을 운영하는데 사용💫 웹 서버는 정적인 파일을 전송하거나 필요시 외부 프로그램을 실행해 동적인 결과를 반환할 수 있다.
🗝️ MIME(Multipurpose Internet Mail Extensions) Type
웹서버나 CGI 프로그램이 응답을 생성할 때는 응답의 타입이 무엇인지 반드시 알려줘야 하는데,
이것을 지정하는 것이 MIME Type!
즉, MIME Type은 브라우저가 받은 데이터가 어떤 형식인지 알려주는 표준 형식을 말함
Multipurpose Internet Mail Extensions 이라는 명칭에서도 알 수 있듯이 원래 전자우편(이메일)의 콘텐츠 타입을 표현하기 위해 만들어졌으나, 현재는 이메일 뿐만 아니라 웹에서도 데이터 형식 식별자로 널리 쓰임
👵🏻 옛날 옛적 전자우편이 등장한 초창기에...
📧 초창기 이메일의 문제
초기 이메일 시스템은 7비트 ASCII 문자만 전송 가능했다.
즉, 이미지, 음악, 한글, PDF, 바이너리 파일 등은 전송할 수 없었다.
이를 해결하기 위해 1992년 RFC 1341에서 표준화된 MIME이 등장했다!
기존의 이메일 메세지에 확장 헤더를 붙여서 어떤 형식의 콘텐츠인지, 어떤 인코딩인지 등을 명시하게 했다.대표적인 MIME Type 예시
콘텐츠 종류 MIME Type HTML 문서 text/html PNG 이미지 image/png JSON 데이터 application/json PDF 문서 application/pdf 🧐 MIME Type vs Content Type
MIME Type은 인터넷에서 파일의 형식이나 종류를 식별하는 '표준 문자열'
Content Type은 HTTP나 이메일 헤더에서 MIME Type을 나타내는 '필드 이름'
text/javascript MIME Type