본문 바로가기
OS/Linux

nignx-tomcat 구성시 필요 요구사항 정리 - nginx+tomcat 설치과정포함

by Sou1 2020. 8. 12.
반응형

(개요)

nginx 와 tomcat을 연동하면서 필요 요구 사항들을 정리

(목표)
nginx 기본 설정과 연동에 필요한 부분을 진행하면서 필요한 사항들을 정리합니다.

(기본)
1. 기본적으로 x-forwording-for 헤더를 이용하여 accesslog에 거쳐온 IP들을 모두 출력하도록 설정합니다.

(필요요구사항)
직접 사이트에서 tar.gz 파일을 다운받아 사용할 수도 있지만, 자동 패치 관리가 적용되고 depence까지 모두 함꼐 install 해줄수 있는 amazon-linux-extras 패키지를 이용합니다.

1. Nginx 최신버전 (2020.07 기준 v1.18 설치)
- 아래 명령어로 간단하게 설치해줍니다.

# amazon-linux-extras install nginx1


2. Tomcat 최신버전 (2020.07 기준 - JDK8 설치 8.5 설치) 
- 아래 명령어로 간단하게 설치해줍니다.

# amazon-linux-extras install tomcat8.5


3. 설치경로를 확인합니다.
nginx : /etc/nginx

├── conf.d # (디렉토리) nginx.conf에서 불러들일 수 있는 파일을 저장
├── fastcgi.conf # (파일) FastCGI 환경설정 파일
├── fastcgi_params
├── koi-utf
├── koi-win
├── mime.types
├── nginx.conf # 접속자 수, 동작 프로세스 수 등 퍼포먼스에 관한 설정들
├── proxy_params
├── scgi_params
├── sites-available # 비활성화된 사이트들의 설정 파일들이 위치한다.
│   └── default
├── sites-enabled # 활성화된 사이트들의 설정 파일들이 위치한다. 존재하지 않은 경우에는 디렉토리를 직접 만들 수도 있다.
│   └── default -> /etc/nginx/sites-available/default
├── snippets
│   ├── fastcgi-php.conf
│   └── snakeoil.conf
├── uwsgi_params
└── win-utf

tomcat : /etc/tomcat

├── Catalina
│   └── localhost
├── catalina.policy
├── catalina.properties
├── conf.d
│   └── README
├── context.xml # 컨텍스트 설정 (공통)
├── jaspic-providers.xml
├── log4j.properties #application log4j 사용시 사용
├── logging.properties
├── server.xml # WAS 설정이 정의되는 파일 (ex - Listen etc)
├── tomcat.conf
├── tomcat-users.xml #  톰켓 접근 기능 유저/권한 설정
└── web.xml #어플리케이션 설정들 (ex - 세션타임아웃 WAS용)

4. 기본환경 튜닝하기(고려해야할점)
4_1. 시스템 설정
max user processes 와 open files 체크
: max user processes는 오픈프로세스 수이며, open files 는 오픈파일 수 입니다.

# ulimit -a


위는 default 사항이며, 2^16승만큼 늘려주는것을 권장하고 있습니다.

일회성 명령어

ulimit -n 65546
ulimit -u 65536

재시작시 유지 방법

vi /etc/security/limits.conf
############ 이후 내용추가 ############
nginx   soft  nofile  65536
nginx   hard  nofile  65536
nginx   soft  nproc   65536
nginx   hard  nproc   65536
####################################
or
############ 이후 내용추가 ############
*   soft  nofile  65536
*   hard  nofile  65536
*   soft  nproc   65536
*   hard  nproc   65536
####################################

변경 후 


4_2. Nginx 설정
0) 기본설정
: 에러 로그의 경우 별도 파일시스템(Path로 변경해서 logging 하실 수 있습니다)
: 또한 에러 로그의 경우 log rotate를 권장드립니다.

user nginx; # nginx 기동 유저
worker_processes auto; # worker 방식 체결 (nginx 장점)
error_log /var/log/nginx/error.log; #error log 경로
pid /run/nginx.pid; # pid 생성파일 경로
# worker_processes 1; # 서버에 장착되어 있는 코어 수 만큼 할당하는 것이 보통 권장사항 

(추가설정 - log rotate를 위해)
다음 경로(/etc/logrotate.d/nginx) 에 파일을 생성하고 아래와 같은 구문을 작성합니다.
: 아래 설정은 10일 단위로 log rotate를 수행하며, 압축하여 저장합니다.

/var/log/nginx/*log {
    create 0664 nginx root
    daily
    rotate 10
    missingok
    notifempty
    compress
    sharedscripts
    postrotate
        /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
    endscript
}

* missingok : 로그 파일이 없어도 에러를 내지 않음
* rotate 52: 로그 파일을 52개까지만 보관(53일 이전것은 삭제), 필요한 경우 숫자를 조정해서 로그 보관 일수를 변경
* compress: 압축해서 보관
* create 640 nginx nginx: 새로 로그 파일 생성시 640 모드로 생성하고 소유자, 그룹은 nginx
* notifempty: 빈 로그파일은 로테이트 하지 않습니다.
* postrotate: rotate 작업을 마친후에 실행할 스크립트를 적어줍니다. nginx 의 경우 SIGUSR1 을 받으면 로그 파일을 새로 읽으므로 새로 만들어진 로그 파일에 로그를 기록합니다.

Default 설정



설정 확인 명령어

# logrotate -d -f /etc/logrotate.d/nginx



1) events
: 접속 처리에 관한 설정
events {
    worker_connections 1024; # 워커 프로세스 한개당 동시 접속 수 지정 (512 or 1024)
}

2) http
: 웹, 프록시 관련 서버 설정
: x-forwarded_for 설정
: proxy를 통해 거쳐온 IP들을 log_format을 이용하여 같이 출력합니다.

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

: keepalive_timeout
: ALB가 idle_timeout이 60초이기 때문에 nginx는 그보다 약간 더 높은 65초가 권장되는 사항입니다.

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;

3) server
* location 별로 관리하는 것을 권장합니다.
: 만약 해당 부분에 location 별로 구분해서 트래픽을 분기시키고 싶으시다면 그에 맞는 location 설정값을 제공해 주시기 바랍니다.

(default nginx 설정 - location 기본설정 추가 : 전체 경로에 대해서 WAS에서 처리하겠다라는 의미)
    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /usr/share/nginx/html;
        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;
        location / {
            proxy_pass          http://localhost:8080;
            proxy_set_header    X-Real-IP $remote_addr;
            proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header    Host $http_host;
        }
        error_page 404 /404.html;
            location = /40x.html {
        }
        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }


4_3. Tomcat 튜닝
1) Heap_Memory 설정
path : /usr/share/tomcat/bin
file : setenv.sh 파일 생성
파일을 수정하여 Xms, Xmx를 지정하여 줍니다.
원하시는 min, max heal size를 지정해 주시기 바랍니다.

export CATALINA_OPTS="$CATALINA_OPTS -Xms256m"
export CATALINA_OPTS="$CATALINA_OPTS -Xmx512m"

######################### or #############################
path : /etc/tomcat/tomcat.conf

해당 부분 수정

...
# You can pass some parameters to java here if you wish to
#JAVA_OPTS="-Xminf0.1 -Xmaxf0.3"
...

-Xmaxf : 이 60 %를 초과하는 경우 힙을 압축하도록 JVM에 지시합니다.
-Xminf :  사용 가능한 공간이 30 % 이상없는 경우 힙을 확장하도록 JVM에 지시합니다.
-Xmx512m : 해당 기능으로 절대값을 줄 수 있습니다. 





2) server.xml 설정
: 크게 <Service> <Connector> <Engine> <Host> 가 있습니다.
: Service, Connector : 서비스 단위, 연결설정 // 서비스 단위를 여러개 만들고 Connector 를 통해 80포트 / 8080포트 / 443(SSL/TSL)등 여러개의 포트를 열어 서비스할 수 있습니다.
: 그 아래 <Engine> <Host> 만 집중해서 살펴봅니다.
: tomcat은 최초 8080포트로 LISTEN을 진행합니다.
: 관련 필요한 정보들을 나열합니다.
* THREAD 값 : WEB-WAS구간에 허용할 동시 쓰레드 갯수입니다.
* TIMEOUT 값 : WAS를 connection할때 허용되는 대기값 ms 값입니다.
* LISTEN PORT : 최초 LISTEN PORT입니다.
* appbase 값 : WAS가 바라볼 DOC ROOT 경로입니다.
* unpackWARs 여부 : WAR파일로 올려놓으면 자동으로 unpack 을 진행합니다.
* autoDeploy 여부 : 소스를 올려놓으면 자동으로 compile해서 소스에 반영합니다.

<Engine name="Catalina" defaultHost="localhost">
    <Realm className="org.apache.catalina.realm.LockOutRealm"> #자격증명부분
    <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
    </Realm>

    <Host name="localhost"  appBase="webapps"
          unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />

    </Host>
</Engine>

* defaultHost : Host[name]과 일치하지 않는 호스트로 접속시 기본값으로 대처할 호스트입니다.
- 예를들어 127.0.0.1 로 접속한 경우 아래 Host[name]에는 localhost 밖에 없어 일치하는 것이 없지만 기본값 localhost를 보고 localhost로 할당하게 됩니다. 

* name : 호스트 이름입니다. 예를들어서 도메인이름 test.soul0.tk 로 접속한경우 Host[name]이 test.soul0.tk 인것을 찾고 없으면 위 설명처럼 Engine[defaultHost]의 값으로 접속합니다.
* appBase : 기본 경로입니다. 예를들어 webapps 라면 [톰켓기본경로/webapps] 를 기본으로 접속하게됩니다.
* unpackWARs (war 파일 자동언팩), autoDeploy(자동 디플로이) : https://tomcat.apache.org/tomcat-9.0-doc/config/host.html#Automatic_Application_Deployment
* 각 호스트 접속시 영향을 주는 것들이라고 보면됩니다.
* RemoteAddrValve 같이 IP 필터같은 필터 역활을 하는 것도있고 종류도 다양합니다.

위 빨간색 부분을 변경하여 WAS에 대한 최소한의 설정을 진행합니다.


3) appBase 하위 ROOT 디렉토리 아래에 소스 배포
: war파일을 업로드하여도 되지만, 간단하게 index.jsp로 테스트해보겠습니다.
: path : /usr/share/tomcat/webapps



 

: Host 태그 아래에 default 설정이 되어있기 때문에 ROOT 디렉토리가 default 설정이 됩니다.
: 즉, 해당 ROOT 디렉토리가 아닌 다른 설정을 원하실 경우 Host 태그 아래에 Context 태그를 추가하여 변경해주어야 합니다.

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
    <!-- context를 생략하면 아래와 같은 기본값이 할당된다 -->
       <Context docBase="ROOT" path="/" />
</Host>

Context[docBase] : Host[webapps]/Context[docBase] 값이 기본 접근 폴더이다. (index.html의 폴더같은 기본 폴더라고 보시면됩니다.) 
Context[path] : docBase의 할당위치

4) 쓰레드 수
* maxThread = 200 (쓰레드풀 최대 쓰레드 갯수)
* minSpareThreads = 25 (쓰레드풀 초기 쓰레드 갯수)

server.xml "Host" 태그 아래에 "Context"처럼 태그를 하나 생성해서 넣어줍니다.

예제)
<Connector port="8080" address="localhost" maxThreads="250" maxHttpHeaderSize="1024"emptySessionPath="true" protocol="HTTP/1.1" enableLookups="false" redirectPort="8181"
acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" />

acceptCount : Thread Pool 내에 할당 가능한 Thread가 없다면 사용자 요청은 queue 안에서 대기하게된다. 당연히 queue의 크기가 크면 대기 가능한 요청 수도 많아진다. acceptCount 속성은 queue에 저장 가능한 최대 요청 수를 설정합니다.


5) JNDI 생략 (DB연결을 JNDI로 한다면 가이드 진행)

6) tomcat log rotate
path :  /etc/logrotate.d/tomcat

(default)


(변경)




5. OS 기동시 자동시작 설정
: 해당 status를 확인 후 disable로 되어있으면, enable로 변경해주어야 향후 auto-scaling을 적용할 수 있습니다.

# systemctl status tomcat
# systemctl status nginx 
====================================
enable 명령어
# systemctl enable tomcat
# systemctl enable nginx







반응형