원저자: 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 플랫폼에서 독립 게임을 제작할 계획