NGINX 오픈 소스 버전을 다시 시작하지 않고도 SSL/TLS 인증서 순환을 달성할 수 있습니다.

원저자: F5의 Maxim Ivanitskiy

원본 링크: NGINX 오픈 소스 버전을 다시 시작하지 않고도 SSL/TLS 인증서 순환이 가능합니다.

재판 소스: NGINX 오픈 소스 커뮤니티


NGINX의 유일한 공식 중국어 커뮤니티(모두 nginx.org.cn) 

고성능 웹 서버 세계에서 NGINX는  가볍고 효율적인 아키텍처를 통해 많은 양의 트래픽을 처리할 수 있기 때문에 인기 있는 선택입니다.  NGINX JavaScript 모듈(njs) 에 공유 사전 기능을 도입 함으로써 NGINX의 성능이 한 단계 향상되었습니다.

이 기사에서는 njs 공유 사전의 기능과 이점을 살펴보고 다시 시작하지 않고 SSL/TLS 인증서를 회전하도록 NGINX 오픈 소스를 설정하는 방법을 보여줍니다.

공유 사전 소개 및 장점

새로운 지시문을 통해 NGINX 오픈 소스 사용자는 공유 메모리 영역을 활성화하여 작업자 프로세스 간에 데이터를 효율적으로 교환할 수 있습니다. 이러한 공유 메모리 영역은 실시간으로 액세스하고 수정할 수 있는 동적 구성 설정을 저장하는 키-값 사전 역할을 합니다. js_shared_dict_zone 

공유 사전의 주요 장점은 다음과 같습니다.

  • 최소한의 오버헤드 및 사용 용이성 –  njs에 직접 내장되어 직관적인 API와 간단한 구현 덕분에 구성 및 사용이 쉽습니다. 또한 작업자 프로세스 간 데이터 관리 및 공유를 단순화하는 데 도움이 됩니다.
  • 가볍고 효율적입니다.  NGINX와 원활하게 통합되어 이벤트 중심의 비차단 I/O 모델을 활용합니다. 이 방법은 메모리 사용량을 줄이고 동시 처리 기능을 향상시켜 NGINX가 많은 수의 동시 연결을 효율적으로 처리할 수 있도록 해줍니다.
  • 확장성 –  여러 작업자 프로세스에 걸쳐 수평으로 확장할 수 있는 NGINX의 기능을 사용하면 복잡한 프로세스 간 통신 메커니즘 없이도 이러한 프로세스 간에 데이터를 공유하고 동기화할 수 있습니다. TTL(Time-to-Live) 설정을 사용하면 공유 사전 항목의 레코드를 관리하고 영역에서 비활성 항목을 제거할 수 있습니다. evict 매개변수는 가장 오래된 키-값 쌍을 삭제하여 새 항목을 위한 공간을 만듭니다.

공유 사전을 사용한 SSL 순환

공유 사전의 가장 효과적인 사용 사례 중 하나는 SSL/TLS 순환입니다. 사용 하면 NGINX를 다시 시작하지 않고도 SSL/TLS 인증서 또는 키를 업데이트할 수 있습니다. 또한 NGINX에서 인증서를 관리하기 위한 REST와 유사한 API를 제공합니다. js_shared_dict_zone 

다음은 및 지시어를 사용하여 HTTPS 서버를 설정하는 NGINX 구성 파일의 예입니다 . 파일에서 SSL/TLS 인증서 또는 키를 읽는 JavaScript 처리기입니다 . js_set  ssl_certificate  js_set 

이 구성 조각은 공유 사전을 사용하여 인증서와 키를 공유 메모리에 캐시로 저장합니다. 키가 없으면 디스크에서 인증서나 키를 읽어 캐시에 저장합니다.

캐시를 수동으로 지우는 위치를 노출할 수도 있습니다. 디스크의 파일이 업데이트되면(예: 인증서 및 키 업데이트) 공유 사전은 디스크에서 이러한 업데이트를 읽습니다. 이 조정을 통해 NGINX 프로세스를 다시 시작하지 않고도 인증서/키 순환이 가능해졌습니다.

http {
     ...
    js_shared_dict_zone zone=kv:1m;
   

    server {
     # Sets an njs function for the variable. Returns a value of cert/key
      js_set $dynamic_ssl_cert main.js_cert;
      js_set $dynamic_ssl_key main.js_key;
   

      # use variable's data
      ssl_certificate data:$dynamic_ssl_cert;
      ssl_certificate_key data:$dynamic_ssl_key;
     

     # a location to clear cache 
   location = /clear {
      js_content main.clear_cache;
      # allow 127.0.0.1;
      # deny all;
    }
  ...
  }

다음은 순환 SSL/TLS 인증서 및 키를 사용하는 JavaScript 구현입니다. js_shared_dict_zone 

function js_cert(r) {

  if (r.variables['ssl_server_name']) {
    return read_cert_or_key(r, '.cert.pem');
  } else {
    return '';
  }
}

function js_key(r) {
  if (r.variables['ssl_server_name']) {
    return read_cert_or_key(r, '.key.pem');
  } else {
    return '';
  }
}
/** 
   * Retrieves the key/cert value from Shared memory or fallback to disk
   */
  function read_cert_or_key(r, fileExtension) {
    let data = '';
    let path = '';
    const zone = 'kv';
    let certName = r.variables.ssl_server_name;
    let prefix =  '/etc/nginx/certs/';
    path = prefix + certName + fileExtension;
    r.log('Resolving ${path}');
    const key = ['certs', path].join(':');
    const cache = zone && ngx.shared && ngx.shared[zone];
   

    if (cache) {
    data = cache.get(key) || '';
    if (data) {
      r.log(`Read ${key} from cache`);
      return data;
    }
  }
  try {
    data = fs.readFileSync(path, 'utf8');
    r.log('Read from cache');
  } catch (e) {
    data = '';
    r.log(`Error reading from file:${path}. Error=${e}`);
  }
  if (cache && data) {
    try {
      cache.set(key, data);
      r.log('Persisted in cache');
    } catch (e) {
      const errMsg = `Error writing to shared dict zone: ${zone}. Error=${e}`;
      r.log(errMsg);
    }
  }

  return data
}

다음 SSL/TLS 핸드셰이크 중에 NGINX가 SSL/TLS 인증서나 키를 디스크에서 로드하도록 요청을 보내 캐시를 무효화할 수 있습니다 . 또한 캐시를 유지하고 업데이트하는 동안 요청에서 SSL/TLS 인증서 또는 키를 얻는 데 사용할 수 있습니다 . /clear  js_content 

이 예제의 전체 코드는  njs GitHub 저장소 에서 찾을 수 있습니다 .

즉시 시작하다

공유 사전 기능은 단순성과 확장성 측면에서 상당한 이점을 제공하는 강력한 애플리케이션 프로그래밍 도구입니다. 기능을 통해 새로운 성장 기회를 발견하고 증가하는 트래픽 수요를 효율적으로 처리할 수 있습니다. js_shared_dict_zone 

NGINX 배포 속도를 높일 준비가 되셨나요 ? NGINX 배포를 업그레이드하여 새로운 사용 사례를 활용할 수 있습니다 . 이 기능에 대한 자세한 내용은 설명서 를 참조하세요 . 또한 최근 출시된 njs-acme 프로젝트 에서 공유 사전 기능의 전체 예를 볼 수 있습니다 . 이를 통해 njs 모듈 런타임이 ACME 공급자와 작동할 수 있습니다. js_shared_dict_zone  js_shared_dict_zone  

NGINX 오픈 소스 버전에 관심이 있거나 질문이 있는 경우 WeChat(WeChat ID: nginxoss)에 Xiao N Assistant를 추가하여 NGINX 공식 WeChat 그룹에 가입하여 NGINX에 대해 자세히 알아보고 질문하고 피드백을 받을 수 있습니다. 오픈 소스 버전.


NGINX의 유일한 공식 중국어 커뮤니티(모두  nginx.org.cn)

더 많은 NGINX 관련 기술 정보, 대화형 Q&A, 일련의 강좌 및 이벤트 리소스:  오픈 소스 커뮤니티 공식 웹사이트 WeChat 공식 계정  | 

1990년대에 태어난 프로그래머가 비디오 포팅 소프트웨어를 개발하여 1년도 안 되어 700만 개 이상의 수익을 올렸습니다. 결말은 매우 처참했습니다! 고등학생들이 성인식으로 자신만의 오픈소스 프로그래밍 언어 만든다 - 네티즌 날카로운 지적: 만연한 사기로 러스트데스크 의존, 가사 서비스 타오바오(taobao.com)가 가사 서비스를 중단하고 웹 버전 최적화 작업 재개 자바 17은 가장 일반적으로 사용되는 Java LTS 버전입니다. Windows 10 시장 점유율 70%에 도달, Windows 11은 계속해서 Open Source Daily를 지원합니다. Google은 Docker가 지원하는 오픈 소스 Rabbit R1을 지원합니다. Electric, 개방형 플랫폼 종료 Apple, M4 칩 출시 Google, Android 범용 커널(ACK) 삭제 RISC-V 아키텍처 지원 Yunfeng은 Alibaba에서 사임하고 향후 Windows 플랫폼에서 독립 게임을 제작할 계획
{{o.이름}}
{{이름}}

추천

출처my.oschina.net/u/5246775/blog/11102086