분류 전체보기 38

[3] Nginx를 이용한 이미지 서버 ⎻ Nginx 기본 설정 파일 작성

업로드, 다운로드, 삭제 기능 등을 구현하기 전에 이미지 서버의 웹 서버인 Nginx의 설정을 해 준다. # Nginx 설정 파일 디렉토리 확인 /etc/nginx 디렉토리에서 Nginx 설정을 위해 사용할 디렉토리 및 폴더는 다음과 같다. /etc/nginx# ls -al total 88 drwxr-xr-x 1 root root 4096 Apr 21 17:22 . drwxr-xr-x 1 root root 4096 Apr 26 19:06 .. drwxr-xr-x 1 nginx nginx 4096 Apr 26 19:06 conf.d # include될 config 파일들 -rw-r--r-- 1 root root 1077 Apr 21 17:22 fastcgi.conf -rw-r--r-- 1 root root..

[2] Nginx를 이용한 이미지 서버 ⎻ Nginx(w/ upload module), fcgiwrap 설치

개발을 위해 이미지 서버 구축에 필요한 스택을 설치한다. 개발 환경은 Ubuntu 20.04.이다. # Nginx 설치 Nginx 소스 코드로부터 nginx-upload-module을 함께 컴파일해서 설치한다. Nginx는 C로 개발되어 있으므로, gcc 등 C 컴파일 관련 라이브러리가 설치되어 있어야 한다. ## Nginx 의존 라이브러리 설치 Nginx를 실행하기 위해서는 기본적으로 pcre, openssl, zlib 등의 라이브러리가 필요하다. 패키지 매니저를 통해 설치해도 되지만(추후 Dockerfile 작성 시에는 이 방법을 사용하였다), 애초에 컴파일해서 설치하는 김에 의존 라이브러리도 컴파일하는 방식으로 설치해보기로 하였다. Nginx 설치 시 빌드 경로 설정을 쉽게 하기 위하여, /usr/..

[1] Nginx를 이용한 이미지 서버 ⎻ 개요

회사에서 서비스에 필요한 이미지 파일의 업로드, 다운로드, 삭제 등의 기능을 담당하는 이미지 서버를 개발하는 프로젝트를 진행했다. 이미지 서빙을 WAS에서 겸할 수도 있지만, 정적 파일 서빙에 대한 것은 어플리케이션 기능과는 분리되는 것이 맞다고 보여 별도의 웹 서버를 두고 해당 웹 서버에서 이미지 업로드, 다운로드, 삭제 요청을 처리하기로 하였다. 웹 서버에서 파일 업로드, 삭제 등과 같은 동적 기능을 구현하기 위해 CGI 방식을 이용했다. (아마존 S3 따라잡기라는 원대한 꿈을 가지고 시작했으나(...) 수많은 시행착오를 겪고) 웹 서버를 이용해 정적 파일 업로드, 다운로드 등의 기능을 어떻게 구현할 수 있는지 고민했던 내용을 기록하고자 한다. GitHub - sirzzang/nginx-image-s..

[ELK] AI 모델링 시각화

AI 모델링에 사용한 데이터를 데이터 분석을 위한 Elastic stack(https://sirzzang.github.io/dev/Dev-elk-stack-01/)을 이용해 관리하고 시각화할 수 있다. AI 모델링 서버(https://projectlog-eraser.tistory.com/64)에서 로깅을 통해 input, modeling(모델링 중간 과정에 발생하는 데이터) data를 남기고, ELK stack을 통해 이를 수집 및 가공해 적재하고, 시각화하면 된다. # 구조 전체 구조도는 다음과 같다. AI app server의 Model, Datastore에서 input, output data 및 모델링 과정을 나타내는 데이터(예컨대, 클러스터링 점수 등)를 로그로 남긴다. Elastic stack은..

[App Server] Flask로 AI 백엔드 서버 구축해 보기

지난 포스팅(https://projectlog-eraser.tistory.com/m/57)에서 받은 피드백을 통해, 앱 서버의 구조를 변경해 개발을 진행하였다. # 구조 백엔드에서 따로 모델을 돌리는 프로세스를 생성하지 않고, socket 통신도 하지 않는다. 따라서 불필요하게 모델을 돌리기 위한 프로세스를 새로 생성하지 않아도 되고, Flask app 프로세스와 모델 프로세스 간에 통신으로 인해 (혹시라도 발생할 수 있는) 서버 부하를 줄일 수 있다. 또한, 모델별로 설계를 진행했던 것과 달리, 새로운 설계에서는 컴포넌트별로 레이어를 나누었다. Controller, Service, Model이 그것이다. Controller는 클라이언트의 요청을 받아, Service로 전달한다. Service는 모델링에..

[ELK] K8S 환경에 ELK stack 배포하기

회사에서 Springboot Application의 로그를 모니터링하기 위해 ELK stack을 활용해 모니터링 시스템을 개발했다. 그런ㄷㅔ QA 및 테스트 환경에서의 로그 모니터링이 필요해짐에 따라 해당 시스템을 사내 데이터센터의 클라우드 환경(현재 사내 QA 및 테스트는 사내 데이터 센터 클라우드 환경에서 namespace 및 리소스를 할당 받아 이루어지고 있다)에 배포할 필요성이 생겼다. 사내 데이터센터 클라우드 환경이 K8S와 거의 동일하기 때문에, docker-compose를 이용해 컨테이너 환경에서 개발했던 것을 쿠버네티스 환경에 올리기만 하면 될 것이라고 생각했는데, 어떻게 구성할 지부터 시작해, 실제 쿠버네티스 오브젝트 매니페스트를 작성하고 배포하는 것이 쉽지 않았기 때문에, 해당 과정을 ..

Infra 2021.12.05

[Tibero] Tibero에서 UPSERT 쿼리 구현하기

지난 글에서 개발하던 앱 서버를 운영하던 중, 이슈가 발생해 해당 이슈를 해결하기 위해 UPSERT 쿼리를 구현할 필요성이 생겼다. UPSERT란, 키 값이 존재하는 row에 대해서는 UPDATE를 수행하고, 그렇지 않은 row에 대해서는 INSERT를 수행하는 쿼리이다. MySQL, PostgreSQL, Oracle 등 많이 사용하는 데이터베이스에서는 UPSERT를 수행하기 위한 쿼리가 제공된다. 더보기 간략하게 (전적으로 내 기준) 기억하기 쉽도록 각 DBMS에서 제공되는 UPSERT 쿼리를 정리하면 다음과 같다. MySQL: ON DUPLICATE KEY UPDATE PostgreSQL: ON CONFLICT DO UPDATE SET ORACLE: MERGE WHEN MATHCED THEN WHEN..

[App Server] Flask, Socket으로 앱 서버 구축해 보기

(지난 포스팅에 이어) 클라이언트의 요청이 들어 왔을 때, 요청을 처리해 모델링을 한 뒤, 해당 결과를 클라이언트에게 전송하는 앱 서버를 개발하였다. Flask와 Socket을 이용해 개발했는데, 구조를 기획하고 실제 코드를 작성하는 과정에서 배운 점이 많았기 때문에 간략하게 전체적인 과정을 기록하고자 한다. 예전에 데이터 분석, AI를 배울 때부터 꼭 해보고 싶었던 일이기에, 회사 업무를 통해 경험할 수 있다는 것 자체가 큰 성장이었다. # 구조 개발에 앞서 다음 그림과 같은 구조를 기획했다. Flask app server는 클라이언트의 요청을 라우팅하는 router 모듈로 동작하고, backend server는 Flask app server에서 받은 요청에 따라 그에 맞는 모델을 호출해 작업을 수행한..

[App Server] ODBC를 이용해 Tibero와 Python 연동하기

회사에서 애플리케이션 API 서버를 개발하며, Tibero에 적재된 데이터를 불러오는 모듈을 개발할 일이 생겼다. Tibero 데이터 I/O 모듈의 위치는 다음 그림에서와 같고, 데이터베이스로부터 데이터를 추출해 Preparation 모듈로 넘기는 역할을 담당한다. 애플리케이션 API 서버 및 애플리케이션 내 AI 모델을 Python으로 개발할 예정이기 때문에, Tibero 데이터 I/O 모듈도 Python으로 개발하고자 한다. Tibero의 tbCLI는 DBMS와의 연결을 지원하기 위해 ODBC, JDBC를 지원한다. 사실 Python에는 각 데이터베이스와 연동을 지원하는 라이브러리가 있는데(예컨대, mysql과 연동하기 위해서는 pymysql 등을 사용하면 된다.), 아직 Tibero와의 연동을 지원..

어디다 기록할 지 몰라 여기로 온 Pandas 사용법

프로젝트 도중 데이터 분석이 필요할 때면, Pandas 쓸 일이 많다. 여기 저기서 자주 사용했는데, 정리하기에는 너무 사소해서 정리하지 않다 보니 자꾸 또 다시 찾아보게 된다. 사소하지만 내 기준에서 유용하고, 까먹고 싶지 않은 Pandas 사용법을 몰아 넣어 정리해 본다. 중복 답변 개수 체크 프로젝트 기획 단계에서 설문 중복 응답을 분류할 때 사용했던 코드이다. df['앱이름_수정'] = df['앱이름'].str.replace(r"\([^()]*\)", "") # 괄호 안 설명 제거 new_df = df['앱이름_수정'].str.split(',', expand=True) # 중복 답안 각각의 컬럼으로 expand new_df.stack().reset_index().value_counts([0]) #..

기타 2021.05.02