블로그 | NGINX

실패한 NGINX Plus 업그레이드에서 복구: '모듈 "M" 버전 X(Y 대신)'

NGINX-F5-수평-검정-유형-RGB의 일부
리엄 크릴리 썸네일
리암 크릴리
2017년 3월 14일 게시

동적 모듈을 사용하는 경우 새로운 NGINX 또는 NGINX Plus 릴리스로 업그레이드하는 동안 다음과 같은 오류가 표시될 수 있습니다.

nginx-plus(1.11.10-1~xenial) 설정 중... nginx: [emerg] 모듈 "/etc/nginx/modules/ngx_http_geoip_module.so" 버전이 /etc/nginx/nginx.conf:7에 1011006 대신 1011005로 설정 되어 있습니다. nginx: 구성 파일 /etc/nginx/nginx.conf 테스트에 실패했습니다. invoke-rc.d: nginx 초기화 스크립트, "업그레이드" 작업이 실패했습니다.

가장 가능성 있는 이유는 지정된 동적 모듈( .so 파일)을 업그레이드하지 않았기 때문입니다.

  • NGINX 오픈 소스를 실행하고 있다면, 업그레이드하려는 버전에 맞게 동적 모듈을 컴파일해야 합니다.
  • NGINX Plus를 실행 중이라면 업그레이드하려는 NGINX Plus 릴리스에 해당하는 NGINX 오픈 소스 버전에 맞춰 동적 모듈을 컴파일해야 합니다.

간결함을 위해 지금부터는 NGINX Plus라고만 언급하겠습니다.

당황하지 말 것!

이 오류 메시지는 NGINX Plus 서버가 다운되었다는 것을 나타내지 않으므로 안심하십시오. NGINX Plus 업그레이드는 원활하게 진행되므로 업그레이드가 실패해도 이전 버전은 계속 실행됩니다. 그러나 업그레이드가 완료되지 않았고 시스템 상태가 일관되지 않습니다.

  • 메모리의 NGINX Plus 프로세스는 이전 버전을 실행 중입니다.
  • NGINX Plus와 관련된 디스크의 모든 파일은 새 버전과 일치합니다.
  • 오류 메시지에 언급된 동적 모듈은 이전 버전에 대해 컴파일되었습니다.

nginx를 수동으로 다시 시작하거나 시스템을 재부팅하지 마세요. 그렇게 하면 새로운 NGINX Plus 릴리스와 동기화되지 않은 동적 모듈이 있는 동안은 새로운 NGINX Plus 프로세스를 시작할 수 없어서 다운타임이 발생합니다.

오류 메시지는 업그레이드 과정에서 발견된 첫 번째 호환되지 않는 모듈에만 해당하므로, 구성에서 모든 load_module 지시어를 찾아 모든 모듈이 적절한 NGINX 버전에 맞게 컴파일되었는지 확인하는 것이 중요합니다. 모든 NGINX에서 작성하고 인증한 모든 타사 동적 모듈 의 올바른 버전이 각 NGINX Plus 릴리스에 제공되므로 인증되지 않은 모듈만 다시 컴파일하면 됩니다. 이 문서에서는 업그레이드 프로세스를 안전하게 완료하는 방법을 설명합니다.

무엇이 잘못되었을까?

NGINX 1.11.5와 NGINX Plus R11은 NGINX 오픈 소스에 대해 동적 모듈을 컴파일하고 이를 NGINX Plus에 로드하는 기능을 도입했습니다. 이러한 바이너리 호환성을 위해서는 모듈과 NGINX Plus가 동일한 기본 오픈 소스 버전을 공유해야 합니다. 이러한 버전 불일치로 인해 해당 NGINX 오픈 소스 버전에 맞춰 빌드된 동적 모듈을 먼저 설치하지 않고 NGINX Plus를 업그레이드하면 실패합니다.

타사 공급업체에서 동적 모듈을 제공한 경우 업그레이드하려는 NGINX Plus 릴리스에 맞는 NGINX 버전에 맞춰 새 버전을 받으려면 공급업체에 문의해야 합니다. 동적 모듈이 소스에서 컴파일된 경우(그리고 소스에 접근할 수 있는 경우) 계속 읽어보세요.

회복으로 가는 길

0단계: 빌드 환경 준비

우리는 여러분이 별도의 시스템, 즉 "빌드 환경"에서 동적 모듈을 컴파일할 것을 강력히 권장합니다. 그렇게 하면 동적 모듈로 NGINX Plus를 실행하는 시스템의 위험과 복잡성이 최소화됩니다(이를 "프로덕션 환경"이라고 합니다). 빌드 환경은 프로덕션 환경과 동일한 운영 체제 및 버전을 가져야 합니다 . 또한 다음 구성 요소를 설치해야 합니다.

  • 압축 해제 유틸리티
  • 컴파일러와 유틸리티 만들기
  • Perl 호환 정규 표현식 라이브러리(개발 파일)
  • Zlib 압축 라이브러리(개발 파일)

빌드 환경에 이러한 필수 구성 요소가 설치되어 있는지 확인하려면 다음 명령을 실행하세요.

  • Ubuntu/Debian의 경우:

    buildenv$ sudo apt-get install unzip gcc make libpcre3-dev zlib1g-dev
  • CentOS/RHEL/Oracle Linux의 경우:

    buildenv$ sudo yum install unzip gcc make pcre-devel zlib-devel

1단계: NGINX 오픈소스 얻기

  1. 프로덕션 환경에서 작업하는 경우 다음 명령을 실행하여 실행 중인 NGINX Plus 릴리스에 해당하는 NGINX 오픈 소스 버전을 식별합니다. 이 출력에서는 주황색으로 강조 표시됩니다. NGINX Plus R12에 해당하는 NGINX 1.11.10입니다.

    production$ nginx -v nginx 버전: nginx/ 1.11.10 (nginx-plus-r12)
  2. 빌드 환경에서 작업하여 적절한 NGINX 오픈 소스 버전에 대한 소스를 다운로드하세요.

    빌드-환경$ wget -qO - http://nginx.org/download/nginx-1.11.10 .tar.gz | tar zxfv -

2단계: 동적 모듈 소스 얻기

원하는 빌드 디렉토리에 동적 모듈의 소스 코드를 복사합니다. 여기서는 GitHub 저장소에서 샘플 NGINX "hello world" 모듈을 복사합니다.

buildenv$ git clone https://github.com/perusio/nginx-hello-world-module.git 'nginx-hello-world-module'에 복제 중...

3단계: 동적 모듈 컴파일

  1. 먼저 --with-compat 인수와 함께 NGINX 구성 스크립트를 실행하여 동적 모듈을 컴파일하고, 이를 통해 동적 모듈을 NGINX Plus와 바이너리 호환 가능하게 만듭니다. 그런 다음 make modules를 실행하여 모듈만 컴파일합니다.

    buildenv$ cd nginx-1.11.10/ buildenv$ ./configure --with-compat --add-dynamic-module=../nginx-hello-world-module buildenv$ 모듈을 만듭니다.
  2. 빌드 프로세스에서 동적 모듈이 objs 하위 디렉터리에 .so 파일로 생성되었는지 확인합니다.

    buildenv$ ls objs/*.so objs/ngx_http_hello_world.so
  3. 파일 이름에 NGINX 오픈 소스 버전을 추가하여 모듈 파일의 사본을 만듭니다. 이를 통해 운영 환경에서 동적 모듈의 여러 버전을 관리하는 것이 더 간편해집니다.

    buildenv$ cp objs/ngx_http_hello_world.so ./ngx_http_hello_world_1.11.10.so

4단계: 동적 모듈을 프로덕션 환경으로 복사

파일 이름에 NGINX 오픈 소스 버전을 포함하여 동적 모듈을 만들었기 때문에 작업에 영향을 주지 않고 안전하게 프로덕션 환경에 복사할 수 있습니다.

buildenv$ scp ./ngx_http_hello_world_1.11.10.so 프로덕션:/etc/nginx/modules

5단계: 동적 모듈 교체

프로덕션 환경에서 작업하는 경우 현재 .so 파일을 새 .so 파일로 바꿔 넣습니다. 이 시점에서 이 작업을 하는 것이 안전한 이유는 동적 모듈이 nginx를 재시작하거나 구성을 다시 로드할 때만 메모리에 로드되기 때문입니다.

프로덕션$ cd /etc/nginx/modules 프로덕션$ cp ngx_http_hello_world.so ngx_http_hello_world_ROLLBACK.so 프로덕션$ ln -fs ngx_http_hello_world_1.11.10.so ngx_http_hello_world.so 프로덕션$ ls -gG -rw-r--r-- 1 243576 1월 31일 16:18 ngx_http_hello_world_1.11.10.so -rw-r--r-- 1 243576 10월 20일 10:40 ngx_http_hello_world_ROLLBACK.so lrwxrwxrwx 1 24 1월 31일 16:26 ngx_http_hello_world.so -> ngx_http_hello_world_1.11.10.so

6단계: NGINX Plus 업그레이드 완료

  1. 다음 명령을 실행하여 모듈 버전이 올바른지, NGINX Plus가 업그레이드 프로세스를 완료할 준비가 되었는지 테스트합니다.

    production$ nginx -t nginx: 설정 파일 /etc/nginx/nginx.conf 구문은 정상입니다 nginx: 설정 파일 /etc/nginx/nginx.conf 테스트가 성공했습니다
  2. NGINX Plus가 새로운 릴리스와 동적 모듈을 사용할 수 있도록 업그레이드 프로세스를 완료합니다.

    production$ service nginx upgrade 새로운 마스터 nginx 시작: [ OK ] 이전 nginx의 정상적인 종료: [ OK ]

업그레이드 실패 방지

다음에 NGINX Plus를 업그레이드할 때는 업그레이드 전에 이러한 지침을 따르면 시간을 절약하고 오류를 피할 수 있습니다. 이렇게 하면 업그레이드 프로세스를 시작할 때 업데이트된 동적 모듈을 이미 사용할 수 있습니다.


"이 블로그 게시물에는 더 이상 사용할 수 없거나 더 이상 지원되지 않는 제품이 참조될 수 있습니다. 사용 가능한 F5 NGINX 제품과 솔루션에 대한 최신 정보를 보려면 NGINX 제품군을 살펴보세요. NGINX는 이제 F5의 일부가 되었습니다. 이전의 모든 NGINX.com 링크는 F5.com의 유사한 NGINX 콘텐츠로 리디렉션됩니다."