본문 바로가기
기타/nginx

Nginx Performance

by oneny 2023. 9. 30.

Headers & Expires

HTTP 헤더는 클라이언트와 서버 간에 전송되는 메타 정보를 포함하는 텍스트 데이터이다. Nginx를 사용하면 헤더를 수정하고 조작하여 웹 페이지의 동작을 제어할 수 있다. add_header 지시문을 통해 HTTP 헤더에 보안 헤더를 추가하거나 커스텀 헤더를 생성해서 추가할 수 있다.

 

위를 보면 /style.css 경로로 요청하면 커스텀 헤더를 생성해 추가한 것을 확인할 수 있다.

 

정적 파일 요청

  • add_header Cache-Control public: Cache-Control HTTP 헤더를 설정하여 므라우저 및 캐시 서버에 리소스를 공개 캐시로 저장할 것을 지시한다. 이렇게 설정하면 클라이언트 및 중간 프록시 서버에서 캐시로 저장하고 재사용할 수 있다.
  • add_header Pragma public: Pragma 헤더를 설정하여 캐싱을 지원하는 공개적인 리소스임을 나타낸다. 이는 오래된 HTTP/1.0 호환성을 위한 것이며, Cache-Control 헤더와 함께 사용하는 것이 좋다.
  • add_header Vary Accept-Encoding: Vary 헤더를 설정하여 리소스의 캐싱을 요청 헤더 Accept-Encoding에 따라 다르게 하도록 지시한다. 이렇게 하면 클라이언트가 서로 다른 압축 방식을 지원하는 경우에도 올바르게 동작한다.
  • expires 1M: 리소스(이미지, 스타일 시트, 스크립트 등)의 캐시 만료 시간을 설정한다. 여기서 1개월(30일)동안 캐시를 유지하도록 설정되어 있다. 이 기간 동안 클라이언트는 동일한 스타일 스티 파일을 다시 서버에서 요청하지 않고 로컬 캐시를 사용할 수 있다.

 

Compressed Responses with gzip

Nginx 웹 서버는 gzip을 통해 HTTP 응답 데이터를 압축하여 전송할 수 있다. 이를 통해 클라이언트와 웹 서버 간의 데이터 전송 효율성을 향상시키고 대역폭을 절약할 수 있다.

 

gzip 설정

  • gzip: gzip 압축 모듈을 활성화한다. 일반적으로 Nginx는 gzip 모듈을 기본적으로 포함하고 있다. 따라서 gzip on;으로 모듈을 활성화할 수 있다.
  • gzip_comp_level: gzip 압축 레벨을 설정한다. 기본적으로는 압축 레벨이 6으로 설정되어 있고, 높은 압축 레벨은 더 작은 파일 크기를 제공하지만 CPU 사용량이 늘어날 수 있다.
  • gzip_types: gzip 압축을 적용할 리소스의 종류를 지정한다. 기본적으로 텍스트 및 일부 압축 가능한 파일 유형이 포함되어 있지만 필요한 경우 추가 파일 유형을 명시적으로 지정할 수 있다.

 

결과 비교하기

HTTP 요청 헤더에 -H "Accept-Encoding: gzip, deflate"를 추가하여 서버에게 클라이언트가 gzip 또는 deflate 압축을 지원하고 해당 방식으로 응답을 받고 싶다는 것을 알릴 수 있다. > style.min.css를 통해 헤더 정보를 받은 후, 해당 정보를 style.min.css 파일에 저장할 수 있다.

/sites/demo/style.css 경로에 있는 파일이 h1 { color: #87ceeb; } 내용 밖에 없다보니 오히려 gzip을 사용하는 것이 비효율적인 것으로 나오긴 했다. 그리고 그 안에 내용을 살펴보면 style.css는 그대로 받고, style.min.css는 압축된 형태로 온 것을 확인할 수 있다.

 

HTTP2

HTTP/2(또는 HTTP 2.0)는 HTTP 프로토콜의 개선된 버전으로, Nginx와 같은 웹 서버에서 지원되면 웹 페이지의 성능을 향상시키는데 도움이 되는 다양한 기능을 제공한다. 이전 버전인 HTTP/1.1과 비교하여 네 가지 주요 기능을 제공할 수 있다.

  1. Binary Protocol(이진 프로토콜)
    HTTP/2는 텍스트 기반인 HTTP/1.1과는 달리 이진 프로토콜을 사용한다. 이진 프로토콜은 헤더와 데이터를 이진 형식으로 인코딩하므로 더 효율적으로 전송할 수 있다. 이렇게 하면 데이터 전송량을 줄이고 네트워크 대역폭을 절약할 수 있다.
  2. Compressed Headers(헤더 압축)
    HTTP/2에서는 헤더 필드를 HPACK 압축 알고리즘을 사용하여 압축한다. 이로써 헤더의 크기가 크게 감소하고, 작은 패킷으로 헤더를 전송할 수 있다. 헤더 압축은 네트워크 대역폭을 크게 절약하고 더 빠른 페이지 로딩을 가능하게 한다.
  3. Persistent Connections(지속적인 연결)
    HTTP/2는 하나의 TCP 연결을 사용하여 HTTP/1.1에서 사용되던 여러 TCP 연결을 줄일 수 있다. 이러한 지속적인 연결은 TCP 연결을 설정하고 해제하는 오버헤드를 줄이고 더 빠른 페이지 로딩을 가능하게 한다.
  4. Multiplex Streaming(다중 스트림)
    HTTP/2는 다중 스트림을 지원하여 여러 요청 및 응답을 동시에 처리할 수 있다. 이로써 여러 리소스를 병렬로 다운로드할 때 개선된 성능을 제공하며 웹 페이지 로딩 시간을 줄일 수 있다.
  5. Server Push(서버 푸시)
    HTTP/2는 서버 푸시 기능을 제공한다. 이 기능을 사용하면 클라이언트가 요청하지 않은 리소스를 서버가 미리 보낼 수 있다. 예를 들어, 웹 페이지에 필요한 CSS 파일을 클라이언트가 요청하기 전에 서버에서 미리 전송하여 페이지 로딩 시간을 단축할 수 있다.

 

 

--with-http_v2_module 옵션을 추가하여 HTTP2 관련 모듈을 추가한다. make install까지 잘되었으면 sudo nginx -V를 통해 옵션이 잘 추가된 것을 확인할 수 있다.

 

 

현재는 HTTP/1.1 Version인 것을 확인할 수 있다.

 

SSL 인증서 및 개인키 생성

위 명령어는 OpenSSL을 사용하여 자체 서명된 SSL 인증서와 개인 키를 생성하는 명령어이다.

  • -x509: X.509 표준 형식의 SSL 인증서를 생성하도록 지시한다.
  • -days 10: 인증서의 유효 기간을 10일로 설정한다. 실제로 사용할 때는 더 긴 기간을 설정해야 한다.
  • -nodes: 개인 키를 암호화하지 않도록 지시한다. 이것은 개인 키를 암호화하지 않은 채로 저장하므로 시스템에 접근하는 누구나 해당 개인키를 사용할 수 있다.
  • -newkey rsa:2048: 2048비트의 RSA 개인키를 생성하도록 지시한다.
  • -keyout /etc/nginx/ssl/self.key: 생성된 개인키를 지정한 경로에 저장한다.
  • -out /etc/nginx/ssl/self.crt: 생성된 SSL 인증서를 지정한 경로에 저장한다. 

 

설정 파일 수정

443포트를 사용하여 HTTPS 연결을 하고, ssl과 http2 모듈을 활성화하여 HTTPS 및 HTTP/2를 사용하여 통신할 수 있도록 한다. 그리고 아래 ssl_certificate /etc/nginx/ssl/self.crt; ssl_certificate_key /etc/nginx/ssl/self.key; 지시문을 통해 SSL 인증서 파일의 경로와 SSL 개인키 파일의 경로를 지정하여 HTTPS 연결을 설정할 때 사용하도록 한다.

 

결과

HTTP/2로 응답하는 것을 확인할 수 있다.

 

 

출처

NGINX Fundamentals: High Performance Servers from Scratch

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'기타 > nginx' 카테고리의 다른 글

Reverse Proxy & Load Balancing  (1) 2023.10.01
Nginx Configuration (2/2)  (0) 2023.09.30
Nginx Configuration (1/2)  (0) 2023.09.29
소스코드로 Nginx 시작하기  (0) 2023.09.28