MCP 서버 구축 가이드: AWS EC2, Docker, Nginx 활용
AI Store에서 AI코딩으로 만들어진 앱을 만나보세요!
지금 바로 방문하기

모델 컨텍스트 프로토콜(MCP) 서버 구축 가이드

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

인프라/DevOps/보안

대상자

  • DevOps 엔지니어 및 클라우드 개발자
  • AWS EC2, Docker, Nginx, SSL 인증서 구성에 익숙한 중급 이상 개발자
  • AI/LLM과 외부 도구 통합이 필요한 프로젝트 개발자

핵심 요약

  • MCP 프로토콜의 핵심: Server-Sent Events(SSE) 기반의 비동기 실시간 통신 제공 (GET /sse, POST /messages)
  • AWS EC2 배포 필수 조건: Docker 이미지 빌드(docker build -t mcp-server:latest .), ECR 저장소 생성(aws ecr create-repository), Nginx SSL 설정(ssl_certificate /etc/letsencrypt/live/...)
  • 보안/성능 고려사항: Nginx에서 SSE 엔드포인트 분리(location = /sse), HTTPS 강제 전환(301 리디렉션), 자동 인증서 갱신(crontab 설정)

섹션별 세부 요약

1. MCP 프로토콜 개요

  • MCP 정의: AI 애플리케이션이 외부 데이터 소스, DB, 도구와 보안 연결을 위한 표준 인터페이스
  • SSE 장점:

- HTTP 기반으로 로드 밸런서/프록시 호환성 보장

- 자동 재연결 기능 지원

- HTTP/HTTPS 포트(80,443) 사용으로 방화벽 우회 가능

  • 프로토콜 흐름:
  1. GET /sse → SSE 스트림 연결
  2. POST /messages → MCP 명령 전송
  3. SSE Stream → 응답 전달

2. AWS EC2 서버 배포

  • 환경 요구사항:

- AWS CLI, Docker, Ubuntu 22.04 LTS, 도메인 DNS 관리 권한

- EC2 인스턴스 설정:

- AMI: Ubuntu Server 22.04 LTS

- 인스턴스 타입: t3.small (테스트: t2.micro)

- 보안 그룹: SSH(22), HTTP(80), HTTPS(443), 커스텀(8000)

  • Docker 이미지 배포:

```bash

docker build -t mcp-server:latest .

docker tag mcp-server:latest .dkr.ecr.us-east-1.amazonaws.com/mcp-server:latest

docker push .dkr.ecr.us-east-1.amazonaws.com/mcp-server:latest

```

3. Nginx 및 SSL 구성

  • 필수 구성 파일:

```nginx

server {

listen 443 ssl;

server_name mcp-server.yourdomain.com;

ssl_certificate /etc/letsencrypt/live/mcp-server.yourdomain.com/fullchain.pem;

ssl_certificate_key /etc/letsencrypt/live/mcp-server.yourdomain.com/privkey.pem;

location = /sse {

if ($request_method != GET) { return 405; }

proxy_pass http://localhost:8000;

proxy_http_version 1.1;

proxy_set_header Upgrade $http_upgrade;

proxy_set_header Connection "upgrade";

proxy_read_timeout 3600s;

}

location /messages {

proxy_pass http://localhost:8000;

proxy_set_header Content-Type $content_type;

}

}

```

  • SSL 인증서 자동 갱신:

```bash

sudo certbot --nginx -d mcp-server.yourdomain.com --email your@email.com --agree-tos --non-interactive

echo "0 12 * /usr/bin/certbot renew --quiet" | sudo tee -a /etc/crontab > /dev/null

```

4. 흔한 실수 및 해결 방안

  • 오류 사례:

- RuntimeError: Expected ASGI message 'http.response.body'

- 원인: POST 요청이 /sse 엔드포인트로 잘못 전송

- 해결: POST /messages 엔드포인트 사용

  • 구성 오류:

- location /sse 대신 location = /sse 사용하여 엔드포인트 분리

- proxy_pass 누락 시 Nginx 설정 오류 발생

5. MCP 프로토콜 요구사항

  • 필수 엔드포인트:

- GET /sse: 장기 연결 유지(최대 1시간 타임아웃)

- POST /messages: JSON-RPC 형식의 MCP 명령 전송

  • 세션 관리:

- POST /messages/?session_id=xxx 형식으로 세션 ID 포함

결론

  • 실무 팁:

- Nginx 구성 파일에서 location = /sse 사용하여 엔드포인트 분리 필수

- Let's Encrypt 자동 갱신(crontab)으로 SSL 인증서 유지보수 자동화

- 테스트 시 t2.micro 인스턴스 사용 후 확장성 필요 시 t3.small으로 업그레이드

  • 핵심 구현 요약:

```bash

# Nginx 구성 시 반드시 분리된 엔드포인트 사용

location = /sse { ... }

location /messages { ... }

```