태그 Archives: apache 2.4

GEOIP database 파일 업데이트

기존 GeoIP 스크립트에서 GeoIP.dat 파일이 0 으로 생성을 하게 되어서 Apache에 에러가 발생 하였다.

에러 메세지는 아래와 같이 /var/log/httpd/error_log 파일과 /var/log/messages 파일 에서 확인 되었다.

 

내용 확인 결과 maxmind 에서 배포 되는 csv 파일이 2024년 5월 1일 부로 S3 presigned 를 이용하여 배포 하는 형태로 바뀐것으로 확인이 되었다.

오랜만에 maxmind 사이트에 로그인을 해보니 라이선스 키 길이도 바뀌어서 같이 바꾸는게 좋겠다. 🙂

중간에 주석 처리된 3줄은 python2를 사용하는 서버(centos 7 이하)에서는 주석을 제거 하고 사용해야  한다.

 

몇가지 로직 개선 및 mmdb 파일까지 갱신 하도록 geoipupdate 명령을 중간에 실행 하도록 하였다.

때문에 /etc/GeoIP.conf 파일에 자신의 어카운트 및 라이선스키를 넣어줘야 한다.

그냥 사용 할경우 www.enteroa.com 에서 생성하고 재배포 하는 파일을 다운 받아 사용 한다.

자신의 서버에서 스스로 dat파일을 생성 하고 싶을 경우 Maxmind_Licensekey 부분과 PRIMARY_SERVER_HOSTNAME 부분 또 PRIMARY_DEPLOY_URL 부분을 수정 해서 사용해야 한다.

 

라이선스키 발급 방법은 같기 때문에 maxmind 에서 라이선스 발급을 원하면 아래 역인글을 확인 한다.

역인글 : GEOIP database …

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 이상 역시 지원 한다.