SpringBoot Application을 80 port로 사용하고 싶은데, 리눅스 환경에서 80, 443과 같은 포트는 루트 권한으로 사용이 가능하다.
SpringBoot application의 내장 톰켓이 해당 포트를 사용할 수 있도록 sudo 권한을 사용해 서비스를 올리는 것 보다 proxy 서버를 올리는게 더욱 용이하므로 Nginx를 사용한 내용을 정리한다.

 

Nginx 란?

Apache의 1만명 규모 클라이언트의 동시 접속을 다루는 기술적인 이슈를 해결하기 위해 만든 Event-driven 구조의 오픈소스 서버 프로그램이다.
일반적인 HTTP 웹서버의 역할 외에도 proxy, reverse proxy를 제공한다.

 

설치 및 설정

Centos6

설치

$  yum install nginx

 

라우팅 설정

yum으로 nginx를 설치하게 되면 /etc/nginx 경로에 설치된다.
nginx 디렉토리 중 conf.d디렉토리 하위의 default.conf 파일을 변경하여 SpringBoot Application을 80 port로 포팅 한다.

$ vi /etc/nginx/conf.d/default.conf
# 아래와 같이 변경
# The default server
#

server {
#    listen       80 default_server; 
#    listen       [::]:80 default_server;
    listen       80;
    server_name  _;
    root         /usr/share/nginx/html;

    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;

    location / {
#                SpringBoot application을 매핑
        proxy_pass http://localhost:9100;
    }

    error_page 404 /404.html;
        location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }

}
server 블럭

도메인 단위의 1차 라우팅에 대한 설정을 담당한다..

  • listen : 서버 블록 정의 중 해당 서버에서 라우팅 할 특정 port를 정의하는 필드
    • default_server : 여러개의 server 블록을 작성할 때 default_server는 프로토콜 별로 단 하나의 server 블록에만 존재해야 합니다. 이 설정은 별도로 지정하지 않은 도메인으로 들어오는 다른 모든 요청에 대해서 해당 server 블록이 처리함을 의미한다.
  • server_name : 어떤 도메인을 라우팅 할지에 대한 필드

 

location 블럭

URI 리퀘스트의 path prefix의 매칭을 확인하여 적절한 어플리케이션으로 매핑한다.

  • proxy_pass : 실질적으로 요청 할 서비스를 명시하는 필드

 

Nginx 실행

아래의 명령어로 nginx 명령어 만으로 실행이 완료되고 별다른 알람 없이 실행이 완료되면 ps 명령어로 한번 더 확인 해 준다.

$ sudo nginx
$ ps -ef | grep nginx
root     20270     1  0 16:36 ?        00:00:00 nginx: master process nginx
nginx    20271 20270  0 16:36 ?        00:00:01 nginx: worker process
nginx    20272 20270  0 16:36 ?        00:00:01 nginx: worker process
nginx    20273 20270  0 16:36 ?        00:00:01 nginx: worker process
반응형

'Dev > Linux' 카테고리의 다른 글

[LINUX] JVM에서 thread dump 가져오기  (0) 2020.05.19
[Linux] 기본 명령어 정리(옵션) + 기타  (1) 2018.03.27

쓰레드 덤프를 추출해보면 좋을 상황

  • 서비스 OOM 장애 발생 시
  • 기대보다 웹 어플리케이션이 느리게 동작할 때
  • 사용자 수가 많지 않은데 CPU사용량이 높을때
  • 간헐적으로 응답이 느릴때
  • 서비스 실행시간이 길어질수록 응답시간이나 cpu 사용량이 늘어날 때
  • 등등..

쓰레드 덤프는 획득하는 순간의 쓰레드 상태만 알 수 있기 때문에 쓰레드 상태 변화를 확인하기 위해서는 일정 시간 주기로 여러번의 쓰레드 덤프를 추출하여 확인하는 것이 좋다.

 

쓰레드 덤프를 추출하는 방법

원하는 시점에 커널에서 추출하는 방법과 Java 어플리케이션 실행 시 OOM이 발생하면 쓰레드 덤프를 남길 수 있도록 JVM 옵션을 설정하는 방법이 있다.

  • 원하는 시점에 커널을 이용해 추출하는 방법
OS 단에서
    리눅스 : kill -3 [PID]
    
java단에서 
    jps -v 로 java 프로세스 확인
    - jstack [PID] (jstack으로 반응이 없는 경우 –F 옵션)
    - jcmd [PID] Thread.print (jdk7 이후 등장)
        jcmd [PID] help 로 명령어 확인 가능, 직관적임
  • OOM 발생 시 원하는 경로에 Thread dump 저장하는 Java Application 실행 옵션
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${path/to/save/thread/dump/file}

 

쓰레드 덤프 읽기

스레드 덤프를 그대로 읽기는 어렵다.
스레드 덤프를 파일로 저장하여 시각화 시켜주는 사이트를 사용하는 것이 더욱 용이
e.g.) JVM Thread dump analyzer - Universal Java Thread dump analysis

반응형

tar

압축과 관련된 명령어


압축하기 : $ tar [-옵션] 압축파일이름 압축할파일이름

압축풀기 : $ tar [-옵션] 압축파일이름 [-C 압축파일이 풀어질 경로]


옵션

-c : 새로운 아카이브(tar) 생성

-x : 압축 해제

-v : 압축시 진행률 표시

-z : gzip 압축 및 압축해제

-f : 파일 이름 지정

-p : 모든 퍼미션 정보를 유지한다

-C (대문자) : 압축 해제시 경로 지정




mkdir

폴더 생성 명령어


$ mkdir [-옵션] 디렉토리명


옵션

-p : 상위 디렉토리가 존재하지 않을 때 함께 생성

-m : 새로 만든 디렉토리의 권한을 설정




du

디렉토리 별 사용량 확인 명령어


$ du [-옵션] [--세부옵션] [경로]


옵션

-a : 모든 파일들의 기본정보를 보여줌
-b : 표시 단위를 Byte로 함
-k : 표시 단위를 KB단위로 함 (default)
-h : 사용량을 1K, 234M , 2G 등의 형태로 보여줌
-c : 모든 파일의 디스크 사용정보를 보여주고 나서 합계를 보여줌
-s : 총 사용량을 확인
-x : 체크하는 경로안에 다른 시스템이 있으면 생략
-D : 심볼릭 링크 파일이 있을경우 원본의 값을 보여줌 (= -L)




df

파일 시스템 사용량을 알려주는 명령어


$ df [-옵션] 파일명


옵션

-a : 현재 디렉토리의 사용량을 파일단위 출력

-s : 총 사용량을 확인

-h 사용량을 1K, 234M , 2G 등의 형태로 보여줌

-sh * : 한단계 서브디렉토리 기준으로 보여줌

-F : 파일 시스템의 유형을 파악 가능  (-Fh 명령어를 쓰면 파일시스템 유형과 용량을 확인하기 더 쉬워짐)




man

명령어의 매뉴얼을 보여주는 명령어


$ man [명령어]

$ [명령어] --help




touch

파일 생성 및 파일의 날짜정보 변경하는 명령어


$ touch [-옵션] 파일명


옵션

없음 : 빈 파일 생성

-c : 현재 시간으로 파일 날짜정보 변경

-t : 파일의 날짜 정보를 원하는 대로(YYYYMMDDhhmm 형식) 변경 (ex. touch -t 201306141200 newfile )

-r : b파일의 날짜 정보를 a파일의 날짜 정보와 같이 변경 (ex. touch -r a.txt b.txt)




head

파일의 앞 부분을 확인하는 명령어


$ head [-라인수(default 10)] 파일명




tail

파일의 끝 부분을 확인하는 명령어


$ talil [-라인수(default 10)] 파일명




more

내용이 많은 파일을 화면단위로 끊어 보여주는 명령어


$ more 파일명


more 화면 내의 명령어

h : more 명령어상태에서 키 도움말 확인

Space Bar or f : 한 페이지씩 뒤로 이동 

Enter : 현재 행에서 한 행씩 뒤로 이동

q : more 명령어 종료

b : 한 페이지씩 앞으로 이동

= : 현재 위치의 행번호 표시 

/문자열 : 지정한 문자열을 검색 

n : /문자열로 검색한 문자열을 차례대로 계속해서 찾기 

!쉘명령어 : more 명령어상태에서 쉘명령어를 실행

v : more 명령어로 열려있는 파일의 현재위치에서 vi를 실행




less

내용을 스크롤하여 확인할 수 있도록 해주는 명령어


$ less 파일명

$ 명령어 | less (ex. ls 폴더명/ | less)


less 화면 내의 명령어

Space Bar or f : 한 화면 뒤로 이동

b : 한 화면 앞으로 이동

Enter : 한 행씩 뒤로 이동

숫자+n : 원하는 페이지만큼 뒤로 이동하고 이후부터는 n만 눌러도 해당 숫만큼 페이지 이동

q : less 수행종료





cmake

기존의 make에서 makefile에 의존성 정보가 잘못 기술되어 있으면 빌드가 잘 안되는 단점이 존재

이를 보완하여 최종 빌드 결과물과 이를 빌드하기 위한 소스 파일들만 명시해 주면 cmake가 소스파일 내부까지 들여다보고 분석하여 의존성 정보를 스스로 파악하여 빌드를 해줌


cmake코드 ($ cmake cmake코드파일명) -> makefile을 생성 -> make로 빌드 ($ make makefile명)

반응형

+ Recent posts