2023-08-09-TIL
Today I Learned
Apache vs Nginx
둘 다 웹 서버이면서 리버스 프록시로도 쓰인다. 비교 글들이 공통으로 짚는 차이는 요청을 처리하는 구조다.
Apache HTTP Server는 MPM(Multi-Processing Module)이라는 모듈로 처리 방식을 고른다. Apache 문서는 MPM이 포트에 바인딩하고, 요청을 받고, 자식 프로세스나 스레드에 요청을 나눠 주는 역할을 맡는다고 설명한다. 대표적으로 세 가지가 있다.
prefork: 스레드를 쓰지 않고 프로세스로 요청을 처리한다. 스레드를 지원하지 않는 환경을 위한 방식이다.worker: 스레드로 요청을 처리하는 방식이다.event: 스레드와 스레드 안전한 polling을 함께 지원하는 시스템용 스레드 방식이다. 문서는 최신 시스템에서 기본값이라고 설명한다.
Nginx는 처음부터 이벤트 기반으로 설계됐다. Nginx 초보자 가이드에 따르면 마스터 프로세스 하나가 설정을 읽고 워커 프로세스를 관리하며, 실제 요청은 워커 프로세스가 처리한다. 워커 수는 worker_processes로 정하고, CPU 코어 수에 맞추는 경우가 많다. 가이드는 워커들이 이벤트 기반 모델과 OS 의존적인 메커니즘으로 요청을 나눠 처리한다고 설명한다. 연결마다 프로세스나 스레드를 붙이지 않으니 동시 연결이 많을 때 유리하다는 것이 비교 글들의 주된 설명이다.
첫 번째 링크는 Spring Boot 애플리케이션 앞에 Nginx를 두고 배포하는 구성을 다룬다.
- https://velog.io/@u-nij/Spring-Boot-Nginx-%EC%97%B0%EB%8F%99%ED%95%B4%EC%84%9C-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0
- https://velog.io/@deannn/Apache%EC%99%80-NginX-%EB%B9%84%EA%B5%90-%EC%B0%A8%EC%9D%B4%EC%A0%90
- https://rootkey.tistory.com/143
- https://kinsta.com/blog/nginx-vs-apache/
- https://www.hostinger.com/tutorials/nginx-vs-apache-what-to-use/#:~:text=The%20main%20difference%20between%20NGINX,to%20have%20generally%20better%20performance.
503 Error
이번 경우에는 DNS 그룹에 변경된 인스턴스가 포함되지 않아서 발생했다.
503 Service Unavailable은 서버가 지금은 요청을 처리할 수 없다는 뜻이다. RFC 9110은 이 상태 코드를 일시적인 과부하나 예정된 점검 때문에 요청을 처리할 수 없고, 시간이 지나면 나아질 가능성이 높은 상황으로 정의한다. 서버는 Retry-After 헤더로 언제 다시 시도하면 되는지 알려 줄 수 있다. 상태 코드가 클라이언트의 다음 행동을 어떻게 정하는지는 HTTP 웹 기본 지식 7에 정리해 두었다.
503은 애플리케이션이 아니라 그 앞의 로드 밸런서가 만들기도 한다. 예를 들어 AWS Application Load Balancer 문서는 대상 그룹에 등록된 대상이 하나도 없을 때 로드 밸런서가 503을 돌려준다고 적고 있다. 이번처럼 변경된 인스턴스가 트래픽을 받는 그룹에 포함되지 않으면, 앞단 입장에서는 요청을 보낼 곳이 없는 상태가 된다. 그래서 503을 보면 애플리케이션 로그보다 먼저 라우팅 대상 목록과 헬스 체크 상태를 확인하는 편이 빠르다.
- https://medium.com/codex/how-a-rest-client-handles-503-service-unavailable-error-35c8a42a75a8
댓글
아직 댓글이 없습니다