기존 GeoIP 스크립트에서 GeoIP.dat 파일이 0 으로 생성을 하게 되어서 Apache에 에러가 발생 하였다.
에러 메세지는 아래와 같이 /var/log/httpd/error_log 파일과 /var/log/messages 파일 에서 확인 되었다.
| 1 | [Thu May 02 06:48:37.814899 2024] [core:notice] [pid 12595] AH00052: child pid 2007 exit signal Segmentation fault (11) | 
| 1 | May  2 08:29:33 ip-172-31-20-41 kernel: httpd[19203]: segfault at 7faee440d6c6 ip 00007faecc87dcf8 sp 00007faeb8c69b30 error 4 in libGeoIP.so.1.5.0[7faecc876000+2e000] | 
내용 확인 결과 maxmind 에서 배포 되는 csv 파일이 2024년 5월 1일 부로 S3 presigned 를 이용하여 배포 하는 형태로 바뀐것으로 확인이 되었다.
오랜만에 maxmind 사이트에 로그인을 해보니 라이선스 키 길이도 바뀌어서 같이 바꾸는게 좋겠다. 🙂
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | #!/bin/bash ###################################################################################### # CRON => 00  06  *  *  *  bash /usr/share/GeoIP/geoip_dat_update_from_geolite2-csv.sh # #                                        2024-05-02 by Enteroa ( enteroa.j@gmail.com ) ###################################################################################### Maxmind_Licensekey=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ### config - DISABLE city it'll be need free memory 2GB CITYDATA="N" PRIMARY_SERVER_HOSTNAME="배포서버호스트네임" PRIMARY_DEPLOY_URL="https://www.enteroa.com" ### geoip setting GEOIPDIR="/usr/share/GeoIP" DATALINK="/usr/share/xt_geoip /var/lib/GeoIP" ### avoid overlap lockfile=/var/lock/$(basename $0) if [ -f $lockfile ];then P=$(cat $lockfile)   if [ -n "$(ps --no-headers -f $P)" ];then exit 1 fi;fi echo $$ > $lockfile trap 'rm -f "$lockfile"' EXIT ### define server are primary or secandary. if [[ "$HOSTNAME" != "$PRIMARY_SERVER_HOSTNAME" ]];then   ### download GeoIP.dat file from Primary-server   cd $GEOIPDIR   if [ ! -e $GEOIPDIR/GeoIP.dat ];then touch $GEOIPDIR/GeoIP.dat;fi   PRI_DATA=$(curl -sI "$PRIMARY_DEPLOY_URL/GeoIP-dat.tgz")   PRI_DATE=$(date +"%Y%m%d%H%M" -d "$(grep -i ^Last-Modified: <<< "$PRI_DATA" | cut -d, -f2)")   SLV_DATE=$(date +"%Y%m%d%H%M" -d "$(stat -c %y $GEOIPDIR/GeoIP.dat)")   if [[ "$PRI_DATE" != "$SLV_DATE" ]];then     curl -k -L $PRIMARY_DEPLOY_URL/GeoIP-dat.tgz -o GeoIP-dat.tgz >/dev/null 2>&1     if [ -s GeoIP-dat.tgz ] || [[ $(stat -c %s GeoIP-dat.tgz) -le 10000 ]];then       tar xfzp GeoIP-dat.tgz     fi     rm -f GeoIP-dat.tgz   fi else   ### install dependances   if [[ -z $(which git) ]];then                               sudo yum -y install git > /dev/null 2>&1        ;fi # if [[ -z $(which pip2) ]];then                              sudo yum -y install python2-pip > /dev/null 2>&1;fi # if [[ -z $(pip2 list --format=legacy| grep pygeoip) ]];then sudo pip2 install pygeoip > /dev/null 2>&1      ;fi # if [[ -z $(pip2 list --format=legacy| grep ipaddr) ]];then  sudo pip2 install ipaddr > /dev/null 2>&1       ;fi   ### link path   if [[ ! -d $GEOIPDIR ]];then mkdir -p $GEOIPDIR;fi   for a in $DATALINK     do     if [[ ! -d $a ]];then       if [[ $(readlink $a) != $GEOIPDIR ]];then         rm -rf $a;ln -s $GEOIPDIR $a     fi;fi     done   ### https://github.com/sherpya/geolite2legacy   if [ ! -e $GEOIPDIR/geolite2legacy/geolite2legacy.py ];then cd $GEOIPDIR     cd $GEOIPDIR && git clone https://github.com/sherpya/geolite2legacy.git   fi   ### make GeoIP.dat files from GeoLite2 CSV file.   if [ -d $GEOIPDIR/geolite2legacy ];then     cd $GEOIPDIR/geolite2legacy     array=( GeoLite2-Country-CSV:zip )     if [[ $CITYDATA == "Y" ]];then       array=( ${array[*]} GeoLite2-City-CSV:zip )     fi     for b in ${array[@]}       do       COF=$(cut -d: -f1 <<< $b)       EXT=$(cut -d: -f2 <<< $b)       BASEURL="https://download.maxmind.com/app/geoip_download?edition_id=$COF&license_key=$Maxmind_Licensekey&suffix=$EXT"       DATE_ORI=$(date +"%Y%m%d%H%M.%S" -d "$(curl -sI $BASEURL|grep -i ^Last-Modified:|cut -d, -f2)")       DATE_DAT=$(date +"%Y%m%d%H%M.%S" -d "$(stat -c %y ${COF}.${EXT})")       if [[ "$DATE_ORI" != "$DATE_DAT" ]];then         rm -f $COF.$EXT         ### geoip csv file change to S3 presigned. so add -L option.         curl -k -L "$BASEURL" -o $COF.$EXT >/dev/null 2>&1         touch -t $DATE_ORI $COF.$EXT         if [ -s $GEOIPDIR/geolite2legacy/$COF.$EXT ] || [[ $(stat -c %s $GEOIPDIR/geolite2legacy/$COF.$EXT) -ne 0 ]];then           if [[ $COF == "GeoLite2-Country-CSV" ]];then datev4="GeoIP.dat";datev6="GeoIPv6.dat"           elif [[ $COF == "GeoLite2-City-CSV" ]];then datev4="GeoLiteCity.dat";datev6="GeoLiteCityv6.dat";fi           python geolite2legacy.py --input-file $COF.$EXT --fips-file geoname2fips.csv --output-file $datev4           python geolite2legacy.py --input-file $COF.$EXT -6 --fips-file geoname2fips.csv --output-file $datev6           touch -t $DATE_ORI $datev4 $datev6           mv -f $datev4 $GEOIPDIR           mv -f $datev6 $GEOIPDIR         fi         /bin/geoipupdate       fi       done       ### Primary Server are deploy for other servers.       cd $GEOIPDIR       if [[ $CITYDATA == "Y" ]];then         tar czfp GeoIP-dat.tgz Geo{IP,IPv6,LiteCity,LiteCityv6}.dat GeoLite2-{Country,City}.mmdb       else         tar czfp GeoIP-dat.tgz Geo{IP,IPv6}.dat GeoLite2-Country.mmdb       fi       touch -t $DATE_ORI GeoIP-dat.tgz       if [ -s GeoIP-dat.tgz ];then         mv -f $GEOIPDIR/GeoIP-dat.tgz /var/www/html/         chown apache:apache /var/www/html/GeoIP-dat.tgz fi;fi;fi exit 0 | 
중간에 주석 처리된 3줄은 python2를 사용하는 서버(centos 7 이하)에서는 주석을 제거 하고 사용해야 한다.
몇가지 로직 개선 및 mmdb 파일까지 갱신 하도록 geoipupdate 명령을 중간에 실행 하도록 하였다.
때문에 /etc/GeoIP.conf 파일에 자신의 어카운트 및 라이선스키를 넣어줘야 한다.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | # Please see http://dev.maxmind.com/geoip/geoipupdate/ for instructions # on setting up geoipupdate, including information on how to download a # pre-filled GeoIP.conf file. # Enter your account ID and license key below. These are available from # https://www.maxmind.com/en/my_license_key. If you are only using free # GeoLite databases, you may leave the 0 values. AccountID 000000 LicenseKey XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX # Enter the edition IDs of the databases you would like to update. # Multiple edition IDs are separated by spaces. EditionIDs GeoLite2-Country GeoLite2-City GeoLite2-ASN | 
그냥 사용 할경우 www.enteroa.com 에서 생성하고 재배포 하는 파일을 다운 받아 사용 한다.
자신의 서버에서 스스로 dat파일을 생성 하고 싶을 경우 Maxmind_Licensekey 부분과 PRIMARY_SERVER_HOSTNAME 부분 또 PRIMARY_DEPLOY_URL 부분을 수정 해서 사용해야 한다.
라이선스키 발급 방법은 같기 때문에 maxmind 에서 라이선스 발급을 원하면 아래 역인글을 확인 한다.

