● 프로젝트명 : 국내 최대 산부인과 산전진단(NIPT) 시스템 개발 및 납품 / 완료

 

● 개발 기간 : 1개월 / 2020.07 / 긴급 개발 

 

● 투입 인력 : 단독 

 

● 개발 내용 : 차병원 전용 LIMS 개발 및 OS단 Python 기반 NIPT 파이프라인 환경 구축

 

● 개발 환경 

- Sun Grid 엔진 사용 분산 연산

- Ion Torrent 장비 연계 Fastaq 파일 자동 복제 NIPT 자동 분석 

- 반응형 / Bootstrap 

- UI에서 대량 연산(qsub) 모니터링 기능 개발

- 서버에서 웹디몬(Background Service) 사용 / lynx / 림스 결과지 PDF 자동 생성

- PHP, MariaDB, PhpSpreadsheet, pdfviewer, wkhtmltopdf

 

● 기타

2020.08 안정화 및 유지보수

 

 

 

 

 

'PROJECT' 카테고리의 다른 글

KT&G 모바일 시스템  (0) 2021.12.22
유전자 분석앱 플랫폼 개발  (0) 2021.12.22
벼, 오이 등 작물 품종 비교 분석 플랫폼  (0) 2021.12.22
유전자 분석 플랫폼 개발  (0) 2021.12.22
Posted by 하리하라​
:

1. PHP 다운로드 
1) https://windows.php.net/download/
2) VC16 x64 Thread Safe "Zip" 다운로드

* 2021.12.22 Last Version 8.1.1

* 2023.09.15 기준 PhpSpreadsheet, PHP 7.4 이상에서 동작하지 않음

 


2. MariaDB 다운로드
1) https://mariadb.com/downloads/

2) 무료 버전(Community Server) 다운로드

* 2021.12.22 Last Version 10.6.5

* DB 복구 또는 실행 시 확인 문제

· 문제 : error 1728 (hy000) at line 14224: cannot load from mysql.proc. the table is probably corrupted
· 확인 : MariaDB 10.6.0 에서 복구시 mysql.proc 테이블 균열이 있다는 오류
· 해결 : MariaDB 10.6.5 버전으로 재설치

 

3. Apache 다운로드
1) https://www.apachelounge.com/download/

* 2021.12.22 Last Version 2.4.52

 


4. Tomcat 다운
로드
1) https://tomcat.apache.org/
2) 실행 버전으로 다운로드 / 이클립스 별개로 apache 구동 시 자동 연계 시작 필요

* 2021.12.22 Last Version 10.0.14 / apache-tomcat-10.0.14.exe 

 


5. Apache 해당 버전 + Tomcat 커넥터 다운로드
1) https://www.apachelounge.com/download/
2) Apache 버전에 맞는 mod_jk 다운로드
3) 압축풀어 "mod_jk.so" 파일 확인

* 2021.12.22 Last Version 1.2.48 / mod_jk-1.2.48-win64-vs16.zip

 

 

6. JDK(Java Development Kit) 다운로드
1) http://jdk.java.net/
2) 압축풀기
3) 대상파일 경로 배치
4) java path 설정
5) java, javac 확인

 


7. 이클립스 다운로드
1) 스프링 STS 다운로드 : https://spring.io/tools / 최신은 IDE용으로만 배포 / *.jar 압축 파일 풀면 실행 파일 존재
2) 스프링 STS 과거 IDE 버전 :  https://github.com/spring-projects/sts4/wiki/Previous-Versions
3)  PHP용 다운로드 : https://www.eclipse.org/

 


8. 기본 설치
1) 톰켓 실행 파일 클릭 설치
2) MariaDB 설치

3) MySQL path 설정
4) PHP 압축 풀고 경로 배치
5) apache 압축 풀고 경로 배치
6) 이클립스 PHP 압축 풀고 경로 배치
7) 이클립스 STS(*.jar) 압축 풀고 경로 배치 / jar 파일 더블 클릭하면 자동 압축 풀림

 


9. Apache 설치
1) httpd.conf 수정

- ServerName 필히 설정
- ServerRoot "C:/APM/Apache24"
- 홈디렉토리 설정 / DocumentRoot & <Directory
- 443를 이용하기 위한 아래 항목 주석 해지
  · LoadModule ssl_module modules/mod_ssl.so
  · LoadModule socache_shmcb_module modules/mod_socache_shmcb.so

2) 관리자 권한으로 cmd 실행
3) 서비스 등록 : httpd.exe -k install
4) 서비스 시작 : httpd.exe -k start
* VCRUNTIME140.dll 오류 해결 : http://www.microsoft.com/en-us/download/details.aspx?id=48145

 


10. PHP 연동 

 

1) httpd.conf 수정 / PHP 8.x 기준

PHPIniDir "c:\DEV\php8"
LoadModule php_module "c:\DEV\php8\php8apache2_4.dll"
AddHandler application/x-httpd-php .php
AddType application/x-httpd-php .php .html

* httpd.conf 수정 / PHP 7.x 기준

   - LoadModule php7_module "c:/???/php7/php7apache2_4.dll"
   - php7apache2_4.dll 파일이 없을 경우 PHP 쓰레드 버전 다시 다운로드 필요
   - AddType application/x-httpd-php .php .html
   - AddHandler application/x-httpd-php .php .html

** 7.x 에서는 php7_module 로 호출하고 8.x에서는 버전이 빠진 php_module 로 호출

 

- PHPIniDir "c:/APM/php8" : 해당 경로 php.ini 사용, php.ini 설정이 적용되지 않을 경우 phpinfo(); 경로 확인 필요
- 인덱스 페이지 추가 : index.php
- 윈도우 경우 그냥 PHPIniDir 설정하지 않고 phpinfo()에서 나오는 곳에 셋업
* 위 경우 php.ini에서 ext 경로 절대 경로로 지정

 

2) php.ini 수정
- extension_dir ="에 php ext 경로 지정(상대 인식 못할 경우 절대 경로 지정) 
- extension=php_pdo_mysql.dll 주석 삭제 등 필요 라이브러리 주석 해지

- PHP data() 함수를 위한 기본 시간 설정 / date.timezone = "Asia/Seoul";

 

* Apache 윈도우에서 무진장 느릴 때, Apache error.log 보면 다음과 같은 오류 확인

(OS 64)지정된 네트워크 이름을 더 이상 사용할 수 없습니다.  : AH00341: winnt_accept: Asynchronous AcceptEx failed.

· 이 경우 아래와 같이 http.conf 정보 설정

· EnableMMAP off
· EnableSendfile on
· AcceptFilter http none
· AcceptFilter https none

아래 각 항목을 찾아 업로드 용량 제한을 설정한다.

max_execution_time = 30 	#저장 처리 시 업로드 시간 포함, 최대 실행 시간 / 초과시 오류
memory_limit = 128M			#메모리 최대 사용 제한 
post_max_size  = 100M		#POST 전송 데이터 최대 싸이즈
file_uploads = On			#업로드 서용
upload_max_filesize = 50M	#업로드 파일 최대 용량
max_file_uploads = 20		#한번 업로드 최대 파일 개수 단뒤 / 동시 업로드 20개 초과 시 오류

 

11) Apache + Tomcat 연동

 

1) 위에서 받은 연동 파일 "mod_jk.so" 아파치 웹서버 "C:\APM\Apache24\modules" 식의 경로의 모듈 폴더에 복사

 

2) httpd.conf 경로에 "workers.properties" 파일 생성

 

3) 해당 파일에 아래 기술 / httpd-2.4.27-Win64-VC15 기준(2.4.30 등 버전이 다름 설정 방법 바뀜) / 아이피 변경 필요

worker.list=ajp13
worker.ajp13.port=8009
worker.ajp13.host=localhost
worker.ajp13.type=ajp13

 

4) httpd.conf  파일 열어 아래 구문 추가

LoadModule jk_module modules/mod_jk.so
JkWorkersFile "conf/workers.properties"
JkLogFile "logs/mod_jk_%y%m%.log"
JkMount /API/* ajp13

JkLogLevel error
JkLogStampFormat "[%a %b %d %H:%M:%s %Y] "
JkRequestLogFormat "%w %V %T"

* "/API/*" 설정으로 인하여 해당 폴더에 있는 모든 리소스는 WAS에서 실행되며 해당 폴더가 아닌 경우 웹서버에서 실행

 

5) 톰켓도 연동 정보 수정
server.xml 열어 "8009"로 검색하여 아래 내용 추가

<Connector protocol="AJP/1.3" port="8009" redirectPort="8443" /> 부분 주석은 풀지 말고 냅두고
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" secretRequired="false" URIEncoding="UTF-8" />

기존 주석 부분은 톰켓만 쓰면  문제가 없는데 아파치 연동시 보안 문제로 아래 오류 발생
Service Unavailable.
The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.

또 개선된 아래 구문을 쓴다면
<Connector port="8009" protocol="AJP/1.3" secretRequired="false" packetSize="65536" tomcatAuthentication="false" URIEncoding="UTF-8" />

톰켓10 버전 기준(2020.03.26) 아래 오류 발생
Bad Gateway
The proxy server received an invalid response from an upstream server.

6) 각 서버 재시작 후
- 웹서버(80) 리소스 로딩 개별 확인
- 톰켓 8080 포트로 리소스 로딩 확인
- 웹서버(80)에서 톰켓 jsp 로딩 확인
- 혹 오류나면 "실행 > 이벤트 뷰어"를 통해 응용프로그램 로그 확인해보고 내용이 없다면
- 웹서버 로그 폴더에 mod_jk.log 내용 확인 필요
- 5번 가지고 최근 2시간 허비. 해결은 mod_jk 로그에서 아래 로그보고 해결
[Thu Mar 26 10:22:37.588 2020] [10592:7608] [error] ajp_send_request::jk_ajp_common.c (1725): (ajp13) connecting to backend failed. Tomcat is probably not started or is listening on the wrong port (errno=61)\
- 내용은 결국 ajp를 처리 못한다는 얘기인데 구글링 하니
- 톰켓 CVE-2020-1938 취약점 보고가 확인되어 톰켓 8, 9버전 등 모두 마이너 버전 업데이트 했다고 나오며
- Connector에 “secretRequired=”false" 를 추가하라는 말 있음
- 이를 착안하여 해결

 

7) SSL(443) 아피치 쪽에서 jsp 확장자 인식 처리 / 톰켓으로 분기

<VirtualHost *:443>
	DocumentRoot "e:/workspace/{context}"
	ServerName xxx.xxx.xxx:443
	ErrorLog "logs/xxx_xxx_xxx_https_error.log"
	CustomLog "logs/xxx_xxx_xxx_access.log" common
	SSLEngine on
	SSLCertificateFile ssl/xxx_xxx_xxx.crt
	SSLCertificateKeyFile ssl/xxx_xxx_xxx.key
	
	JkMount /*.jsp ajp13

	<Directory "e:/workspace/{contenxt}">
		AllowOverride FileInfo AuthConfig Limit Indexes
		Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
		<Limit GET POST OPTIONS>
			Require all granted
		</Limit>
		<LimitExcept GET POST OPTIONS>
			Require all granted
		</LimitExcept>
	</Directory>
</VirtualHost>

 

 

● 세션 유지 문제 / HTTP & HTTP Session Share
Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure;SameSite=None
#해당 구문이 기술되어 있으면 https는 유지가 되나 http에서는 세션 유지가 되지 않음

 

 

● PHP, php 확장자 숨길 때 httpd.conf(리눅스 경우 apache2.conf 파일) 설정

Options Indexes FollowSymLinks MultiViews
AddType application/x-httpd-php .php .jsp
Require all granted
AllowOverride FileInfo

 

 

● MariaDB 대소문자 구분 및 스케줄러 동작 활성화 / my.ini 아래 내용 추가

lower_case_table_names = 2
event_scheduler = ON

 

 


 

● 이하 Spring Boot 4 연계 시

ajp13.ajp.protocol=AJP/1.3
ajp13.ajp.port=8009   //포트는 Apache 웹서버workers.properties에서 해당 context 포트와 동일
ajp13.ajp.enabled=true

 

● Configuration 설정

package com.common.main.config;

import org.apache.catalina.connector.Connector;
import org.apache.coyote.ajp.AbstractAjpProtocol;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class ContainerConfig {

	@Value("${ajp13.ajp.protocol}")
	String ajpProtocal;
	
	@Value("${ajp13.ajp.port}")
	int ajpPort;
	
	@Bean
	public ServletWebServerFactory servletContainer() {
		TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
		tomcat.addAdditionalTomcatConnectors(createAjpConnector());
		return tomcat;
	}
	
	private Connector createAjpConnector() {
		Connector ajpConnector = new Connector(ajpProtocal);
		ajpConnector.setPort(ajpPort);
		ajpConnector.setSecure(false);
		ajpConnector.setAllowTrace(false);
		ajpConnector.setScheme("http");
		((AbstractAjpProtocol<?>)ajpConnector.getProtocolHandler()).setSecretRequired(false);
		return ajpConnector;
	}
}

 

Posted by 하리하라​
:

● CPU 전체 정보 확인 
> $ cat /proc/cpuinfo

●  CPU 코어 수 확인
> $ cat /proc/cpuinfo | grep processor | wc -l
 
● 논리 코어 수 확인
> $ grep -c processor /proc/cpuinfo


● 물리 CPU 개수 확인
> $ grep "physical id" /proc/cpuinfo | sort -u | wc -l

● CPU당 물리 코어 수 확인
> $ grep "cpu cores" /proc/cpuinfo | tail -1

● 우분투 그래픽 카드 GPU 확인 방법
> $ lspci | grep -i VGA

● 혹은 / 관련 명령어 설치 필요
> $ nvidia-smi --query | fgrep 'Product Name'

● 특정 서비스 포트 서비스 확인 
> netstat -anp | grep LISTEN | grep ssh

● 정규식으로 파일 특정 내용 찾기
> cat /etc/ssh/sshd_config | egrep ^\#?Port 

 

● CPU 온도 확인

> 

●  하드웨어 온도 측정도구
> apt-get install hddtemp

● hddtemp 환경설정
> dpkg-reconfigure hddtemp

 

● Command 백그라운드 실행

- 백그라운드(배치) 실행(터미널 끊기면 종료됨) : [명령어] &
- 백그라운드 실행(터미널 끊김과 상관 없음) : nohup [명령어] &

- Screen 명령어 이용 - 강추

 

● Screen 사용 방법 

- 백그라운드 명령어 실행 전에 다음 실행 : screen -S [세션명]

- 백그라운드 명령어 실행 후 : "Ctrl + a + d" 누름 명렁어 수행한 상태로 빠져나옴

- 다시 이쪽으로 갈 때는 : screen -R [세션명]

- 만들어진 세션명 확인 : screen -list

 

● 사용자 생성 및 삭제

- 생성 : sudo useradd [사용자 아이디] -d /home/[사용자 폴더] -m 

- 사용자 비밀번호 설정 : sudo passwd [사용자 아이디]

- 홈디렉토리 삭제 : sudo rm -f -r [사용자 폴더명]

- 사용자 삭제 : sudo userdel [사용자 아이디]

- 사용자 sudo 권한 부여 : sudo usermod -a -G sudo [사용자 아이디]

- 사용자 bash 권한 부여 : sudo usermod -s /bin/bash

 

● 윈도우 CLI(명령어) 기반 리눅스로 파일 복제

- scp [복제 파일명] -P [ssh 포트] [계정아이디]@[IP ADDR]:[복제 대상 폴더 기술]

 

 톰켓 로그 보기

- tail -f [파일명]

- tail -f -n 20 [파일명]  //20줄 보기 

- tail -f -n 20 cat.log

 

 전체 파일 찾기

- find -name [경로명] [파일명]

- find -name / aaa.txt

 

 찾은 파일 날짜 정보 및 최근 2일 이후 파일만 보기

 sudo find / -name "abc*.*" -mtime -2 -exec ls -lrt {} \;

 

 찾은 파일 날짜 정보 및 최근 2일 이전 파일만 보기

 sudo find / -name "abc*.*" -mtime +2 -exec ls -lrt {} \;

 

 찾은 파일 날짜 정보 및 최근 3일 날짜 기준, 하루동안 생성된 파일 보기

 sudo find / -name "abc*.*" -mtime 2 -exec ls -lrt {} \;

* 2일(48시간) ~ 3일(72시간)

 

 글자 포함된 모든 파일 찾기

- grep -r -l [키워드] [찾을경로]

- grep -r -l '찾을 글자' ./*

 

 

 

 

 

Posted by 하리하라​
: