Nginx & Caddy 완전 정복 8편 — Nginx vs Caddy: 장단점 비교와 선택 가이드
시리즈를 마무리하며 Nginx와 Caddy를 설계 철학, HTTPS, 설정, 기능, 성능, 보안, 확장성, 생태계, 운영 관점에서 비교하고 상황별 선택 기준을 제시합니다.
blog92@web:~$ cd categories/devops
Docker·CI/CD·인프라 — 배포와 운영 자동화 기록
시리즈를 마무리하며 Nginx와 Caddy를 설계 철학, HTTPS, 설정, 기능, 성능, 보안, 확장성, 생태계, 운영 관점에서 비교하고 상황별 선택 기준을 제시합니다.
Next.js 프런트엔드, API 서버 2대, WebSocket, 관리자 페이지로 이루어진 서비스를 Docker Compose 위에서 Nginx와 Caddy로 각각 구성하고, 설정과 운영 관점에서 나란히 비교합니다. Nginx→Caddy 지시어 대응표도 함께 제공합니다.
이름 있는 매처와 지시어 실행 순서, handle/route/handle_path, 스니펫, 로드 밸런싱과 액티브 헬스 체크, DNS 챌린지와 On-Demand TLS, JSON 설정과 Admin API, xcaddy 플러그인 빌드, 메트릭과 튜닝을 다룹니다.
Caddy의 설계 철학과 구조, 설치와 CLI, Caddyfile 문법, 자동 HTTPS의 동작 원리, 정적 파일 서빙과 리버스 프록시 기본을 다룹니다.
proxy_cache, limit_req/limit_conn, add_header 상속 함정과 보안 헤더, 워커·커널 튜닝, 구조화 로그, stream 모듈을 이용한 TCP 프록시와 트러블슈팅을 다룹니다.
server/location 선택 알고리즘, proxy_pass 슬래시 규칙, 프록시 헤더와 WebSocket, upstream 로드 밸런싱, certbot과 공식 ACME 모듈을 이용한 HTTPS 설정까지 다룹니다.
Nginx 설치, 마스터/워커 이벤트 기반 아키텍처, nginx.conf의 문법과 컨텍스트 구조, 정적 파일 서빙과 필수 명령어를 다룹니다.
Nginx와 Caddy를 배우기 전에 알아야 할 웹 서버, 리버스 프록시, TLS, 로드 밸런싱의 기본 개념을 정리합니다.
sudo pm2 혼용부터 K8s 안에서 PM2로 스케일링까지 현장에서 반복되는 안티패턴 12가지를 증상·원인·해결로 정리하고, 설치부터 무중단·로그·보안까지 운영 셋업 체크리스트와 명령어 치트시트로 시리즈를 마무리한다.
컨테이너에서 PM2를 쓸지 말지의 판단 기준과 pm2-runtime, Nginx 리버스 프록시 구성, 인터넷이 없는 폐쇄망에서의 오프라인 설치 절차, 업그레이드 주의사항과 증상별 트러블슈팅.
npm 스크립트·TypeScript·Next.js·Bun·비 Node 앱을 PM2로 띄우는 방법, pm2 monit과 @pm2/io 커스텀 메트릭 및 외부 관측성 스택과의 역할 분담, Programmatic API, 그리고 pm2 deploy와 CI/CD 중 무엇을 고를지.
PM2 데몬과 PM2_HOME의 구조, fork와 cluster 모드의 차이와 클러스터가 불러오는 상태(State) 문제, restart와 reload의 결정적 차이, wait_ready와 graceful shutdown으로 요청 유실을 0으로 만드는 흐름.
watch 모드를 개발 전용으로 두는 이유, startup/save/resurrect로 만드는 부팅 영속성, 그리고 pm2-logrotate와 OS logrotate로 로그 디스크를 지키는 방법.
CLI 옵션을 ecosystem.config.js로 옮겨 재현 가능하게 만들고, env 블록과 --update-env 함정을 정리하며, 크래시 루프 방지·지수 백오프·메모리 기반 재시작·크론 재시작까지 재시작 정책을 의도적으로 설계한다.
node server.js가 운영에서 부딪히는 여섯 가지 문제, systemd·Docker와의 역할 비교, 설치와 첫 실행, 상태 조회부터 stop/delete/kill 구분까지 필수 명령어와 로그 기초.
"그래서 우리 팀의 전달 능력이 실제로 좋아졌는가"에 답하기 위한 DORA 네 지표의 정의와 수집 방법, 지표를 잘못 쓰는 방식, 파이프라인 자체의 건강 지표, 성숙도 로드맵과 최종 체크리스트로 시리즈를 마무리합니다.
배포에 필요한 Kubernetes 리소스만 추린 뒤, Git을 운영 상태의 원천으로 삼는 GitOps를 다룹니다. Push와 Pull 배포의 차이, 앱 저장소와 설정 저장소 분리, Argo CD Application, GitOps에서의 비밀값과 마이그레이션 순서를 정리합니다.
인터넷과 분리된 폐쇄망에서는 hosted runner도 npm 레지스트리도 Docker Hub도 없습니다. 반입 횟수와 크기를 줄이는 것을 목표로 내부망 구성 요소, 이미지·의존성 반입, 폐쇄망용 Dockerfile, 내부 CI와 배포 번들 방식을 설계합니다.
"README 하나 고쳤는데 왜 전체가 빌드되지?"와 "같은 워크플로를 복사해 붙여 넣는 문제"를 함께 풉니다. 변경 영향 분석과 paths-filter, Composite Action과 Reusable Workflow의 차이, 조직 단위 표준화를 다룹니다.
의존성·베이스 이미지·서드파티 액션까지 모두 공급망입니다. 액션 고정과 의존성 관리 자동화, 코드·비밀값 스캔, 컨테이너 이미지 스캔, SBOM 생성, 이미지 서명과 검증, SLSA 프레임워크를 파이프라인에 심습니다.
blog92@web:~$ cd ..