검색

레이블이 오픈소스인 게시물을 표시합니다. 모든 게시물 표시
레이블이 오픈소스인 게시물을 표시합니다. 모든 게시물 표시

2022년 9월 13일

Let’s Encrypt SSL/TLS 인증서을 이용한 무료 SSL 구현하기

Let's Encrypt 로 알려진 비영리 서비스 공동 설립자인 호주 컴퓨터 과학자 Peter Eckersley 님의 부고 소식을 접하고 뜻한바가 있어 오라클 클라우드 환경에서 구동중인 개인 연구 목적의 웹에 SSL 기술을 적용하기로 했다.

Let's Encrypt 는 비영리 그룹 Internet Security Research Group 에서 제공하는 서비스이다. 이 서비스를 사용하면 무료로 TLS 인증서를 발급하여 사용할 수 있다. 관련 자료가 많아 구현에 어려움이 없었다. 

https://letsencrypt.org

환경

  • OracleCloud
  • CentOS Linux 7.9.2009 
  • Nginx 1.16.1 or HTTPD 


SSL 구현하기 ( Apache HTTPD )

① 무료 도메인 등록

SSL 을 적용을 위해서는 도메인이 필요한데  Duck DNS (https://www.duckdns.or) 를 방문하여 무료 도메인을 등록한다. 참고로 서비스를 이용을 위해서는 회원 가입이 필요하다.


https://www.duckdns.or
https://www.duckdns.or


② Let’s Encrypt Client 다운로드

도메인 등록이 완료 되었다면 인증서를 생성해보자. 먼저 관련 도구를 설치한다. (CentOS + HTTPD 환경)

  

sudo yum install epel-release
sudo yum install certbot python2-certbot-apache mod_ssl


③ Let’s Encrypt 인증서 생성

Let’s Encrypt 인증서는 다음과 같은 명령을 사용하여 간단하게 생성할 수 있다. 설정 역시 기존 HTTPD 서버의 가상호스트 설정에 선택하여 추가할 수 있기 때문에 거의 바로 사용이 가능하다. 


sudo certbot --apache -d 도메인이름


이제 자신의 환경에 맞도록 일부를 수정하고 웹서버를 재 시작하면 SSL 이 이용한 웹 서비스가 동작함을 확인할 수 있을 것이다. 

인증서 갱신은 아래와 같은 명령으로 간단하게 처리할 수 있다. 

sudo certbot renew


SSL 구현하기 ( NGINX )

위의 ① 무료 도메인 등록 부분은 동일하게 처리한다.

② Let’s Encrypt Client 다운로드 ( Nginx )

  1. sudo yum install epel-release
  2. sudo yum install certbot-nginx


③ Let’s Encrypt 인증서 생성

Let’s Encrypt 인증서는 다음과 같은 명령을 사용하여 간단하게 생성할 수 있다. 설정 역시 자동으로 추가 되기 때문에 서버만 재시작하면 바로 사용할 수 있다.

  1. sudo certbot --nginx -d example.com

참고자료

2022년 3월 18일

자바 환경에서 OpenCV 를 이용한 이미지 필터 구현하기

OpenCV 관련하여 많은 자료들이 Python 기준으로 되어 있어 자바에서 사용하는 부분에는 어려움이 있었다.

 ◼︎ 작업환경

  • Model : MacBook Pro (16-inch, 2019)
  • CPU : 2.3 GHz 8코어 Intel Core i9
  • GPU : AMD Radeon Pro 5500M 4 GB
  • MENORY : 16GB
  • DISK : 1TB SSD
  • OS : macOS Monterey 12.2.1
◼︎ 테스트 서버 
  • DEVICE : Oracle Cloud VM (Free)
  • OS : CentOS Linux release 7.9.2009 (Core) 
  • JAVA : OpenJDK 64-Bit Server VM 21.9 (build 17.0.1+12, mixed mode, sharing)
  • OpenCV : 4.5.5

프로그램은 간단하게 웹 브라우저에서 이미지를 업로드하면 서버(Tomcat) 는  요청하는 이미지 효과를 수행하고 결과 이미지를 리턴하는 방식이다. 


❶ 이미지가 업로드 되었다고 가정하고 이미지 아이디와 원하는 필터를 지정하여 요청한다.


❷ 이미지가 효과 서비스를 호출하여 이미지를 변환화고 변환된 이미지를 리턴한다.




다음은 비교적 큰 사이즈의 이미지(6.7MB)를 여러 필터로 변환하는 예시이다. 변환 테스트는 라스베리파이 4 와 오라클 클라우드 무료 VM 환경에서 진행해 보았는데 라스베리파이는 CPU 파워 부족 오라클 클라우드 VM 은 메모리 부족을 체감하였다.  

참고자료

  1. Creating Instagram like Filters With Opencv!
  2. Cartoon Effect on Image using Python and OpenCV

Ubuntu 20.04.4 LTS 환경에 OpenCV 설치하기

◼︎ 작업환경

  • Model : MacBook Pro (16-inch, 2019)
  • CPU : 2.3 GHz 8코어 Intel Core i9
  • GPU : AMD Radeon Pro 5500M 4 GB
  • MENORY : 16GB
  • DISK : 1TB SSD
  • OS : macOS Monterey 12.2.1
◼︎ 기기
  • DEVICE : Raspberry Pi 4 (4G RAM)
  • DISK : 128GB SD Card 
  • 모니터 암에 고정하여 사용


1.자바 설치하기

자바 환경에서 실해아는 것이 목적이기 때문에 먼저 최신 자바를 설치한다. (작업 당시에 자바버전은 11.013 이었다.)
  

sudo apt update
sudo apt install default-jdk

2. OpenCV 설치

먼저 컴파일을 위한 소프트웨어 패키지들을 설치한다. CentOS와는 차이가 있었다. 

sudo apt install cmake build-essential

다음 패키지들은 반듯이 설치가 필요한 것은 아니다. 

sudo apt-get install pkg-config

sudo apt-get install libjpeg-dev libtiff5-dev libpng-dev

sudo apt-get install ffmpeg libavcodec-dev libavformat-dev libswscale-dev libxvidcore-dev libx264-dev libxine2-dev

sudo apt-get install libv4l-dev v4l-utils

sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev 


원하는 버전의 OpenCV 소스 파일을 다운로드 한다. 다운로드는 /home/pi 경로을 사용했다.

wget -O opencv.zip https://github.com/opencv/opencv/archive/4.5.5.zip

wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.5.5.zip


unzip 명령을 사용하여 압축을 풀고 빌드를 위하여 build 폴더를 생성한다음 build 경로로 이동한다.
  

unzip opencv.zip
unzip opencv_contrib.zip 
mkdir build
cd build


이제 cmake 명령을 실행하여 컴파일을 위한 설정을 수행한다.


컴파일을 위한 설정 과정에서 JAVA 을 인식하지 못하는 문제가 발생되었다.  이부분을 해결하는 과정에 어려움이 있었는데 아래와 같이계정 프로파일에  매뉴얼하게 경로를 지정해주는 방법으로 해결했다. 

이미 최신 자바 버전이 설치되었지만 호환성을 고려하여 JDK 1.8 과 ant 를 설치한다. 이는 cmake 실행 옵션에 자바 버전을 명시한 경우에 맥 환경에서는 동작하였지만 CentOS 환경에서는 효과가 없어 이번에도 컴파일시에는 1.8 자바를 사용하고 이후에 높은 버전의 자바로 변경하여 사용하였다. 
sudo apt install ant openjdk-8-jdk 

.profile 파일을 아래와 같이 수정하여 수동으로 홈 경로를 지정해준다.
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-arm64
export JRE_HOME=/usr/lib/jvm/java-8-openjdk-arm64/jre
export ANT_HOME=/usr/share/ant
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

다시 cmake를 실행한다. 이때 사용한 옵션은 아래와 같다.
 
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.5.5/modules \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_C_EXAMPLES=ON  \
-D INSTALL_PYTHON_EXAMPLES=ON  \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D BUILD_opencv_ximgproc=ON \
-D BUILD_SHARED_LIBS=OFF \
-D OPENCV_JAVA_TARGET_VERSION=1.8 \
-D BUILD_EXAMPLES=ON ../opencv-4.5.5

처음과는 다르게 JAVA 항목이 인식됨을 확인할 수 있다.



이제 빌드 및 설치를 진행한다. 컴파일 작업은 많은 시간이 소요되기 때문에 실행 후 다른 볼일을 보는 것이 좋을 것 같다. 프로세스 수를 2정도로 하고 실행을 했는데 nmon 도구를 사용하여 프로세스 사용량을 모니터링 해보면 옵션 값을 3 또는 4 을 적용해도 될 것 같다는 생각이 된다. 실재로 -j4 값을 주고 컴파일을 해보면 4개의 cc1plus 인스턴스가 96% 정도 CPU 자원을 사용하는 것으로 모니터링 된다.
 
make -j2
sudo make install
-j2 옵션을 사용한 경우


-j4 옵션을 사용한 경우
 

2021년 12월 13일

전자정부프레임워크 3.6.0 환경에서 아파치 Log4j 제로데이 취약점 (CVE-2021-44228) 조치 방법

Apache 재단은 보안 취약점 1 ~ 10 구분하고 있는데 이번에 알려진 Apache Log4j 2 에서 발생하는 원격코드 실행 취약점(CVE-2021-44228)은 가장 높음 10단계에 해당하는 아주 심각한 보안 취약점이다.

KISA 에서는 긴급 보안 업데이트 권고 형태로 즉각적인 조치를 권하고있다. (12/13)

https://www.krcert.or.kr/data/secNoticeView.do?bulletin_writing_sequence=36389


스프링 기반의 전자정부 프레임워크를 사용하는 환경우 경우 아래와 같은 절차로 처리가 가능하다.

대상 환경은 아래와 같다. 

  • 전자정부 프레임워크 버전 : 3.6.0 
  • Spring : Spring 4.1.2-RELEASE
  • Java : 1.8 이상


조치 방법

① 전자정부 프레임워크 기반 자바 프로그램을 maven 도구를 사용하도록 되어 있다. 프로젝트에서 Log4J2 의 의존성을 제거하기 위하여 pom.xml 설정에서 아래와 같이 exclusion 을 설정을 추가한다.



 
   	
		3.6.0
    
     
		
			egovframework.rte
			egovframework.rte.psl.dataaccess
			${egovframework.rte.version}
			
				
					org.apache.logging.log4j
					log4j-api
				
				
					org.apache.logging.log4j
					log4j-core
				
				
					org.apache.logging.log4j
					log4j-slf4j-impl
				
				
					org.slf4j
					log4j-over-slf4j
				
			
		 
     
    


② pom.xml 에 최신 LOG4J 2 버전으로 의존성을 추가한다.



 
   	
		3.6.0
		2.15.0
		1.7.32        
    
     
		
			egovframework.rte
			egovframework.rte.psl.dataaccess
			${egovframework.rte.version}
			
				
					org.apache.logging.log4j
					log4j-api
				
				
					org.apache.logging.log4j
					log4j-core
				
				
					org.apache.logging.log4j
					log4j-slf4j-impl
				
				
					org.slf4j
					log4j-over-slf4j
				
			
		 
        
		
		
			org.slf4j
			slf4j-api
			${project.dependency.slf4j.version}
		 
	    
            org.slf4j
            jcl-over-slf4j
            ${project.dependency.slf4j.version}
            runtime
        
 		
			org.apache.logging.log4j
			log4j-api
			${project.dependency.log4j.version}
		        
		
			org.apache.logging.log4j
			log4j-core
			${project.dependency.log4j.version}
		  
        
		
			org.apache.logging.log4j
			log4j-slf4j-impl
			${project.dependency.log4j.version}
		 
        
  		
			org.apache.logging.log4j
			log4j-web
			${project.dependency.log4j.version}
			runtime
		
		
        
     
    


⓷ 기존 프로젝트에서 Spring 에서 제공하는 log4j 설정 기능을 사용하고 있었다면 아래와 같이 web.xml 파일에서 해당 설정을 제거한다.




    



④ 기존 프로젝트를 새롭게 빌드하여 배포한다.

2021년 9월 15일

CentOS 7 환경에서 Apache 웹서버 MPM 모듈 evnet로 변경하기

Apache 웹서버는 prefork 불리우는 방법으로 클라이어트의 요청을 처리하도록 되어 있다. 

prefork 는 Apache 2 부터 도입된 MPMs (다중처리 모듈들, Multi-Processing Modules) 중 하나이다. MPMs 에는 Prefork, Worker, Event 가 있으며 이외에도 Threadpool, Perchild, Leader 등 여러가지가 있다. yum 을 사용하여 설치되는 httpd 패키지는 prepork, worker, event 를 지원한다.

yum 을 설치를 하면 디폴트로 prepork 방식으로 동작하는데 아래 명령으로 현재 적용된 MPM 모듈을 확인할 수 있다.

httpd -V

아래와 같은 내용으로 출력될 것이다.



환경

  • CPU 2.0GHz (6Core),  16GB , 500GB * 2 (raid)
  • CentOS 7.8.2003  (64bit)
  • Apache 2.4.6 (64bit) 


변경

Prefork 방식의 성능 저하는 단일 스레드의 자식 스레드에서 한번에 하나의 요청을 순차적으로 처리하는 방식에 의한 한계를 예상하고 성능적으로 가장 우수하다고 알려진 event  방식으로 변경하였다. 

① /etc/httpd/conf.modules.d 경로의 00-mpm.conf 설정 파일에서 prefork MPM 부분은 주석처리하고 마지막의 event MPM 부분의 주석을 제거한다.

# Select the MPM module which should be used by uncommenting exactly
# one of the following LoadModule lines:

# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

# worker MPM: Multi-Processing Module implementing a hybrid
# multi-threaded multi-process web server
# See: http://httpd.apache.org/docs/2.4/mod/worker.html
#
#LoadModule mpm_worker_module modules/mod_mpm_worker.so

# event MPM: A variant of the worker MPM with the goal of consuming
# threads only for connections with active processing
# See: http://httpd.apache.org/docs/2.4/mod/event.html
#
LoadModule mpm_event_module modules/mod_mpm_event.so

② 아파치 서버를 다시 시작하면 event MPM 방식으로 동작하게 된다.


systemctl restart httpd.service 
httpd -V


참고

How To Install the Apache Web Server on CentOS 7

Understanding Apache 2 MPM

Apache MPMs Explained

Change Apache MPM on CentOS7

2021년 7월 13일

Spring 기반 웹 프로그램에서 Filepond 를 이용한 이미지 업로드 구현하기

이미지 업로드에 최적화되어 있다고 하는 Filepond 을 사용하여 업로드를 구현해보자. Filepond 다양한 Framework 에 대한 Adaptor 를 제공하고 있고 사용이 아주 편리하다. 여기에서는 jQuery 기반의 Front-End 와 Spring 기반의 Back-End  환경에서 구현하였다.


개발 및 운영 환경은 아래와 같다.

Development
  • JAVA 1.8.x
  • Eclipse 4.17.0
  • Tomcat 8.x 
  • npm 6.14.13 , webpack 4.44.1 
  • HW : MacBook Pro 2019 
    • macOS Big Sur 11.4
    • 2.3Ghz 8Core Intel Corei9 
    • 16GB 2667 Mhz DDR4
    • SSD 1TB 
Server 
  • Tomcat 8.5.58.0
  • Open JDK 1.8.0_292-b10
  • Oracle Cloud : VM.Standard.E2.1.Micro 
    • CentOS Linux release 7.9.2009 (Core)
    • 1 OCPU, 1GB MEMORY, 50GB Block Volume
    • 1Network 0.48 Gbps

설치하기

filepond 는 npm 을 사용하여 아래와 같이 npm 을 사용하여 설치한다. (☛ Using FilePond with JavaScript 참고.)
npm 을 사용하지 않는 경우라면 Git 에서 직접 다운로드 하여 사용하면 된다. 
 
npm install filepond --save

filepond 는 유용한 여러 기능들을 플러그인 형태로 지원하고 있다. 이중에서 필수적이라고 생각되는 File Size Validation, Image Preview, media-preview  를 추가로 설치하였다.

 

npm install filepond-plugin-file-validate-size --save
npm install filepond-plugin-image-preview --save
npm install filepond-plugin-media-preview --save

사용하기

Filepond 는 Back-End 부분 즉 서버 사이드 부분을 쉽게 변경하여 사용하는 것을 지원한다. 여기에서는 업로드와 삭제의 경우만 구현하여 사용하였다. 

추가로 JWT 기반의 인증을 사용했다. (참고. Spring 기반 웹 프로그램에서 JWT 인증 사용하기 )  서버 세션을 사용하는 경우는 불필요한 코드이다. 

  • 업로드(Process) 는 ⑴ multipart/form-data POST 형태로 파일을 전달하고 ⑵ 서버는 해당 요청에 대하여 파일을 저장하고 ⑶ 업로드된 파일을 구분하는 유니크한 값을 텍스트 형태로 응답한다. 
  • 삭제(Revert)는 ⑴ BODY 에 텍스트 형태로 파일 구분을 위한 유니크한 값을 포함하여 DELETE 형태로 요청하고 ⑵ 서버는 해당하는 파일을 삭제하고 ⑶ 빈값을 응답한다. 

Front-End 부부은 아래같은 방법으로 구현하였다.  (☛ Setting up FilePond with jQuery 참고) 
  • HTML 코드에서 파일 업로드를 위한 input tag 추가
  • JavaScript 에서 FilePond 인스턴스 생성  

input Tag 에 여러가지 속성 값을 사용하여 FilePone 와 플러그인에 대한 설정이 가능하다. (☛ 이부분에 대한 명확한 문서는 발견하지 못했다)
 


        

 

// ==================================
// Utility for filepond instance create

import * as FilePond from "filepond";
import "filepond/dist/filepond.min.css";

// Import filepond plugins
import FilePondPluginFileValidateSize from "filepond-plugin-file-validate-size";
import FilePondPluginImagePreview from "filepond-plugin-image-preview";
import FilePondPluginMediaPreview from "filepond-plugin-media-preview";

// Import filepond plugin styles
import "filepond-plugin-image-preview/dist/filepond-plugin-image-preview.css";


/**
 * create filefond instance
 * @param {*} renderTo 
 * @param {*} options 
 * @returns filepond instance.
 */
function createFilePond(renderTo, options) {
  options = options || {};
  // Register the plugin
  FilePond.registerPlugin(
    FilePondPluginImagePreview,
    FilePondPluginMediaPreview,
    FilePondPluginFileValidateSize
  );
  return FilePond.create(renderTo.get(0), options);
}

다음 코드는 Spring 기반의 filepond 서버 프로그램이다. (☛ Server configuration 참고)
파일을 저장하거나 삭제하는 부분은 자신의 환경에 맞게 구현하는 작업이 필요하다. 다음 코드에서는 파일 저장을 위하여 미리 구현된 코드를 사용하였다.



다음은 위의 코드를 사용하여 구현된 최종 Front-End 이다

2021년 6월 19일

이미지/영상 프로세싱을 위하여 자바를 지원하는 환경으로 OpenCV 설치하기

자바 기반 웹 프로그램에 이미지/영상 프로세싱 처리를 구현하기 위하여 OpenCV (Open Source Computer Vision) 설치하려고 한다.

설치는 대상은 아래와 같다. 

Development
  • JAVA 1.8.x
  • Eclipse 4.17.0
  • Tomcat 8.x 
  • HW : MacBook Pro 2019 
    • macOS Big Sur 11.4
    • 2.3Ghz 8Core Intel Corei9 
    • 16GB 2667 Mhz DDR4
    • SSD 1TB 
Server 
  • Tomcat 8.5.58.0
  • Open JDK 1.8.0_292-b10
  • Oracle Cloud : VM.Standard.E2.1.Micro 
    • CentOS Linux release 7.9.2009 (Core)
    • 1 OCPU, 1GB MEMORY, 50GB Block Volume
    • 1Network 0.48 Gbps

맥북에 설치하기

설치는 Homebrew 을 사용한다. (Homebrew 는 이미 설치된것으로 가정)


그림1. The Missing Package Manager for macOS (or Linux)


① XCode & Apple Command Line Tools 설치

XCoce 는 앱스토어(App Store)를 통하여 설치한다.


그림2. App Store

또한 최신 make , gcc 등과 같은 도구 설치를 위하여 콘솔에 아래 명령을 입력한다.

   
sudo xcode-select --install

② 자바 빌드 도구인 Apache Ant 를 설치한다.
     
brew update
brew install ant

③ OpenCV 설치
다음 명령을 사용하여 homebrew 에서 제공하는  버전을 확인해보면 2.x, 3.x 버전만 지원하고 있다. 최신 버전 설치를 위하여 아래와 같이 소스를 빌드하여 설치한다.

  
  brew search opencv

자바 지원을 위하여 Opencv 패키지 설정에서 아래와 같이 수정한다. (Homebrew 에서 패키지는 Formula 라  부른다 )

  
  brew edit opencv

-DBUILD_opencv_java=OFF  을  -DBUILD_opencv_java=ON  으로 변경




만일 빌드과정에서 특정 자바 버전을 지정할 필요가 있다면 brew formula 의 cmake 파트에  -DOPENCV_JAVA_TARGET_VERSION=1.8 값을 추가해줘야 한다. 
  
  args = std_cmake_args + %W[
      -DCMAKE_OSX_DEPLOYMENT_TARGET=
      -DBUILD_JASPER=OFF
      -DBUILD_JPEG=OFF
      -DBUILD_OPENEXR=OFF
      -DBUILD_PERF_TESTS=OFF
      -DBUILD_PNG=OFF
      -DBUILD_PROTOBUF=OFF
      -DBUILD_TESTS=OFF 
      -DOPENCV_JAVA_TARGET_VERSION=1.8

다음 명령을 실행하여 설치를 시작한다.
  
  brew install --build-from-source opencv

소스에서 빌드하여 설치하는 것은 많은 자원이 소요된다.


약 17분 정도가 소요되었다.


 /usr/local/Cellar/opencv/4.x.x/share/java/opencv4/.

자바에서 사용하기 위해서  jar 파일과 오브젝트 파일이 필요하다. (설치경로 확인 필수)

오라클 클라우드 리눅스에 설치하기

① 빌드를 위한 도구들을 설치한다.

  
  sudo yum install cmake3 gcc gcc-c++ gtk+-devel gimp-devel gimp-devel-tools 
  gimp-help-browser zlib-devel libtiff-devel libjpeg-devel libpng-devel 
  gstreamer-devel libavc1394-devel libraw1394-devel libdc1394-devel 
  jasper-devel jasper-utils swig python libtool nasm build-essential ant
  

② OpenCV 홈페이지에서 최신 소스를 다운로드한다. 빌드를 위한 opencv 디렉토리를 생성하고 해당 폴더 아래에 다운로드한 소스파일 압축을 푼다. 이제 빌드를 위하여 opencv 폴더로 이동한다.

  

wget https://github.com/opencv/opencv/archive/4.5.2.zip
mkdir opencv
unzip 4.5.2.zip -D ./opencv
cd opencv

③ 아래 명령을 입력하여 빌드를 시작한다.  

  

    cmake3 -D CMAKE_BUILD_TYPE=RELEASE 
    -D CMAKE_INSTALL_PREFIX=/usr/local 
    -D INSTALL_C_EXAMPLES=ON 
    -D INSTALL_PYTHON_EXAMPLES=ON 
    -D OPENCV_GENERATE_PKGCONFIG=ON 
    -D BUILD_EXAMPLES=ON opencv-4.5.2/


make 명령시 -j 옵션은 병렬 처리를 위한 코어 수를 의미하며 코어 수는 nproc 명령을 사용하면 알 수 있다.
오라클 클라우스 서버의 경우 빌드에  많은 시간이 소요되었다. (1 시간 이상)

       
      make -j2



설치 역시 많은 시간이 소요된다.
  
      sudo make install

라이브러리 설치 위치 : /usr/local/share/java/opencv4

④ 정상 동작 확인을 위하여 간단 예제를 사용하였다.

 
    import org.opencv.core.Core;
    import org.opencv.core.CvType;
    import org.opencv.core.Mat;
    
    public class Hello {
    
    	public static void main( String[] args ){
    		System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
    		Mat mat = Mat.eye( 3, 3, CvType.CV_8UC1 );
            System.out.println( "mat = " + mat.dump() );
    	}
    }
    

테스트는 아래와 같이 소스를 컴파일하여 실행한다.

 
javac -cp /usr/local/share/java/opencv4/opencv-452.jar Hello.java

java -Djava.library.path=/usr/local/share/java/opencv4 -cp /usr/local/share/java/opencv4/opencv-452.jar:. Hello


⑤ Tomcat 환경에서 사용할 예정이기 때문에 아래와 같이 .bash_profile 파일에 네이티브 라이브러리 경로 추가한다. opencv-452.jar 은 사용하는 웹 프로그램의 WEB-INF/lib 복사해준다. 한가지 아쉬운 점은 무료로 사용하는 Oracle VM 의 성능이 MacBook Pro 와 너무 차이가 크다.

 

CATALINA_OPTS=' -Djava.library.path=/usr/local/share/java/opencv4 '
export CATALINA_OPTS ;


위와 같이 설치된 리눅스에서는 org.opencv.xphoto.Xphoto 패키지가 포함되지 않았다. 추가 모듈 설치가 필요한 부분으로 예상하고 git 에서 opencv_contrib 을 다운로드 하고 아래와 같은 방법으로 다시 빌드를 진행하였다. (처음에는 opencv 소스 역시 git 에서 다운하여 빌드를 하였으나 오류가 해결되지 않아 opencv_contrib 만 git 에 소스를 사용하는 방법을 사용했다.)

  
wget https://github.com/opencv/opencv/archive/4.5.5.zip
unzip 4.5.5.zip
git clone https://github.com/opencv/opencv_contrib.git
mkdir build 
cd build

cmake3 -D CMAKE_BUILD_TYPE=RELEASE \
-D OPENCV_EXTRA_MODULES_PATH=/home/opc/src/opencv_contrib/modules \ 
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_C_EXAMPLES=ON  \
-D INSTALL_PYTHON_EXAMPLES=ON  \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D BUILD_opencv_ximgproc=ON \
-D BUILD_EXAMPLES=ON /home/opc/src/opencv-4.5.5
 
make -j2
sudo make install 

참고자료

2021년 4월 15일

라스베리파이 4 - Android

 작업환경

  • Model : MacBook Pro (16-inch, 2019)
  • CPU : 2.3 GHz 8코어 Intel Core i9
  • GPU : AMD Radeon Pro 5500M 4 GB
  • MENORY : 16GB
  • DISK : 1TB SSD
  • OS : macOS Big Sur 11.2.3
기기
  • DEVICE : Raspberry Pi 4 (4G RAM)
  • DISK : 64GB SD Card 


① 라스베리파이용 안드로이드 OS 이미지 다운로드

OS 이미지를 다운로드 하기 위하여 LineageOS 홈페이지를 방문했으나 LineageOS 팀 공식 지원 배포본이 없어 다음 경로의 사용자 커스텀 빌드 본을 사용하였다.


https://konstakang.com/devices/rpi4/LineageOS17.1/


② SD 카드에 OS 이미지 쓰기

 SD 카드에 이미지를 쓰는 작업은 balenaEtcher 를 사용하였다.  다운로드한 .zip 파일을 이미지 파일로 선택하고 쓰기 대상 SD 카드를 선택 Flash 버튼을 클릭하면 쓰기가 진행하면 된다. 


③ 라스베리파이 시작

SD 카드를 삽입하고 전원을 켜면  아래와 같은 화면이 보여지는데 안내에 따라 설정을 진행하면 된다.


인터넷 사용을 위하여 WIFI 연결 설정했지만 반복적으로 연결이 끊기는 현상이 발생하여 랜선으로 연결하였다. 




2021년 4월 2일

MPMs worker 를 이용한 아파치 웹서버 성능 업 !!

 yum 패키지 매니저를 사용하여 설치한 Apache 웹서버는 prefork 불리우는 방법으로 클라이어트의 요청을 처리하도록 되어 있다. prefork 는 Apache 2 부터 도입된 MPMs (다중처리 모듈들, Multi-Processing Modules) 중 하나이다. MPMs 는 Prefork, Worker, Event 가 있으며 이외에도 Threadpool, Perchild, Leader 등 여러가지가 있다.



CASE

prefork 방식으로 설정된 Apache 웹서버를 잘 사용하고 있었으나 클라이언트 수가 늘어나면서 응답이 현저하게 지연되는 현상이 반복되었다. 응답이 지연되는 경우에도 CPU, Memory 은 충분한 여유가 있었다.

  • CPU 2.0GHz (6Core),  32GB 
  • Redhat Linux 6.5 (64bit)
  • Apache 2.2.14 (64bit) 

SOLUTION

Prefork 방식의 성능 저하는 단일 스레드의 자식 스레드에서 한번에 하나의 요청을 순차적으로 처리하는 방식에 의한 한계로 추정하고 Worker 방식으로 변경하였다. 

① /etc/sysconfig/httpd 설정 파일의  HTTPD 값을  /usr/sbin/httpd.worker 으로 변경한다.

② /etc/httpd/conf/httpd.conf 파일에서 worker MPM 설정을 변경한다.

③ 마지막으로 아파치 서버를 다시 시작하면 worker MPM 방식으로 동작하게 된다.


성능은 기대이상으로 놀라웠다. Prefork 방식의 경우와는 다르게 지연 없이 응답에 빠르게 동작하고 있다. 많은 요청이 발생하는 경우 멀티스레드 방식의 유용함을 체험할 수 있었다.


참고

How To Install the Apache Web Server on CentOS 7

Understanding Apache 2 MPM

Apache MPMs Explained

2020년 11월 8일

오라클 클라우드 무료 체험하기 - Part2 Web 서버 구축하기

MySql 구축과 동일한 방법으로 웹 서버 구축을 위한 VM 인스턴스를 추가한다. 예상되는 전체 작업 순서는 아래와 같다.


① VM 인스터스 생성 (CentOS 7.x)
② VM 인스턴스 공인 IP 및 방화벽 설정
③ 블록 스토이지 생성
④ 블록 스토이지 와 VM 인스턴스 연결
⑤ WAS/WAS 설치 (nginx, tomcat)
⑥ 웹 프로그램 설치 및 테스트


(인스턴스 생성 및 IP 설정은 이전 게시물 참조 :  오라클 클라우드 무료 체험하기 - Part1 MySql 구축하기)  


블록 스토이지 생성

블록 볼륨(Block Volume) 서비스는 블록 스토리지를 제공하고 관리하는 네트워크 기반 스토리지 서비스이다. VM 인스턴스는 이 블록 스토이지(Block Storage)를 마운트하여 스토리지를 확장하여 사용할 수 있다.  새로운 블록을 생성하고 이를 웹 서버 VM 인스턴스에서 마운트하여 웹 데이터 공간으로 사용할 계획이다. 블록 스토리지를 추가하는 방법은 아래와 같이 3단계가 필요하다.  

① 오라클 클라이우드 콘솔 (Web UI)에서 블록 볼륨 리소스 생성
② 블록 볼륨을 VM 인스턴스에 연결
③ VM 인스턴스에서 블록 볼륨을 파일 시스템으로 마운트



블록은 50GB 크기로 생성했다. 



블록 스토이지 연결

이제 웹 서버 용도로 생성한 VM 인스턴스 에서 생성한 블록을 연결한다.





블록 볼륨과 VM 이 연결되면 "iSCSI 명령 및 정보" 항목을 확인하고 연결을 위한 명령을 복사한다. 


  
  sudo iscsiadm -m node -o new -T iqn.2015-12.com.oracleiaas:b8949530-afa4-4546-a6ff-4b33f67e5a1e -p 169.254.2.2:3260
  
  sudo iscsiadm -m node -o update -T iqn.2015-12.com.oracleiaas:b8949530-afa4-4546-a6ff-4b33f67e5a1e -n node.startup -v automatic
  
  sudo iscsiadm -m node -T iqn.2015-12.com.oracleiaas:b8949530-afa4-4546-a6ff-4b33f67e5a1e -p 169.254.2.2:3260 -l

  
SSH 접속 하여 복사한 iSCSI 명령어를 모두 실행하고 lsblk 명령으로 블록 볼륨이 마운트 되어 있는지 확인한다. 아래의 예에서는 sdb 이름의 50GB 디스크를 확인할 수 있다.
$lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0 46.6G  0 disk 
├─sda1   8:1    0  512M  0 part /boot/efi
├─sda2   8:2    0    8G  0 part [SWAP]
└─sda3   8:3    0 38.1G  0 part /
sdb      8:16   0   50G  0 disk 
다음으로 연결된 블록 볼륨을 사용하기 위하여 ext4 형식으로 디스크를 포맷한다.
$sudo mkfs.ext4 -m 0 -E lazy_itable_init=0,lazy_journal_init=0,discard /dev/sdb
$sudo mkfs.ext4 -m 0 -E lazy_itable_init=0,lazy_journal_init=0,discard /dev/sdb

mke2fs 1.42.9 (28-Dec-2013)
/dev/sdb is entire device, not just one partition!
Proceed anyway? (y,n) y
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=256 blocks
3276800 inodes, 13107200 blocks
0 blocks (0.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2162163712
400 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000, 7962624, 11239424

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done 


이제 마운트할 디렉토리를 생성하고 마운트 한다. ( sdb 를 /data 에 마운트하고 권한을 부여한다. )
$ sudo mkdir /data
$ sudo mount -o discard,defaults /dev/sdb /data
$ sudo chmod a+w /data

마지막으로 /etc/fstab 파일을 수정하여 부팅과 동시에 마운트 되도록 한다.

$ sudo blkid /dev/sdb
/dev/sdb: UUID="3c50667e-98f3-46f9-acfe-1bc10151696c" TYPE="ext4" 
$vi /etc/fstab

UUID=3c50667e-98f3-46f9-acfe-1bc10151696c /data ext4 discard,defaults,noatime,_netdev 0 2


웹 서버 설치

웹서버는 nginx + tomcat 로 구성하여 설치한다. 가장 최신 open jdk 버전을 설치한다. (14.0.2)
   
$sudo yum install java-latest-openjdk-devel.x86_64

$java -version
openjdk version "14.0.2" 2020-07-14
OpenJDK Runtime Environment 20.3 (build 14.0.2+12)
OpenJDK 64-Bit Server VM 20.3 (build 14.0.2+12, mixed mode, sharing)

톰켓 설치는 홈페이지를 방문하여 원하는 버전의 다운로드 링크를 복사한 다음 wget 명령을 사용하여 설치 파일을 다운로드한다.
  

http://apache.tt.co.kr/tomcat/tomcat-8/v8.5.58/bin/apache-tomcat-8.5.58.zip 다운로드가 완료되면 압축을 풀고 원하는 위치로 복사한다. (여기에서는 /data 를 사용했다.)
$wget http://apache.tt.co.kr/tomcat/tomcat-8/v8.5.58/bin/apache-tomcat-8.5.58.zip
$tar -xzvf apache-tomcat-8.5.58.zip
$mv apache-tomcat-8.5.58.zip /data/

nginx 설치를 위해서는 CentOS 7 EPEL 레파지토리를 추가해야 한다. 다음 명령으로 레파지토리를 추가한다. 
 
$sudo yum install epel-release

Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirror.kakao.com
 * epel: ord.mirror.rackspace.com
 * extras: mirror.kakao.com
 * updates: mirror.kakao.com
Resolving Dependencies
--> Running transaction check
---> Package epel-release.noarch 0:7-11 will be updated
---> Package epel-release.noarch 0:7-12 will be an update
--> Finished Dependency Resolution

Dependencies Resolved

=========================================================================================================================================================================================
 Package                                           Arch                                        Version                                   Repository                                 Size
=========================================================================================================================================================================================
Updating:
 epel-release                                      noarch                                      7-12                                      epel                                       15 k

Transaction Summary
=========================================================================================================================================================================================
Upgrade  1 Package

Total download size: 15 k
Is this ok [y/d/N]: y
Downloading packages:
Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
epel-release-7-12.noarch.rpm                                                                                                                                      |  15 kB  00:00:01     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Updating   : epel-release-7-12.noarch                                                                                                                                              1/2 
  Cleanup    : epel-release-7-11.noarch                                                                                                                                              2/2 
  Verifying  : epel-release-7-12.noarch                                                                                                                                              1/2 
  Verifying  : epel-release-7-11.noarch                                                                                                                                              2/2 

Updated:
  epel-release.noarch 0:7-12                                                                                                                                                             
Complete!
이제 nginx 를 설치한다.
sudo yum install nginx
$sudo yum install nginx
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirror.kakao.com
 * epel: ord.mirror.rackspace.com
 * extras: mirror.kakao.com
 * updates: mirror.kakao.com
Resolving Dependencies
--> Running transaction check
---> Package nginx.x86_64 1:1.16.1-2.el7 will be installed
--> Processing Dependency: nginx-all-modules = 1:1.16.1-2.el7 for package: 1:nginx-1.16.1-2.el7.x86_64
--> Processing Dependency: nginx-filesystem = 1:1.16.1-2.el7 for package: 1:nginx-1.16.1-2.el7.x86_64
--> Processing Dependency: nginx-filesystem for package: 1:nginx-1.16.1-2.el7.x86_64
--> Processing Dependency: libprofiler.so.0()(64bit) for package: 1:nginx-1.16.1-2.el7.x86_64
--> Running transaction check
---> Package gperftools-libs.x86_64 0:2.6.1-1.el7 will be installed
---> Package nginx-all-modules.noarch 1:1.16.1-2.el7 will be installed
--> Processing Dependency: nginx-mod-http-image-filter = 1:1.16.1-2.el7 for package: 1:nginx-all-modules-1.16.1-2.el7.noarch
--> Processing Dependency: nginx-mod-http-perl = 1:1.16.1-2.el7 for package: 1:nginx-all-modules-1.16.1-2.el7.noarch
--> Processing Dependency: nginx-mod-http-xslt-filter = 1:1.16.1-2.el7 for package: 1:nginx-all-modules-1.16.1-2.el7.noarch
--> Processing Dependency: nginx-mod-mail = 1:1.16.1-2.el7 for package: 1:nginx-all-modules-1.16.1-2.el7.noarch
--> Processing Dependency: nginx-mod-stream = 1:1.16.1-2.el7 for package: 1:nginx-all-modules-1.16.1-2.el7.noarch
---> Package nginx-filesystem.noarch 1:1.16.1-2.el7 will be installed
--> Running transaction check
---> Package nginx-mod-http-image-filter.x86_64 1:1.16.1-2.el7 will be installed
--> Processing Dependency: gd for package: 1:nginx-mod-http-image-filter-1.16.1-2.el7.x86_64
--> Processing Dependency: libgd.so.2()(64bit) for package: 1:nginx-mod-http-image-filter-1.16.1-2.el7.x86_64
---> Package nginx-mod-http-perl.x86_64 1:1.16.1-2.el7 will be installed
---> Package nginx-mod-http-xslt-filter.x86_64 1:1.16.1-2.el7 will be installed
---> Package nginx-mod-mail.x86_64 1:1.16.1-2.el7 will be installed
---> Package nginx-mod-stream.x86_64 1:1.16.1-2.el7 will be installed
--> Running transaction check
---> Package gd.x86_64 0:2.0.35-26.el7 will be installed
--> Processing Dependency: libXpm.so.4()(64bit) for package: gd-2.0.35-26.el7.x86_64
--> Running transaction check
---> Package libXpm.x86_64 0:3.5.12-1.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

=========================================================================================================================================================================================
 Package                                                   Arch                                 Version                                         Repository                          Size
=========================================================================================================================================================================================
Installing:
 nginx                                                     x86_64                               1:1.16.1-2.el7                                  epel                               562 k
Installing for dependencies:
 gd                                                        x86_64                               2.0.35-26.el7                                   base                               146 k
 gperftools-libs                                           x86_64                               2.6.1-1.el7                                     base                               272 k
 libXpm                                                    x86_64                               3.5.12-1.el7                                    base                                55 k
 nginx-all-modules                                         noarch                               1:1.16.1-2.el7                                  epel                                20 k
 nginx-filesystem                                          noarch                               1:1.16.1-2.el7                                  epel                                21 k
 nginx-mod-http-image-filter                               x86_64                               1:1.16.1-2.el7                                  epel                                30 k
 nginx-mod-http-perl                                       x86_64                               1:1.16.1-2.el7                                  epel                                39 k
 nginx-mod-http-xslt-filter                                x86_64                               1:1.16.1-2.el7                                  epel                                29 k
 nginx-mod-mail                                            x86_64                               1:1.16.1-2.el7                                  epel                                57 k
 nginx-mod-stream                                          x86_64                               1:1.16.1-2.el7                                  epel                                85 k

Transaction Summary
=========================================================================================================================================================================================
Install  1 Package (+10 Dependent packages)

Total download size: 1.3 M
Installed size: 4.0 M
Is this ok [y/d/N]: y
Downloading packages:
(1/11): gd-2.0.35-26.el7.x86_64.rpm                                                                                                                               | 146 kB  00:00:00     
(2/11): libXpm-3.5.12-1.el7.x86_64.rpm                                                                                                                            |  55 kB  00:00:00     
(3/11): gperftools-libs-2.6.1-1.el7.x86_64.rpm                                                                                                                    | 272 kB  00:00:00     
(4/11): nginx-1.16.1-2.el7.x86_64.rpm                                                                                                                             | 562 kB  00:00:01     
(5/11): nginx-all-modules-1.16.1-2.el7.noarch.rpm                                                                                                                 |  20 kB  00:00:00     
(6/11): nginx-filesystem-1.16.1-2.el7.noarch.rpm                                                                                                                  |  21 kB  00:00:00     
(7/11): nginx-mod-http-image-filter-1.16.1-2.el7.x86_64.rpm                                                                                                       |  30 kB  00:00:00     
(8/11): nginx-mod-http-perl-1.16.1-2.el7.x86_64.rpm                                                                                                               |  39 kB  00:00:00     
(9/11): nginx-mod-http-xslt-filter-1.16.1-2.el7.x86_64.rpm                                                                                                        |  29 kB  00:00:00     
(10/11): nginx-mod-mail-1.16.1-2.el7.x86_64.rpm                                                                                                                   |  57 kB  00:00:00     
(11/11): nginx-mod-stream-1.16.1-2.el7.x86_64.rpm                                                                                                                 |  85 kB  00:00:00     
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                                                    383 kB/s | 1.3 MB  00:00:03     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : gperftools-libs-2.6.1-1.el7.x86_64                                                                                                                                   1/11 
  Installing : 1:nginx-filesystem-1.16.1-2.el7.noarch                                                                                                                               2/11 
  Installing : libXpm-3.5.12-1.el7.x86_64                                                                                                                                           3/11 
  Installing : gd-2.0.35-26.el7.x86_64                                                                                                                                              4/11 
  Installing : 1:nginx-mod-stream-1.16.1-2.el7.x86_64                                                                                                                               5/11 
  Installing : 1:nginx-mod-http-xslt-filter-1.16.1-2.el7.x86_64                                                                                                                     6/11 
  Installing : 1:nginx-mod-http-perl-1.16.1-2.el7.x86_64                                                                                                                            7/11 
  Installing : 1:nginx-mod-mail-1.16.1-2.el7.x86_64                                                                                                                                 8/11 
  Installing : 1:nginx-1.16.1-2.el7.x86_64                                                                                                                                          9/11 
  Installing : 1:nginx-mod-http-image-filter-1.16.1-2.el7.x86_64                                                                                                                   10/11 
  Installing : 1:nginx-all-modules-1.16.1-2.el7.noarch                                                                                                                             11/11 
  Verifying  : libXpm-3.5.12-1.el7.x86_64                                                                                                                                           1/11 
  Verifying  : 1:nginx-mod-stream-1.16.1-2.el7.x86_64                                                                                                                               2/11 
  Verifying  : 1:nginx-filesystem-1.16.1-2.el7.noarch                                                                                                                               3/11 
  Verifying  : 1:nginx-all-modules-1.16.1-2.el7.noarch                                                                                                                              4/11 
  Verifying  : gperftools-libs-2.6.1-1.el7.x86_64                                                                                                                                   5/11 
  Verifying  : 1:nginx-mod-http-image-filter-1.16.1-2.el7.x86_64                                                                                                                    6/11 
  Verifying  : gd-2.0.35-26.el7.x86_64                                                                                                                                              7/11 
  Verifying  : 1:nginx-mod-http-xslt-filter-1.16.1-2.el7.x86_64                                                                                                                     8/11 
  Verifying  : 1:nginx-mod-http-perl-1.16.1-2.el7.x86_64                                                                                                                            9/11 
  Verifying  : 1:nginx-mod-mail-1.16.1-2.el7.x86_64                                                                                                                                10/11 
  Verifying  : 1:nginx-1.16.1-2.el7.x86_64                                                                                                                                         11/11 

Installed:
  nginx.x86_64 1:1.16.1-2.el7                                                                                                                                                            

Dependency Installed:
  gd.x86_64 0:2.0.35-26.el7               gperftools-libs.x86_64 0:2.6.1-1.el7               libXpm.x86_64 0:3.5.12-1.el7               nginx-all-modules.noarch 1:1.16.1-2.el7          
  nginx-filesystem.noarch 1:1.16.1-2.el7  nginx-mod-http-image-filter.x86_64 1:1.16.1-2.el7  nginx-mod-http-perl.x86_64 1:1.16.1-2.el7  nginx-mod-http-xslt-filter.x86_64 1:1.16.1-2.el7 
  nginx-mod-mail.x86_64 1:1.16.1-2.el7    nginx-mod-stream.x86_64 1:1.16.1-2.el7            

Complete!
설치가 완료되면 아래와 같이 http, https 포트에 대한 방화벽을 오픈한다.
#sudo firewall-cmd --zone=public --permanent --add-service=http
#sudo firewall-cmd --zone=public --permanent --add-service=https
#sudo firewall-cmd --reload 


참고로 nginx 의 웹 루트는 /data/www 로 변경하였고 톰켓의 웹 프로그램은 /data/webapps/ 로 변경하였다. 이제 nginx 를 시작한다.
sudo systemctl start nginx

웹 브라우져를 통하여 사이트를 접속하니 퍼미션 오류가 기다리고 있었다. 먼저 보안 관련 이슈를 확인하기 위하여 /var/log/audit/audit.log 로그를 확인했고 아래의 보안 이슈를 확인하게 되었다.
type=AVC msg=audit(1601820483.230:3808): avc:  denied  { read } for  pid=4741 comm="nginx" name="index.html" dev="sdb" ino=2359732 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:unlabeled_t:s0 tclass=file permissive=0
type=SYSCALL msg=audit(1601820483.230:3808): arch=c000003e syscall=2 success=no exit=-13 a0=5571a0b1bc1a a1=800 a2=0 a3=55719f96d110 items=0 ppid=4740 pid=4741 auid=4294967295 uid=994 gid=992 euid=994 suid=994 fsuid=994 egid=992 sgid=992 fsgid=992 tty=(none) ses=4294967295 comm="nginx" exe="/usr/sbin/nginx" subj=system_u:system_r:httpd_t:s0 key=(null)
type=PROCTITLE msg=audit(1601820483.230:3808): proctitle=6E67696E783A20776F726B65722070726F63657373

audit2why 명령을 사용하여 원인을 확인해 본다. 보다 정확한 원인 및 조치방법을 알기위하여 웹 검색 결과 SELinux 보안이 이슈의 원인인 것으로 확인 할 수 있었다.
  
$sudo grep 1601820483.230:3808 /var/log/audit/audit.log | audit2why

	Was caused by:
		Missing type enforcement (TE) allow rule.

		You can use audit2allow to generate a loadable module to allow this access.
 
$semanage fcontext -a -t httpd_sys_content_t /usr/share/nginx/html/studio(/.*)?
$restorecon -Rv /www

❶ 톰켓과 프록시 연결시 오류는 → (13: Permission denied) while connecting to upstream:[nginx] 아래 명령을 통하여 해결 할 수 있었다.
setsebool -P httpd_can_network_connect

❷ /data/www 경로에 대한 접근 권한 오류는 아래와 같은 명령을 통하여 해결 할 수 있었다.
  
$chcon -Rt httpd_sys_content_t /data/www


익숙한 httpd 를 사용하지 않은 것은 클라우드 서버의 성능을 고려하여 적은 자원을 사용한다고 알려진 nginx 를 사용하게 되었는데 nginx 설치는 처음이라 보안 관련 이슈를 해결하는 과정에서 많은 시간을 소요하였다. 


참고자료

2020년 10월 4일

오라클 클라우드 무료 체험하기 - Part1 MySql 구축하기

무료로 클라우드 서비스 이용이 가능하다는 글을 접하고 자체 서버를 이용하여 운영하던 개발 환경을 클라우드 환경으로 변경하고자 시도하였다. 클라우드라 하여 특별한 것은 없었고 용어 또는 논리적인 개념의 이해가 요구되었다. 처음 클라우드 서비스를 접하는 거지만 많은 인터넷 자료들이 있고 과거 물리적 서버 구축 경험이 있어 실재 구축은 1시간 정도 소요된 것 같다.

오라클 클라우드

본 글에서는 클라우드 서비스를 기반으로 WEB/WAS 서버와 DBMS 서버 구현 작업을 계획하였다. 무료 오라클 클라우드는 아래와 같은 순서의 작업을 통하여 이용할 수 있다.(→ MySql 서버 생성 포함) 

① Oracle Cloud 계정 생성

② VM 인스터스 생성 (CentOS 7.x)

③ 원격 접속 

④ MySql 설치

⑤ VM 인스턴스  공인 IP 및 방화벽 설정

⑥ 로컬에서 MySQLWorkbench 툴을 이용한 MySql 접속


Oracle Cloud 계정 생성

계정 생성을 위하여 아래 홈페이지를 방문한다. 

https://www.oracle.com/kr/cloud/


Oracle Cloud Tier 무료체험하기 버튼을 클릭하여 계정을 생성한다. (계정 생성을 위해서는 주소, 모바일 인증 그리고 신용카드 등록이 필요하다.)

계정 생성이 완료되면 자동으로 클라우드 서비스 관리를 위한 웹 콘솔로 이동된다.


인스턴스 생성하기

웹 콘솔에서 VM 인스턴스 생성 을 클릭한다.


OS 이미지는 디폴트로 Oracle Linux 선택되어 있지만 변경이 가능하고 평소 사용하던 CentOS 를 선택하였다. 


리눅스 인스턴스의 경우는 원격 접속을 위하여 비밀번호 대신 SSH 키쌍을 사용하도록 되어 있다. 원격 접속 작업을 위하여 전용 키를 다운로드 한다.



인스턴스 생성이 완료되면 IP 와 계정을 확인 한다.



리모트 접속

리모트 접속은 인스턴스 생성 과정에서 다운로드한 SSH 키파일, 아이디 그리고 IP 를 이용하여 아래와 같이 접속할 수 있다. 개발 환경이 맥을 사용하고 있어 내장된 ssh  프로그램을 사용하였다.

ssh -i [키파일 경로] [아이디]@[IP]
 
ssh -i ssh-key-2020-10-03.key opc@xxx.xxx.xxx.xxx
The authenticity of host 'xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx)' can't be established.
ECDSA key fingerprint is SHA256:cb0AAC47vug6I8sNC7NPaIswm1+Xulwx8SAATP9D4+c. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added 'xxx.xxx.xxx.xxx' (ECDSA) to the list of known hosts.

MySql 설치

MySQL 을 yum 명령을 사용하여 설치하게되면 (실제) MariaDB 가 설치된다. 

sudo yum install mysql
 sudo yum install mysql
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirror.kakao.com
 * epel: d2lzkl7pfhq30w.cloudfront.net
 * extras: mirror.kakao.com
 * updates: mirror.kakao.com
Resolving Dependencies
--> Running transaction check
---> Package mariadb.x86_64 1:5.5.65-1.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

========================================================================================================================================
 Package                        Arch                          Version                                 Repository                   Size
========================================================================================================================================
Installing:
 mariadb                        x86_64                        1:5.5.65-1.el7                          base                        8.7 M

Transaction Summary
========================================================================================================================================
Install  1 Package

Total download size: 8.7 M
Installed size: 49 M
Is this ok [y/d/N]:  y
Downloading packages:
mariadb-5.5.65-1.el7.x86_64.rpm                                                                                  | 8.7 MB  00:00:01     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : 1:mariadb-5.5.65-1.el7.x86_64                                                                                        1/1 
  Verifying  : 1:mariadb-5.5.65-1.el7.x86_64                                                                                        1/1 

Installed:
  mariadb.x86_64 1:5.5.65-1.el7                                                                                                         

Complete!

 
필요한것은 MySql Community Edition이기 때문에 설치된 Maria DB 를 삭제한다.
[opc@instance-20201003-1526 ~]$grep -i -e maria
mariadb.x86_64                         1:5.5.65-1.el7                 @base     
mariadb-libs.x86_64                    1:5.5.65-1.el7                 @anaconda 

[opc@instance-20201003-1526 ~]$yum remove mariadb-libs.x86_64 mariadb.x86_64
Loaded plugins: fastestmirror, langpackssudo 
Resolving Dependencies
--> Running transaction check
---> Package mariadb.x86_64 1:5.5.65-1.el7 will be erased
---> Package mariadb-libs.x86_64 1:5.5.65-1.el7 will be erased
--> Processing Dependency: libmysqlclient.so.18()(64bit) for package: 2:postfix-2.10.1-9.el7.x86_64
--> Processing Dependency: libmysqlclient.so.18(libmysqlclient_18)(64bit) for package: 2:postfix-2.10.1-9.el7.x86_64
--> Running transaction check
---> Package postfix.x86_64 2:2.10.1-9.el7 will be erased
--> Finished Dependency Resolution

Dependencies Resolved

===========================================================================================================================================================
 Package                               Arch                            Version                                    Repository                          Size
===========================================================================================================================================================
Removing:
 mariadb                               x86_64                          1:5.5.65-1.el7                             @base                               49 M
 mariadb-libs                          x86_64                          1:5.5.65-1.el7                             @anaconda                          4.4 M
Removing for dependencies:
 postfix                               x86_64                          2:2.10.1-9.el7                             @anaconda                           12 M

Transaction Summary
===========================================================================================================================================================
Remove  2 Packages (+1 Dependent package)

Installed size: 65 M
Is this ok [y/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Erasing    : 1:mariadb-5.5.65-1.el7.x86_64                                                                                                           1/3 
  Erasing    : 2:postfix-2.10.1-9.el7.x86_64                                                                                                           2/3 
  Erasing    : 1:mariadb-libs-5.5.65-1.el7.x86_64                                                                                                      3/3 
  Verifying  : 1:mariadb-libs-5.5.65-1.el7.x86_64                                                                                                      1/3 
  Verifying  : 2:postfix-2.10.1-9.el7.x86_64                                                                                                           2/3 
  Verifying  : 1:mariadb-5.5.65-1.el7.x86_64                                                                                                           3/3 

Removed:
  mariadb.x86_64 1:5.5.65-1.el7                                             mariadb-libs.x86_64 1:5.5.65-1.el7                                            

Dependency Removed:
  postfix.x86_64 2:2.10.1-9.el7                                                                                                                            

Complete!


MySQL 8.0 Community Edition 설치는 설치 소스에 대한 YUM 레파지토리를 추가하고 진행하면 된다.

[opc@instance-20201003-1526 ~]$ wget http://repo.mysql.com/mysql80-community-release-el7-1.noarch.rpm
--2020-10-03 08:22:41--  http://repo.mysql.com/mysql80-community-release-el7-1.noarch.rpm
Resolving repo.mysql.com (repo.mysql.com)... 104.76.84.199
Connecting to repo.mysql.com (repo.mysql.com)|104.76.84.199|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 25820 (25K) [application/x-redhat-package-manager]
Saving to: ‘mysql80-community-release-el7-1.noarch.rpm’

100%[=================================================================================================================>] 25,820      --.-K/s   in 0.003s  

2020-10-03 08:22:41 (8.12 MB/s) - ‘mysql80-community-release-el7-1.noarch.rpm’ saved [25820/25820]

[opc@instance-20201003-1526 ~]$ sudo rpm -ivh mysql80-community-release-el7-1.noarch.rpm
경고: mysql80-community-release-el7-1.noarch.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
준비 중...                         ################################# [100%]
Updating / installing...
   1:mysql80-community-release-el7-1  ################################# [100%]
   
[opc@instance-20201003-1526 ~]$ sudo yum install mysql-server
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirror.kakao.com
 * epel: d2lzkl7pfhq30w.cloudfront.net
 * extras: mirror.kakao.com
 * updates: mirror.kakao.com
mysql-connectors-community                                                                                                          | 2.5 kB  00:00:00     
mysql-tools-community                                                                                                               | 2.5 kB  00:00:00     
mysql80-community                                                                                                                   | 2.5 kB  00:00:00     
(1/3): mysql-tools-community/x86_64/primary_db                                                                                      |  76 kB  00:00:00     
(2/3): mysql-connectors-community/x86_64/primary_db                                                                                 |  62 kB  00:00:00     
(3/3): mysql80-community/x86_64/primary_db                                                                                          | 115 kB  00:00:00     
Resolving Dependencies
--> Running transaction check
---> Package mysql-community-server.x86_64 0:8.0.21-1.el7 will be installed
--> Processing Dependency: mysql-community-common(x86-64) = 8.0.21-1.el7 for package: mysql-community-server-8.0.21-1.el7.x86_64
--> Processing Dependency: mysql-community-client(x86-64) >= 8.0.11 for package: mysql-community-server-8.0.21-1.el7.x86_64
--> Running transaction check
---> Package mysql-community-client.x86_64 0:8.0.21-1.el7 will be installed
--> Processing Dependency: mysql-community-libs(x86-64) >= 8.0.11 for package: mysql-community-client-8.0.21-1.el7.x86_64
---> Package mysql-community-common.x86_64 0:8.0.21-1.el7 will be installed
--> Running transaction check
---> Package mysql-community-libs.x86_64 0:8.0.21-1.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

===========================================================================================================================================================
 Package                                     Arch                        Version                              Repository                              Size
===========================================================================================================================================================
Installing:
 mysql-community-server                      x86_64                      8.0.21-1.el7                         mysql80-community                      499 M
Installing for dependencies:
 mysql-community-client                      x86_64                      8.0.21-1.el7                         mysql80-community                       48 M
 mysql-community-common                      x86_64                      8.0.21-1.el7                         mysql80-community                      617 k
 mysql-community-libs                        x86_64                      8.0.21-1.el7                         mysql80-community                      4.5 M

Transaction Summary
===========================================================================================================================================================
Install  1 Package (+3 Dependent packages)

Total download size: 551 M
Installed size: 2.5 G
Is this ok [y/d/N]: y
Downloading packages:
경고: /var/cache/yum/x86_64/7/mysql80-community/packages/mysql-community-common-8.0.21-1.el7.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
Public key for mysql-community-common-8.0.21-1.el7.x86_64.rpm is not installed
(1/4): mysql-community-common-8.0.21-1.el7.x86_64.rpm                                                                               | 617 kB  00:00:00     
(2/4): mysql-community-libs-8.0.21-1.el7.x86_64.rpm                                                                                 | 4.5 MB  00:00:04     
(3/4): mysql-community-client-8.0.21-1.el7.x86_64.rpm                                                                               |  48 MB  00:00:15     
(4/4): mysql-community-server-8.0.21-1.el7.x86_64.rpm                                                                                                                                                                          | 499 MB  00:01:44     
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                                                                                                                 5.0 MB/s | 551 MB  00:01:49     
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
Importing GPG key 0x5072E1F5:
 Userid     : "MySQL Release Engineering "
 Fingerprint: a4a9 4068 76fc bd3c 4567 70c8 8c71 8d3b 5072 e1f5
 Package    : mysql80-community-release-el7-1.noarch (installed)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
Is this ok [y/N]:  y
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Warning: RPMDB altered outside of yum.
  Installing : mysql-community-common-8.0.21-1.el7.x86_64                                                                                                                                                                                               1/4 
  Installing : mysql-community-libs-8.0.21-1.el7.x86_64                                                                                                                                                                                                 2/4 
  Installing : mysql-community-client-8.0.21-1.el7.x86_64                                                                                                                                                                                               3/4 
  Installing : mysql-community-server-8.0.21-1.el7.x86_64                                                                                                                                                                                               4/4 
  Verifying  : mysql-community-server-8.0.21-1.el7.x86_64                                                                                                                                                                                               1/4 
  Verifying  : mysql-community-client-8.0.21-1.el7.x86_64                                                                                                                                                                                               2/4 
  Verifying  : mysql-community-common-8.0.21-1.el7.x86_64                                                                                                                                                                                               3/4 
  Verifying  : mysql-community-libs-8.0.21-1.el7.x86_64                                                                                                                                                                                                 4/4 

Installed:
  mysql-community-server.x86_64 0:8.0.21-1.el7                                                                                                                                                                                                              
Dependency Installed:
  mysql-community-client.x86_64 0:8.0.21-1.el7  mysql-community-common.x86_64 0:8.0.21-1.el7 mysql-community-libs.x86_64 0:8.0.21-1.el7                                       

Complete!

자세한 설치는 CentOS 7.x 에서 MySQL 8.x 설치하기 참조.
 
사용된 mysql 설정 : /etc/my.cnf
데이터베이스 및 계정 생성 스크립트 : database-mysql.sql 

VM 인스턴스  공인 IP 및 방화벽 설정

mysql 서버가 설치된 인스턴스를 외부에서 사용할 수 있도록 공인 IP 와 방화벽 설정을 추가했다.

❶ 인스턴스에 공인 IP 를 할당하기 위하여  네크워킹> IP 관리 메뉴에서 새로운 공인 IP 주소를 예약한다. (Reserve Public IP Address)






❷ 컴퓨트 > 인스턴스 > 인스턴스 세부정보 > 연결된 VNIC(Virtual Network Interface Cards) 메뉴에서 새로운 VNIC 추가하여 인스턴스에 공인 IP 를 할당한다.




❸ 컴퓨트 > 인스턴스 > 인스턴스 세부정보 에서 공용 서브넷 을 클릭하여 공용 서브넷 관리 화면으로 이동한다.



디폴트로 생성되어 있는 보안 목록을 클릭하고 


MySql 서버에 대한 외부 접속 허용을 위하여 3306 포트에 대한 수신 규칙을 추가한다.
 


이로써 3306 포트로 외부에서 MySql 서버에 대한 통신이 허용된다. 

MySql Workbench 에서 접속한 화면 예시

MySql Workbench 에서 접속한 화면 예시