태그 Archives: apache

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 …

OCI arm 인스턴스에서 docker로 web, was 사용

OCI 에서 제공되는 무료 서버를 이용하여 nginx(x86) – was(arm64) – DB(arm64) 으로 잘 사용하고 있었다. (물론 앞으로도 잘 사용할 예정…)

기존엔 snapd(certbot) 도 arm64에서 정상 동작지 않았고 http3를 구현한 nginx도 베타 였으나 현재는 mainline-quic 으로 되었기 때문에
native-arm64 환경으로 이행을 통해 메모리가 적어서 상대적으로 속도가 느렸던 x86서버를 버리기 위해서 아래와 같은 목표를 구현하는 것을 목표로 잡았다.

1. Docker – Was(http,php-fpm) 의 OS를 amazonlinux2 -> rockylinux9 으로 변경 하여 php-8.3 사용

2. Docker – rockylinux9 – nginx-quic(http3) 구축

3. Docker x86_64(amd64), arm64(aarch64) 을 지원

 


 

베이스 OS는 rockylinux 9 (aarch64)이며, 서버에 docker 를 설치하고 활성화 한다. (Install Docker Desktop on RHEL)

 

Was 컨테이너 안에서 웹서비스가 apache:apache 권한 으로 동작 되기 때문에 아래와 같이 베이스 os에 같은 유져를 생성하게 되면 퍼미션 지정이 불필요 하다. (바깥에서 단순 UID 48으로 지정해 운영 해도 된다.)

 

도커는 pull 을 별도로 하지 않더라도 정확한 주소를 사용할 경우 자동으로 pull 하는 기능이 있으므로 바로 run 을 실행 한다. nginx 가 80,443 을 사용할 예정이기 때문에 9000번 포트를 이용해 run 한다. (https://hub.docker.com/r/san0123/rocky9-http-php)

 

웹소스를 호스트os의 /var/www/html에 넣으면 호출을 할수 있다.
파일을 복사하거나 압축을 해제한 후에는 chown -R apache:apache 파일명 을 잊지 말자…

 


 

Nginx 도커를 이용한 http2를 위해 80/tcp, 443/tcp 그리고 http3를 위해 443/udp 을 파이어월에서 허용 한다.

 

웹용 도커는 베이스OS에서 virtualhost 설정 파일 을 저장해서 버전 업데이트시 설정 파일을 새로 설정 하지 않기 위해 mount 하기 때문에 먼저 생성을 한뒤 docker run 을 해야 한다.

 

Nginx용 도커를 실행 한다. 컨테이너를 재 생성 할때마다 인증서나 가상호스트 파일을 수정하지 않도록 두개의 마운트 포인트를 추가해서 실행한다.  (https://hub.docker.com/r/san0123/rocky9-nginx)

--add-host host.docker.internal:host-gateway 옵션은 베이스OS 에서 제공 중인 다른 서비스 포트에 접근하기 위한 설정이기 때문에 필요에 따라 제거 할 수 있다.

 

도메인을 서버에 연결 한 뒤에 Let‘s encrypt 를 생성하는 명령어는 다음과 같다. (email, webroot, domain 은 자신에 맞게 수정해서 사용한다.)

 

베이스OS 에서 /var/www/conf/virtual.conf 를 자신의 url에 맞게 수정하고 발급된 인증서가 동작할 수 있도록 수정을 한다.

 

nginx를 재시작 하기 위해서 컨테이너를 재시작 한다.

 

http3가 잘 활성화 되어있는지 확인 한다. ( https://http3check.net/)

2024-04-27 17 14 57

 

인증서가 약 2-3개월 마다 갱신해야 하기 때문에 cronatb에 아래와 같이 등록해서 주기적인 인증서 업데이트 및 적용을 위한 재시작을 한다. (매주 월요일 오전 8시)

 


 

데이터베이스 사용법 까지 필요 하면 아래 포스트를 확인 하자 ‘ㅅ’a

Docker 를 이용한 데이터베이스 사용법

python – apache pyarrow 를 이용한 parquet 생성 및 테스트

apache 재단에서 진행 되는 프로젝트 이다. python, java, R 등등 많은 언어를 지원 한다.

CSV (Comma-Separated Values)의 가로열 방식의 데이터 기록이 아닌 세로열 기록 방식으로 기존 가로열 방식에서 불가능한 영역을 처리가 가능하도록 한다.

2020-12-24_135314

보이는가 선조의 지혜가 -3-)b

이미지 출처: 훈민정음 나무위키

 

차이점을 그림으로 표현하자면 아래와 같다.

2020-12-28_090732

 

문서를 모두 읽는다 에서는 큰 차이가 발생하지 않지만 구조적으로 모든 행이 색인(index) 처리가 된 것처럼 파일을 읽을 수 있다.

sql 문으로 가정으로 “(SELECT * FROM 테이블 WHERE 재질 = ‘철’)” 을 찾게 될 경우 index 가 둘다 없다는 가정하에서

CSV 는 9개의 칸을 읽어야 하지만 (재질->무게->산화->나무->가벼워->탄다->철->무거워->안탄다->return)

parquet 의 경우 5개의 칸만 읽으면 된다. (재질->나무->철->무거워->안탄다->return)

PS. 물론 색인(index) 는 이런 구조가 아닌 hash 처리에 따른 협차법 으로 찾아서 빨리 찾을 수 있어 차이가 있다.

압축을 하더라도 컬럼별 압축이 되기 때문에 필요한 내용만 읽어서 압축해제 하여 데이터를 리턴 한다.

 

적당한 TSV (Tab-Separated Values)데이터를 준비 한다.

2020-12-24_145706

 

python 을 이용하여 TSV 파일을 읽고 python 의 pyarrow를 이용하여 parquet 파일을 생성 하고 읽는 테스트를 한다. (pyarrow, pandas 는 pip install pyarrow pandas 으로 설치할 수 있다.)

 

TSV -> parquet 압축률(높을수록 좋음) 및 처리 시간(낮을수록 좋음)

defextMBcompress ratioprocessing time
python 2.7
processing time
python 3.6
txt.txt58.8 MB
gzip.txt.gz16.3 MB72%3.24 sec
pyarrowwrite_table,
compression='none'
.parquet
40.1 MB32%0.74 sec0.93 sec
write_table,
compression='snappy'
24.8 MB58%1.31 sec 0.95 sec
write_table,
compression='lz4'
24.7 MB58%0.79 sec0.94 sec
write_table,
compression='zstd'
19.3 MB67%1.00 sec0.98 sec
write_table,
compression='gzip'
18.8 MB68%5.07 sec1.18 sec

읽기/쓰기 테스트 모두 AWS – EC2(m5.large-centos7) – gp2(100GB) 에서 진행 하였다.

 

parquet 을 생성한 이유는 파일을 읽을때 모든 컬럼인 index가 걸려있는것과 같이 빠르게 읽기 위함이니 읽기 테스트도 해본다.

 

TSV, parquet 파일 읽기 테스트 (pandas, pyarrow)

defextMBprocessing time
python 2.7
processing time
python 3.6
pandasread_csv.txt58.8 MB1.39 sec1.56 sec
read_csv,
compression='gzip'
.txt.gz16.3 MB1.68 sec2.06 sec
read_parquet.parquet
(none)
40.1 MB0.72 sec0.93 sec
.parquet
(snappy)
24.8 MB1.03 sec0.95 sec
.parquet
(lz4)
24.7 MB0.73 sec0.94 sec
.parquet
(zstd)
19.3 MB0.76 sec0.95 sec
.parquet
(gzip)
18.8 MB0.96 sec1.18 sec
pyarrowread_csv,
to_pandas
.txt58.8 MB1.01 sec1.30 sec
.txt.gz16.3 MB1.41 sec1.37 sec
read_table,
to_pandas
.parquet
(none)
40.1 MB0.69 sec0.90 sec
.parquet
(snappy)
24.8 MB0.99 sec0.89 sec
.parquet
(lz4)
24.7 MB0.69 sec0.92 sec
.parquet
(zstd)
19.3 MB0.75 sec0.95 sec
.parquet
(gzip)
18.8 MB0.95 sec1.22sec

 

이 문서 처음에 언급 했다 시피 대용량 파일을 처리 하기 위함. 즉 “빅데이터”(HIVE, Presto, Spark, AWS-athena)환경을  위한 포멧이다.

모두 테스트 해보면 좋겠지만 아직 실력이 부족해서 AWS athena 만 테스트를 진행 한다.

구조적으로 S3 버킷에 parquet 파일을 넣어 두고 athena 에서 테이블을(S3 디렉토리 연결) 생성 하여 SQL 문으로 검색을 하는데 사용 한다.

 

TSV, parquet 파일 읽기 테스트 (AWS – athena)

ROW FORMAT SERDEextSearched
MB
processing time
(select target 2)
processing time
(select target 50)
athenaorg.apache.hadoop.hive.
serde2.lazy.
LazySimpleSerDe
.txt58.8 MB1.17 ~ 3.35 sec1.86 ~ 2.68 sec
.txt.gz16.3 MB1.37 ~ 1.49 sec1.44 ~ 2.69 sec
org.apache.hadoop.hive.
ql.io.parquet.serde.
ParquetHiveSerDe
.txt.parquet10.48 MB1.11 ~ 1.49 sec1.00 ~ 1.38 sec
.snappy.parquet4.71 MB0.90 ~ 2.36 sec0.90 ~ 1.00 sec
지원 불가.lz4.parquet지원 불가
.zstd.parquet
org.apache.hadoop.hive.
ql.io.parquet.serde.
ParquetHiveSerDe
.gzip.parquet2.76 MB0.89 ~ 1.17 sec0.90 ~ 1.85 sec

읽는 속도가 향상되었고 스캔 크기가 적게 나온다. (parquet 의 강점을 보여주는 테스트-스캔비용의 절감이 가능.)

 

athena 테이블 생성에 사용된 DDL 쿼리문 (TSV, parquet)

 

PS. 이건 저도 어려 웠어요…..

TLS 1.3 활성화 (apache, nginx)

RFC 8446 이 발표 되고 TLS 1.3 의 표준이 제정 되었다. (https://tools.ietf.org/html/rfc8446)

아래의 조건을 만족하는 경우 TLS v1.3 를 사용할 수 있다.

openssl 1.1.1 이상 / nginx 1.13.0 이상 / apache 2.4.37 이상

 

openssl 이 웹서버 데몬(apache,nginx) 에 의존성이 있으므로 openssl 을 업데이트 하고 웹서버를 재설치 해야 하는 경우가 발생할 수 있다.

 

nginx.conf 에서의 SSL 관련 설정 방법

 

apache 의 SSL 설정 방법

 

2019-01-08_113231_001

 

브라우저 호환성 (https://caniuse.com/#feat=tls1-3)

TLS v1.3 이 나왔다고 TLS v1.2 끌 경우 많은 브라우져가 접속하지 못한다.

현재 TLS v.1.3을 지원하는 브라우져는 FireFox, Chrome, Safari, Opera, IOS Safari, Chrome for Android, FireFox for Android 정도 이다.

Let’s enctypt 를 의 발급/갱신을 단순화 하기 위한 방법

Let’s encrypt 는 발급/갱신을 할때 http://도메인/.well-known/acme-challenge/xxxxxxxxxxxxxxxxxxxxxxxxx 를 호출 한뒤 호출에 성공한경우 도메인 소유권이 있는것으로 판단하여 발급/갱신이 이루어 진다.

다만 이경우 .htaccess 를 쓰는 워드프레스 라던가 XE 라던가 혹은 개인 설정에 의해 .htaccess 에서 리다이렉트 운용을 할 경우 발급/갱신이 어려워 질 수 있다.

 

때문에 아래와 같이 apache 의 Alias 설정 해서 좀더 효율적인 인증을 할 수 있다.

 

위 설정을 하고 난뒤에 발급 명령어는 아래와 같다.

webroot를 /var/www/html 에 고정을 하고  6번째 줄만 맞게 수정을 해서 사용하면 됩니다 ‘ㅅ’b

 

/var/www 폴더는 selinux 에서 파일컨텍스트가 허용된 폴더로 selinux 를 사용하더라도 별도의 허용처리를 할 필요가 없어서 좋음 🙂