[Review] NGINX 쿡북

Jade·2021년 6월 19일
0

한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.

엔진엑스는 대체로 아파치보다 고속으로 동작하고 메모리나 CPU 사용률이 적으며, OS와 하드웨어에 걸리는 부하가 낮아 인기가 높은 웹서버이다.

이 책은 다양한 엔진엑스 설정 레시피를 통해 엔진엑스가 제공하는 다양한 기능을 설정하고 사용하는 방법을 소개한다. 스텝 바이 스텝으로 따라가며 배우는 방식이 아니기에, 사전처럼 곁에 두고 실무에서 특정 이슈가 발생할 때 꺼내보면 큰 도움이 될 책이다.

그동안은 단순 웹서버나 리버스 프록시 서버 용도로만 엔진엑스를 알고 있었다면, 이번 기회를 통해 엔진엑스 애플리케이션 전송 플랫폼의 강력한 기능을 사용하는 방법 등 다양한 설정법이 있다는 것을 알게 되었다.

구체적으로 아래와 같은 문제 상황이 발생할 때의 해결책을 얻을 수 있다.

1. 엔진엑스 기초

  • 엔진엑스 오픈 소스 버전을 데비안이나 우분투 리눅스 배포판에 설치하기
  • 엔진엑스 오픈소스 버전을 레드햇이나 센트OS 리눅스 배포판에 설치하기
  • 엔진엑스 플러스 설치하기
  • 엔진엑스 설치 상태를 점검하고 버전을 확인하기
  • 엔진엑스 주요 디렉터리 구조와 명령어 이해하기
  • 엔진엑스로 정적 콘텐츠 서비스하기
  • 패킷 손실 없이 설정을 리로드하기

2. 고성능 부하분산

  • 부하를 두 대 이상의 HTTP 서버로 분산하기
  • 부하를 두 대 이상의 TCP 서버로 분산하기
  • 부하를 두 대 이상의 UDP 서버로 분산하기
  • 서로 다른 특성을 갖는 작업이나 사양이 다른 서버로 구성된 서버 풀로 인해 라운드 로빈 방식의 부하분산이 적합하지 않은 경우
  • 엔진엑스 플러스 환경에서 사용자가 특정 업스트림 서버를 사용하도록 고정하기
  • 엔진엑스 플러스 환경에서 사용자가 업스트림 애플리케이션으로부터 획득한 쿠키를 이용해 특정 업스트림 서버를 사용하도록 고정하기
  • 엔진엑스 플러스 환경에서 영구 세션을 세부적으로 제어해 업스트림 서버로 전달하기
  • 서버 유지보수가 필요하거나 서버를 종료해야 하는 상황에서 활성 사용자 세션이 남아있는 엔진엑스 서버를 점진적으로 서비스에서 제외하기
  • 업스트림 서버의 상태를 수동적으로 확인하기
  • 엔진엑스 플러스를 통해 업스트림 서버의 상태를 능동적으로 확인하기
  • 운영 환경에서 실사용자 트래픽을 받기 전에 애플리케이션에서 예열이 필요한 상황

3. 트래픽 관리

  • 사용자 반응을 살펴보기 위해 버전이 2개 이상인 파일이나 애플리케이션으로 사용자를 분기하기
  • GeoIP 데이터베이스를 설치하고 엔진엑스의 관련 내장 변수를 활성화해 엔진엑스가 로그, 요청 프록시, 요청 분기 등을 수행할 때 사용자 위치를 확인하도록 하기
  • 비즈니스 요구사항이나 애플리케이션 요건에 따라 특정 국가의 사용자를 차단하기
  • 사용자 요청이 프록시 서버를 경유해 엔진엑스 서버에 전달됐을 때 실제 사용자 IP 확인하기
  • 사용자 IP 주소와 같이 사전에 정의된 키값에 따라 연결 수 제한하기
  • 사용자 IP 주소와 같이 사전에 정의된 키값을 이용해 요청 빈도 제한하기
  • 서비스 리소스의 부하를 막기 위해 사용자당 다운로드 대역폭 제한하기

4. 대규모 확장 가능한 콘텐츠 캐싱

  • 콘텐츠를 캐시하고 캐시를 어디에 저장할지 결정하기
  • 생성중인 캐시에 대한 요청은 업스트림 서버로 프록시하지 않기
  • 콘텐츠를 어떻게 캐시하고 다시 불러올지 제어하기
  • 캐시를 사용하지 않고 우회하기
  • 사용자 환경에 콘텐츠를 캐시해 성능 높이기
  • 캐시된 콘텐츠를 무효화하기
  • 용량이 큰 파일을 작은 조각으로 나눠 저장해 캐시 효율 높이기

5. 프로그래머빌리티와 자동화

  • 동적인 인프라 환경에서 엔진엑스 플러스를 즉시 재설정하기
  • 애플리케이션으로 들어오는 요청을 기반으로 엔진엑스 플러스가 동적으로 트래픽 관리에 대한 의사결정하기
  • 상용 프로그래밍 언어를 이용해 사용자 정의 확장 기능 사용하기
  • 코드를 통한 엔진엑스 설정 관리를 위해 퍼핏을 사용해 엔진엑스를 설치 및 설정하고 기존 퍼핏 설정을 수행하기
  • 코드를 통한 엔진엑스 설정 관리를 위해 셰프를 사용해 엔진엑스 설치 및 설정하고 기존 셰프 설정을 수행하기
  • 코드를 통한 엔진엑스 설정 관리를 위해 앤서블을 이용해 엔진엑스를 설치 및 설정하고 기존 앤서블 설정을 수행하기
  • 코드를 통한 엔진엑스 설정 관리를 위해 솔트스택을 사용해 엔진엑스를 설치 및 설정하고 기존 솔트스택 설정을 수행하기
  • 콘솔을 통해 변경되는 환경 변수 값들이 엔진엑스 설정에 자동으로 반영되게 하기

6. 인증

  • HTTP 기본 인증을 이용해서 애플리케이션과 콘텐츠를 안전하게 보호하기
  • 서드파티 인증 시스템을 통해 사용자 요청 인증하기
  • 사용자 요청을 업스트림 서버로 보내기 전에 JWT 검증하기
  • 엔진엑스 플러스에서 사용할 JSON 웹 키 생성하기
  • 엔진엑스 플러스에서 JSON 웹 토큰 검증하기
  • 엔진엑스 플러스가 자동으로 JSON 웹 키 세트를 요청하고 캐시하도록 하기
  • 오픈아이디 커넥트 신원 확인 서비스를 제공자를 엔진엑스 플러스에 연동하기

7. 보안 제어

  • 클라이언트의 IP 주소를 사용해 접근 제어하기
  • 본래의 서비스 도메인이 아닌 다른 도메인을 통해 리소스를 제공할 때 브라우저가 원활히 접근하도록 크로스 오리진 리소스 공유(CORS) 정책 지정하기
  • 클라이언트와 엔진엑스 서버 간 트래픽 암호화하기
  • 보다 높은 수준의 클라이언트 측 암호화를 수행하도록 설정하기
  • 엔진엑스와 업스트림 서비스 간 트래픽을 암호화하고 컴프라이언스 법규 준수 및 보안 네트워크 밖에 있는 업스트림 서비스와의 연결을 위한 협상 규칙을 정하기
  • 비밀값을 활용해 location 블록을 보호하기
  • 애플리케이션에서 비밀값을 사용해 보안 링크 생성하기
  • 특정 클라이언트에만 적용되는 기간 제한 링크를 사용해 location 블록 보호하기
  • 사용 기간이 만료되면 파기되는 링크 생성하기
  • HTTP로 수신된 요청을 HTTPS로 리다이렉트하기
  • 엔진엑스 앞에 위치한 계층에서 SSL 오프로딩을 수행하는 상황에서 모든 사용자 요청을 HTTPS로 리다이렉트하기
  • 웹 브라우저가 HTTP로 요청을 보내지 않도록 강제하기
  • 폐쇄형 웹 사이트를 위해 여러 계층의 보안 적용하기
  • 엔진엑스 플러스를 사용해 분산 서비스 거부(DDos) 공격 완화하기
  • 엔진엑스 플러스 앱 프로텍터 모듈을 설치하고 설정하기

8. HTTP/2

  • HTTP/2가 제공하는 기능의 이점 활용하기
  • gRPC 메서드 호출을 종결하고, 분석하고, 전달하고 부하를 분산하기
  • 클라이언트에 콘텐츠를 즉시 전송하기

9. 정교한 스트리밍

  • MP4나 FLV 형식으로 된 디지털 미디어 파일을 스트리밍하기
  • H.264/AAC로 인코딩돼 MP4 형식으로 만들어진 파일을 HTTP 라이브 스트리밍으로 스트리밍하기
  • 어도비의 HDS 형식으로 작게 나뉜 미디어 콘텐츠 지원하기
  • 시청 경험을 해치지 않는 선에서 사용자가 미디어 콘텐츠를 내려받는 네트워크 대역폭을 제한하기

10. 클라우드 환경 배포

  • AWS 환경에서 엔진엑스 서버 설정을 자동화해 스스로 프로비저닝하도록 하기
  • 엔진엑스 앞에 로드밸런서를 두지 않고 고가용성을 보장하기 위해 엔진엑스 페일오버 설정을 만들거나 여러 엔진엑스 노드로 트래픽 분산하기
  • 오픈소스 엔진엑스로 구성된 서버를 오토스케일링하고 부하를 쉽고 균등하게 애플리케이션 서버 간에 분산하기
  • AWS 플랫폼에서 엔진엑스 플러스를 사용한 만큼 지불하는 방식으로 쉽게 사용하기(마켓플레이스)
  • 애저 환경에서 빠르게 서버를 생성하거나 오토스케일링을 위한 스케일 세트에서 사용할 미리 설정된 엔진엑스 가상머신 이미지 생성하기
  • 애저 로드 밸런서에서 연결된 엔진엑스 노드를 부하에 맞춰 늘리거나 줄여 고가용성을 확보하고 동적으로 리소스 사용하기
  • 애저 환경에서 라이선스를 사용한 만큼 지불하는 방식으로 엔진엑스 플러스 운영하기(마켓플레이스)
  • 구글 컴퓨터 엔진과 앱 엔진을 사용하는 서비스 리소스로 부하를 분산하고 요청을 프록히사기 위해 엔진엑스 서버를 구글 컴퓨터 엔진으로 배포하기
  • 빠르게 가상 머신을 생성하거나 인스턴스 그룹에 대한 인스턴스 템플릿을 만들기 위해 구글 컴퓨트 이미지를 생성하기
  • 애플리케이션 간 컨텍스트 스위칭을 하거나 커스텀 도메인을 사용하는 HTTPS를 제공하기 위해 구글 앱 엔진을 위한 프록시 생성하기

11. 컨테이너와 마이크로서비스

  • 수신하는 API 요청을 요구사항에 따라 검증, 인증, 조작해 업스트림 서버로 라우팅하기
  • 이미 구성된 DNS의 SRV 레코드를 활용해 엔진엑스 플러스의 업스트림 서버 설정하기
  • 도커 허브에 등록된 엔진엑스 이미지를 이용해 빠르게 엔진엑스 서버 시작하기
  • 도커 이미지를 만들기 위해 엔진엑스 도커 파일을 생성하기
  • 컨테이너 환경에서 엔진엑스 플러스를 실행하기 위해 엔진엑스 플러스 도커 이미지 만들기
  • 여러 환경에서 동일한 컨테이너 이미지를 사용하도록 엔진엑스 설정에서 환경변수 사용하기
  • 애플리케이션을 쿠버네티스 환경으로 배포하면서 인그레스 컨트롤러가 필요한 상황
  • 프로메테우스로 모니터링 되는 환경에 엔진엑스를 배포하고 엔진엑스 통계 확인하기

12. 고가용성 보장을 위한 설정

  • 고가용성을 보장하는 부하분산 솔루션 구축하기
  • 두 대 이상의 엔진엑스 서버로 부하 분산하기
  • 엔진엑스를 AWS 환경에서 운영하고 있지만 엔진엑스 플러스의 고가용성 기능이 아마존의 IP 주소 할당 방식을 지원하지 않는 상황에서 부하분산하기
  • 고가용성을 제공하도록 구성된 엔진엑스 플러스 계층을 운영할 때 각 엔진엑스 플러스 인스턴스가 동일한 설정으로 운영되도록 동기화하기
  • 엔진엑스 플러스로 구성된 고가용성 서버 간에 공유 메모리 영역 동기화하기

13. 고급 활동 모니터링

  • 엔진엑스에 대한 기본 모니터링 활성화
  • 엔진엑스 플러스 서버를 통해 트래픽에 대한 상세 지표 수집하기
  • 엔진엑스 플러스 상태 대시보드가 제공하는 세부 지표를 API로 접근하기

14. 디버깅과 트러블슈팅

  • 접근 로그에 내장 변수 값 추가하기
  • 엔진엑스 서버 문제를 더 잘 확인할 수 있도록 오류 로깅 설정하기
  • 중앙화된 저장소로 로그를 모으기 위해 엔진엑스 로그를 Syslog 리스너로 전달하기
  • 클라이언트 요청을 완전히 이해하기 위해 엔진엑스 로그와 애플리케이션 로그를 연관 지어 확인하기
  • 보유한 오픈트레이싱 서버를 엔진엑스나 엔진엑스 플러스와 연동하기

15. 성능 튜닝

  • 시험의 일관성과 반복성을 확보하기 위해 로드 드라이버를 사용하고 시험을 자동화하기
  • 클라이언트와 맺은 단일 연결을 통해 받을 수 있는 요청 수를 늘리고 유휴 연결이 유지되는 시간을 증가시키기
  • 성능을 끌어올리기 위해 업스트림 서버와 연결된 설정을 유지하기
  • 업스트림 서버의 응답이 임시 파일에 기록되지 않도록 응답을 메모리상에 버퍼링하기
  • 접근 로그를 버퍼링해 시스템의 부하가 높을 때 엔진엑스 워커 프로세스의 작업이 지연되거나 차단되지 않도록 하기
  • 스파이크성 부하가 발생하거나 대량의 트래픽이 유입되는 사이트를 운영하기 위해 운영체제가 더 많은 연결을 맺도록 튜닝하기

16. 엔진엑스 컨트롤러

  • 엔진엑스 컨트롤러 설치 및 운영을 위한 환경 셋업하기
  • 엔진엑스 컨트롤러를 설치하고 에이전트를 이용해 엔진엑스 플러스 인스턴스 연결하기
  • API를 통해 지금까지 배운 엔진엑스 컨트롤러 설정 절차를 자동화하기
  • 엔진엑스 컨트롤러 ADC 사용 시, 서비스 중인 애플리케이션을 위해 엔진엑스의 웹 애플리케이션 방화벽(WAF) 활성화 하기

17. 실전 운영 팁

  • 부피가 큰 설정 파일을 모듈화된 설정으로 논리적인 그룹을 만들어 정리하기
  • 엔진엑스 서버가 예상치 못한 동작을 할 때 조치하기
profile
우당탕탕 좌충우돌 인프라 여행기

0개의 댓글