우분투(Ubuntu) Nginx Tomcat 9 연동 및 JDK 설치

Last Updated on 12월 21, 2020 by 태랑(정현호)

Nginx 설치


우분투 환경에서 Nginx + Tomcat9 연동 및 설정에 관하여 설명 드리려 합니다.
먼저 Nginx 부터 설치하도록 하겠습니다.


Nginx 는 Mainline 버전 Stable 버전이 있습니다.

새로운 특징, 기능, 버그 패치 등은 Mainline 버전에서 작업하고 그 이후에, 새로운 기능이 추가되지 않고 버그 패치만 하는 게 Stable 버전입니다.


버전 선택에 관련해서 NGINX의 공식 입장은 다음과 같습니다.
We recommend that in general you deploy the NGINX mainline branch at all times.
The main reason to use the stable branch is that you are concerned about possible impacts of new features,
such as incompatibility with third-party modules or the inadvertent introduction of bugs in new features.


기본적으로 Mainline 버전을 택하고 지속적으로 업데이트 하기를 권장하고 있습니다.
Stable 버전은 3rd party(서드 파티) 모듈과 호환성 문제 또는 New Feature 로 인한 문제로 인하여 업데이트가 불가능한 상황에서 사용하면 된다고 합니다.


버전은 사용 환경을 고려하여 선택하시면 될 것 같습니다

여기 에서는  Mainline 버전으로 하여 최신버전을 설치 하도록 하겠습니다.


* 진행 하는 과정에서의 모든 프롬프트는 ubuntu$  입니다.


= 선행 필요 패키지 설치하기
ubuntu$ sudo apt install curl gnupg2 ca-certificates lsb-release -y




## 둘중 1가지를 선택하여 수행하시면 됩니다.

# mainline 버전의 nginx packages 설치시 
ubuntu$ sudo echo "deb http://nginx.org/packages/mainline/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list

or

# stable 버전의 nginx packages 설치시 
ubuntu$ echo "deb http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list


설치전 공식적인 서명키를 받아와서 apt 패키지의 진위 여부를 확인합니다.

ubuntu$ sudo curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo apt-key add -
-> OK


ubuntu$  sudo apt-key fingerprint ABF5BD827BD9BF62




= 사전 준비가 다 끝났고 nginx 를 설치 합니다
ubuntu$ sudo apt update
ubuntu$ sudo apt install nginx

ubuntu$ nginx -V
nginx version: nginx/1.19.4
built by gcc 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)
built with OpenSSL 1.1.1




추가 필요 패키지 설치 및 유저생성


Tomcat 설치전에 필요한 패키지 를 먼저 설치 후 진행하도록 하겠습니다.

# build-essential
sudo apt install build-essential


# libssl-dev , APR-lib

sudo apt install libssl-dev openssl \
libapr1 libapr1-dev



# JDK/JRE 설치
- 8 버전
sudo apt install openjdk-8-jdk openjdk-8-jre

or


- 11 버전
sudo apt install openjdk-11-jdk openjdk-11-jre


* 둘중 선택하여 설치하시면 됩니다
저는 진행시 8 버전을 사용하였습니다.




Tomcat 설치


ubuntu$ sudo apt install tomcat9 \
tomcat9-admin tomcat9-common \
tomcat9-user libtcnative-1 \
tomcat9-docs tomcat9-examples


* 설치 직후 바로 tomcat은 기동 됩니다.




Tomcat Native 및 Connector 확인


Tomcat 사용 할 수 있는 HTTP Connector는 9.0, 10.0 기준  3개로 기재되어있고
Tomcat Native 미설치시 NIO 로 동작되게 됩니다.





8.0 까지의 문서에서는 아래와 같이 4개로 표기 되었습니다.





정리해서 Native Library를 이용한 APR 방식이 성능에 더 좋다고 알려져 있습니다
그리고 Native Library 미설치시 아래와 같은 warning 메세지도 Tomcat 기동시 마다 확인되게 됩니다

The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path:"


현재 tomcat 설치시 libtcnative-1 패키지도 같이 설치하여 Tomcat Native 는 설치가 된 상태 입니다


ubuntu$ sudo su -
[root]# cd /var/log/tomcat9/
[root]# grep -ai Native catalina*.log


APR based Apache Tomcat Native library [1.2.21] using APR version [1.6.3]
-> 설치된 Tomcat Native 버전은 1.2.21 로 정상적으로 load 된것으로 로그에서 확인 됩니다.



Tomcat Library 가 정상적으로 load 되었음에도 아래처럼 NIO Connector로 구동 되는 경우가 있을수 있습니다.
이럴 때는 server.xml 에 명시적으로 apr 로 변경 해주면 사용 할 수 있습니다.


ubuntu$ sudo su -
[root]# cd /var/log/tomcat9/

[root]# grep -ai http catalina*.log
Starting ProtocolHandler ["http-nio-8080"]



server.xml 을 수정 합니다.
ubuntu$ cd /etc/tomcat9
ubuntu$ sudo vi server.xml


# original
<Connector port="8080" protocol="HTTP/1.1"


# 아래처럼 protocol 을 수정 합니다
<Connector port="8080"
protocol="org.apache.coyote.http11.Http11AprProtocol"



http 를 수정하였다면 tomcat 을 재시작 합니다.
ubuntu$ sudo systemctl restart tomcat9



# 로그 확인
ubuntu$ sudo -i
[root]# cd /var/log/tomcat9/
[root]# grep -ai http catalina*.log
Starting ProtocolHandler ["http-apr-8080"]


--> apr 로 동작 되는것을 확인 할 수 있습니다.




Cloud 보안 정책 및 방화벽 오픈


사용환경에 따라 Cloud 나 VPS 호스팅 서비스의 보안정책/방화벽에서 포트를 오픈이 필요 할 수 있습니다.


아래는 AWS 의 방화벽(보안 그룹)을 설정 예시 입니다.

AWS 콘솔에 접속 후 EC2 로 이동 합니다.





인스턴스 메뉴에서 인스턴스 아이디를 선택 합니다.





인스턴스 정보 하단에 EC2에 해당하는 보안그룹을 선택 합니다.




인바운드 규칙 -> 인바운드 규칙 편집 으로 이동 합니다.





유형 에서 "HTTP" 를 선택 하고 소스 에서 위치무관 을 선택 합니다.
80 포트 HTTP 웹서비스는 모든곳에서 접속하기에 모든 접속을 허용 으로 설정하게 됩니다.




완료 되면 아래와 같이 인바운드 규칙이 설정되게 됩니다.





우분투에서는 방화벽을 iptables 로 사용되고 있습니다.

# iptables 간단 설명
먼저 iptables 에 정책이 설정되어 있는지 확인 합니다 설정이 되어 있다면 원하는 포트를 오픈 해야 합니다.
설정이 되어 있지 않다면(사용하지 않으면) 아래 내용은 생략해도 됩니다.

설정된 정책 확인
ubuntu$ sudo iptables -nL


만약 아래와 같이 내용이 출력 된다면 설정된 정책이 없는 것 입니다.

Chain INPUT (policy ACCEPT)

target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination




정책이 설정되어 iptables 를 사용 사용중이라면 아래 내용대로 설정을 하시면 됩니다.

iptables 룰 정책 저장을 위한 패키지 설치
ubuntu$ sudo apt-get install iptables-persistent netfilter-persistent
-> 우분투의 iptables 는 재부팅시내역이 초기화되기 때문에 아래 2개의 패키지를 설치가 필요합니다


특정 포트 오픈 규칙 추가( -I 가장 먼저 추가)
ubuntu$ sudo iptables -I INPUT -p tcp -m tcp --dport 8080 -j ACCEPT


특정 포트 오픈 규칙 삭제
ubuntu$ sudo iptables -D INPUT -p tcp -m tcp --dport 8080 -j ACCEPT


포트 오픈시 특정 IP(123.123.123.123) 로 만 허용
iptables -I INPUT -p tcp -s 123.123.123.123 --dport 8009 -j ACCEPT


위의 "포트 오픈시 특정 IP 로 만 허용" 정책 삭제
iptables -D INPUT -p tcp -s 123.123.123.123 --dport 8009 -j ACCEPT


정책 영구 저장
ubuntu$ sudo netfilter-persistent save





nginx 설정


설정의 홈 디렉토리는 /etc/nginx 입니다.
nginx 최근버전에서는 /snippets /sites-enabled , /sites-available 같은 디렉토리 없이 conf.d 디렉토리만 존재 하고 nginx.conf 파일에서는 모든 conf 파일을 include 하여 사용하게 됩니다.

ubuntu$ cd /etc/nginx
ubuntu$ cat nginx.conf | grep conf
include /etc/nginx/conf.d/*.conf
==> /etc/nginx/conf.d/ 아래에 .conf 파일은 자동으로 include 되어 적용 되게 됩니다.


먼저 nginx.conf 를 확인 해보겠습니다.
ubuntu$ cd /etc/nginx
ubuntu$ sudo vi nginx.conf

user nginx;
  <== nginx 에서 사용할 OS로 유저로 nginx 로 사용하면 무난합니다.

#master_process ON; # ON is default
  <== 엔진엑스는 하나의 메인 프로세스(마스터 프로세스)와 여러 개의 작업자 프로세스를 시작할 수 있습니다 (ON) 
 <== ON 이 default 이고 off 로 해제하면 단인 프로세스로 동작하게 됩니다.
 <== 해당 옵션은 기재가 되어있지는 않습니다 내용 참고를 위해 기재 한 것 입니다

worker_processes 4;
or
worker_processes auto;

접속을 받고 처리하는 worker process의 수 이며 정한 수만큼 기동시 프로세스가 생성됩니다.
보통 CPU Core 나 CPU Count 와 상관되어 결정되며 설정 이후 CPU의 사용률이 높지 않다면 올려서 사용 할 수 있습니다.
혹은 auto 로 nginx 알아서 생성되게 할 수도 있습니다.
저는 일단 4로 설정하고 사용 하도록 하겠습니다.


error_log /var/log/nginx/error.log notice;
로그 파일명과 경로, 로깅 레벨을 설정 할 수 있습니다.
로깅 레벨은 warn, error crit, alert, and emerg 설정 할 수 있습니다.

기동 과 중지 시 로그를 받을 수 있도록 notice 를 기본으로 사용 하면 됩니다.
문제 파악이나 설정시 테스트를 위해서는 debug를 사용하면 됩니다.



events {
worker_connections 1024;
}
worker_connections 는 woker 당 가능한 접속수를 의미 합니다.
위에서 worker 4로 지정 하였으면 4*1024 하여 4096 Connection이 가능하게 됩니다.


log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;
log_not_found off;

main 명칭의 로그 포팻으로 설정된 정보가 있고 설정된 main 포맷 Access 로그에서 사용 하고 있습니다
log_format main  을 수정하여 사용하거나 별도의 log format을 생성 후 access 로그에서 변경하여 사용 할 수 있습니다




### deflate ###
gzip on;
gzip_disable "msie6";
gzip_comp_level 6;
gzip_min_length 500;
gzip_buffers 16 8k;
gzip_proxied any;
gzip_vary on;
gzip_types text/plain text/css text/js text/xml text/javascript application/javascript application/x-javascript application/json application/xml application/rss+xml image/svg+xml image/png;


# gzip 설명
gzip(deflate) 는 HTTP 압축으로 HTTP 데이터는 서버로부터 전송되기 전에 압축됩니다.
nginx.conf 파일에 설정 하였기 때문에 모든 server block 에 공통으로 적용 되게 됩니다.

gzip on;
이 line을 통해 gzip을 사용할 것이라고 알려주는 것입니다.


gzip_disable "msie6";
IE 6이하에는 적용시키지 않습니다.


gzip_comp_level
압축의 정도를 설정하는 부분으로 높을수록 압축율이 높습니다
그대신 서버에서의 CPU 사용률이 올라가거나 압축에 더 시간이 소요될 수 있어서 적절한 값을 사용하는 것이 좋습니다.


gzip_types
압축을 할 대상 Source 파일의 종류를 지정 하는 것입니다.




[참고]    -> , => , ==>  는 모두 설명 입니다

이제 각 서버 설정 파일을 수정 하도록 하겠습니다


ubuntu$ cd /etc/nginx/conf.d
ubuntu$ sudo cp -rp default.conf default.conf.ori
 ==> 먼저 default 값으로 설정된 파일은 백업 후 설정을 변경 하여 사용하겠습니다.


ubuntu$ sudo vi default.conf

upstream tomcat {
ip_hash;
server 127.0.0.1:8080 max_fails=10 fail_timeout=1s;
keepalive 100;
}
#  => Load Balance 와 추가적인 옵션인자를 설정할 수 있는 upstream 구문 절입니다
# => backend 로 연결되는 ip 정보와 접속 실패 관련된 옵션 , backend 와의 keep alive 이 설정되어 있습니다.


server {
listen 80 default_server;
    ==> 사용할 포트 번호입니다.
    ==>  default_server는 server 절이 여러개 있을 때 IP로 접속 하거나 없는 서브도메인 등으로 접속시 default 로 접속을 하게 되는 sever 절을 의미 합니다.
   ==>  server {} 중에서 한곳만 사용 할 수 있습니다

server_name localhost;
   ==> IP나 /etc/hosts에 설정된 호스트네임 , 도메인이 있다면 도메인명을 기재해 줍니다.
   ==> 도메인이 없다면 localhost  로 지정하시면 됩니다.


# root /usr/share/nginx/html;
root /var/lib/tomcat9/webapps/ROOT;
   ==> html이나 jsp 파일을 읽을 디렉토리를 지정합니다
   ==> 기본값은 주석처리 하고 tomcat에 있는 default admin page로 변경하도록 하겠습니다.

index index.jsp index.html index.htm;
   ==> 접속시 처음 index 할 파일을 지정 합니다  index.jsp 를 추가 합니다

access_log /var/log/nginx/localhost.access.log main;
error_log /var/log/nginx/localhost.error.log;
  ==> Access , Error 로그는 기본적으로는 주석처리 되어 있습니다.
  ==> 주석을 해제하고 서버명이나 도메인명 등을 추가하여 로그를 확인 할 때 파일명으로 쉽게 찾을수 있도록 명시적으로 지정하는 것이 좋습니다.

charset utf-8;
==> character set 설정입니다.


# location /    절을 수정 합니다.
location / {
proxy_set_header Host $http_host;

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-NginX-Proxy true;
  # proxy_pass http://localhost:8080;
proxy_pass http://tomcat;    #upstream
    # => 위에서 설정한 upstream 명을 기재합니다.

proxy_redirect off;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}

* nginx 시작시 에러가 발생한다면 위의 내용들을 메모장이나 노트패드에 붙여넣은 뒤 다시 복사하여 nginx에 붙여넣어 보시기 바랍니다.


파일을 저장 후 nginx 를 reload 하고 나서 웹페이지 접속을 시도해 봅니다.
ubuntu$ sudo systemctl reload nginx



정상 적이라면 아래와 같은 default 페이지가 표시될것 입니다.




연관된 글
최상위 국가 무료 도메인 발급 받기 및 서브 도메인 설정

Nginx 에 Certbot을 통한 무료 SSL인증서 적용 및 HTTP/2 적용

Ubuntu18.04 - LEMP(Linux+Nginx+MariaDB+PHP) 스택 연동 구성

Nginx ModSecurity 설치 및 설정 - Nginx 웹 방화벽


 

“우분투(Ubuntu) Nginx Tomcat 9 연동 및 JDK 설치” 에 대한 4 댓글

답글 남기기