태그 Archives: apache 2.4

brotli_module 활성화

httpd 에서 2.4.26 버전 이상에서 지원하는 데이터 압축 모듈이다.

deflate_module 의 경우 gzip 압축을 이용하여 데이터 전송을 하고 brotli_module 의 경우 br 으로 압축하여 전송한다.

 

brotli 압축 기술은 구글에서 공개한 압축기술중 속도 위주의 압축기술이다. (gzip 보다 압축률이 20–26% 더 좋다고 한다.)

https://opensource.googleblog.com/2015/09/introducing-brotli-new-compression.html

 

아파치에 mod_brotli 설치는 아래 github 내용을따라 설치할 수 있다.

https://github.com/google/brotli

 

설치가 된 이후에는 아래와 같이 defate 및 brotli 설정을 한다. (https://www.unixadm.org/needful-things/brotli)

설정은 브라우져 지원 여부에 따라 brotli 으로 전송하거나, gzip 전송을 선택하여 전송하게 되며

둘다 지원 못하는 브라우져의 경우 압축되지 않고 전송한다.

 

apache 2.4.27 버전 이상에서 Segmentation fault 오류가 발생.

apache 2.4.26 이하 버전에서 Important 취약점인 CVE-2017-9788, CVE-2017-9789 가 존재 하기 때문에

apache 버전을 최신화 한뒤에 apache error_log 에서 간헐적인 접속 끊김 증상이 확인이 되었다.

Segmentation fault, memory corrupted – core dump 에 의한 apache child 프로세스의 강제 exit 가 된다.

 

이와 같은 경우 메인 프로세스는 살아 있는 상태에서 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

H2MaxWorkers 설정을 1로 할경우 mpm_worker 의 경우 속도 저하가 체감이 될정도 이기 때문에 mpm_event 로 운영을 하도록 한다.

 

mpm 설정은 ……./httpd/conf.modules.d/00-mpm.conf 에 존재 한다.

 

현재 apache 의 mpm 은 아래 명령어로 확인할 수 있다.

 

CentOS6 php-4.3.11 with apache 2.4

먼저 아파치 2.4 및 DB는 사전에 서버 구축이 되어 있다는 가정하에 출발한다 ‘ㅅ’a
php 4.3 혹은 4.4.의 경우 배포툴을 까봤을때 apache 1.x 혹은 apache 2.0.x 와 호환되도록 되어 있다.

 

일반적인 웹서비스를 구성할수 있는 extension 을 포함한 설치 방법이다.

문제점은 아래와 같다. –

CentOS6에 포함된 openssl-1.0.1e , curl 버전 충돌 이난다. 그리고 apache MPM 정상인식 불가에 따른 configure 수정이 필요하다.
shutdown-patch 는 snmp 공격에 의해 error_log 가 난잡해지는것을 방지하는 패치이다

위 패치파일을 받아 패치를 한뒤에 컴파일을 진행한다.

–with-ldap 과 –with-imap 은 포함시 해결이 되지 않아 제거 하였다 ‘ㅅ’a
그다음 아파치 구동을 한다 ‘ㅅ’a

20160615_PicPick_164916

그렇다.. 이 테스트의 목적은 PHP-4.x 기반의 HTTP/2 구현이 주목적…
부가적으로 각종 웹, OS 취약점 등등이 패치된 구형 php가 구동 가능한 서버를 구축할 수 있다.

 

크롬에서의 HTTP/2 사용확인은  아래의 주소를 별도의 탭에 띄워두고 사이트 접속을 하면 현재 유지되는 커넥션의 정보를 확인할 수 있다.
chrome://net-internals/#http2
20160722_PicPick_140008

 

Server Name Indication.

아파치 2.2.12이상 / 아파치 2.4.8 이상 버전에서는 Server Name Indication 를 지원한다.
Server Name Indication은 TLS를 이용한 핸드쉐이크의 확장 기능이라고 보면 되겠다.

몇몇 브라우져 및 기기의 접속 제한이 있지만 이를 무시할 수 있을경우 하나의 서버에서
여러사이트의 SSL(https)를 단일 443 포트로 연결할 수 있다.

 

SNI를 설정할때는 먼저 서버명의 443포트를 먼저 선언해야 고객들의 혼란을 방지 할수 있다.
아파치의 경우 커넥션이 웹서버에 도달했을때 매칭이 되는 가상호스트가 없을경우 최상위에
선언되 버츄얼호스트로 연결한다.( nginx 는 반대로 마지막에 선언된 버츄얼호스트로 작동한다 )

서버 버전이 CentOS 6.5 미만에서는 ca-certificates / nss 업데이트가 필요할 수 있다.

아파치 2.4의 경우 버전을 만족한다면 단순히 443포트로 선언된 여러 가상호스트를 추가하는것만으로 세팅이 완료가 된다.

 

아파치 2.2 버전은 NameVirtualHost 를 선언해야 한다.

위와 같은 세팅만으로 여러 사이트가 443 기본 포트로 ssl 이용이 가능하다.
단  아래 조합은 브라우져에서 SNI 접속 기능이 없기 때문에 접속이 불가능 하다.
Windows XP – 인터넷 익스플로어(모든버전), 사파리
Android 2.3.7(진저브레드)을 포함한 이전 버전
BlackBerry 7.1을 포함한 이전 버전
WindowsMobile 6.5을 포함한 이전 버전
https://en.wikipedia.org/wiki/Server_Name_Indication

 

SNI 는 nginx 0.8.21 이상 / IIS 8.0 이상 역시 지원 한다.

PHP 5.2.17 NTS모드로 설치

일반적으로 php 는 아파치의 설치 옵션(MPM)에 따라 NTS(Non Thread Safety) 모드 혹은 TS(Thread Safety) 모드로 설치가 된다.

php 5.2.x 는 설치할때 버그가 있다 ‘ㅅ’a

* 정확히는 아파치2 (apxs2) 나온시기 보다 이전 버전의 php를 설치할때인듯 하다. *

* 현재 까지 테스트 결과로는 php 5.2.x 를 포함한 이전버전 *

때문에 apache 를 prefork 방식으로 설치하더라도 실제 php 는 TS 모드로 설치가 된다.

 

이는 php extention 설치시 문제를 발생시킨다 (대표적으로 zend optimizer 설치를 진행할경우 인식이 안됨)

때문에 Zend manager 를 이용하여 올리는 방법등이 있다.

 

이유는 다음과 같다 configure 스크립트에서

APXS_MPM=$APXS -q MPM_NAME 으로 아파치의 mpm 을 인식해서 설치 진행을 한다 ‘ㅅ’a

문제는 위와 같이 없는 명령어로 인식해서 아파치가 무엇으로 깔려 있든 TS 모드로 설치 진행이 된다.

(apache 1 버전에서는 당연히 저 명령어로 mpm 구분을 할수 있다.)

 

여기서는 configure 파일을 수정해서 NTS 모드로 설치 진행하기위해 따라할 수 있는 부분이다 ‘ㅅ’aa

php 압축파일 다운로드 를 하시공.

/ 5621번째줄 6469번째줄을 아래와 같이 수정한다 /

 

그후 configure -> make -> make install 로 NTS 모드로 설치가 된다.

설치 이후 확인을 해보는 명령어 ‘ㅅ’aa

 

zend optimizer+ 최신버전인 3.3.9도 정상 동작이 된다 ‘ㅅ’a

 

혹여 아파치 2.4 와 함께 설치할때는 압축해제 후

php-5.2.17/sapi/apache2handler/php_functions.c 파일의

내장 함수 unixd_config 을 ap_unixd_config 으로 수정해야 된다.

386번째 줄에 1개 , 417번째 줄에 3개 가 있다.

 

음 추가로 64bit linux 에서 설치할때에는 아래와 같이 심볼링 링크를 생성해줘야 잘 설치가 된다 ‘ㅅ’a