기존 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 |
#!/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_DATE=$(date +"%Y%m%d%H%M.%S" -d "$(curl -sI "$PRIMARY_DEPLOY_URL/GeoIP-dat.tgz"|grep -i ^Last-Modified:|cut -d, -f2)") SLV_DATE=$(date +"%Y%m%d%H%M.%S" -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 에서 라이선스 발급을 원하면 아래 역인글을 확인 한다.