apache 2.4.26 이하 버전에서 Important 취약점인 CVE-2017-9788, CVE-2017-9789 가 존재 하기 때문에
apache 버전을 최신화 한뒤에 apache error_log 에서 간헐적인 접속 끊김 증상이 확인이 되었다.
Segmentation fault, memory corrupted – core dump 에 의한 apache child 프로세스의 강제 exit 가 된다.
1 2 3 |
[Wed Mar 27 15:03:41.085336 2019] [core:notice] [pid 3936:tid 139993855101120] AH00051: child pid 31653 exit signal Aborted (6) [Wed Mar 27 15:38:24.149597 2019] [core:notice] [pid 3936:tid 139993855101120] AH00051: child pid 32428 exit signal Segmentation fault (11) |
이와 같은 경우 메인 프로세스는 살아 있는 상태에서 child 가 죽는 현상이다 보니 실제 apache 는 설정에 따라
부족한 child 프로세스를 다시 생성하기 때문에 발생하고 있지만 모르고 있을 수 있다. – apache – error_log 를 꼭 점검해봐야 한다.
내용 추적이 되지 않아 한동안 고생을 하다가 이 에러가 특정한 상황에서만 발생하는것을 확인하였다.
조건1. https 프로토콜 사용
조건2. http/2 사용
조건3. mpm_worker 혹은 mpm_event 사용 (event 에서 더 심하게 발생함.)
조건4. mod_php 사용
기존에 apache 2.4.27 부터 worker 가 기본 mpm 이 되었고,
어떤 버전인지 부터는 모르지만 최신 버전의 2.4.38 버전은 event mpm 이 기본값으로 설정이 된다.
이를 prefork 방식으로 변경해서 운영을 해도 되지만 이럴 경우 http/2 는 지원이 되지 않는다.
기본이 event mpm 일 경우 권장 되는 운영 환경은 apache 2.4 – fcgi_proxy – php-fpm 구조이다.
다만 php-fpm 의 경우 tomcat 처럼 별도의 WAS 환경이기 때문에 익숙치 않고 설정법을 새롭게 배워야 하는 단점이 존재 한다.
변경을 하는것은 맞는 방향이겠지만 이는 충분한 시간이 주어져야 한다는 단점이 존재한다.
하지만 서버는 당장에 문제가 발생하고 있기 때문에..
때문에 임시 방편으로 아래와 같은 설정(H2MaxWorkers)을 추가 하여 오류를 방지 하고 시간을 벌도록 한다. ‘ㅅ’a
1 2 3 4 5 |
<IfModule http2_module> ProtocolsHonorOrder On Protocols h2 h2c http/1.1 H2MaxWorkers 1 </IfModule> |
H2MaxWorkers 설정을 1로 할경우 mpm_worker 의 경우 속도 저하가 체감이 될정도 이기 때문에 mpm_event 로 운영을 하도록 한다.
mpm 설정은 ……./httpd/conf.modules.d/00-mpm.conf 에 존재 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# Select the MPM module which should be used by uncommenting exactly # one of the following LoadModule lines. See the httpd.service(8) man # page for more information on changing the MPM. # prefork MPM: Implements a non-threaded, pre-forking web server # See: http://httpd.apache.org/docs/2.4/mod/prefork.html # # NOTE: If enabling prefork, the httpd_graceful_shutdown SELinux # boolean should be enabled, to allow graceful stop/shutdown. # #LoadModule mpm_prefork_module modules/mod_mpm_prefork.so # worker MPM: Multi-Processing Module implementing a hybrid # multi-threaded multi-process web server # See: http://httpd.apache.org/docs/2.4/mod/worker.html # #LoadModule mpm_worker_module modules/mod_mpm_worker.so # event MPM: A variant of the worker MPM with the goal of consuming # threads only for connections with active processing # See: http://httpd.apache.org/docs/2.4/mod/event.html # LoadModule mpm_event_module modules/mod_mpm_event.so |
현재 apache 의 mpm 은 아래 명령어로 확인할 수 있다.
1 2 3 4 5 6 7 8 |
~]# httpd -V Server version: Apache/2.4.38 Server loaded: APR 1.5.2, APR-UTIL 1.5.2 Compiled using: APR 1.5.2, APR-UTIL 1.5.2 Architecture: 64-bit Server MPM: event threaded: yes (fixed thread count) forked: yes (variable process count) |