아파치 톰캣(Apache Tomcat)은 아파치 소프트웨어 재단에서 개발한 서블릿 컨테이너(또는 웹 컨테이너)만 있는 웹 애플리케이션 서버이다. 톰캣은 웹 서버와 연동하여 실행할 수 있는 자바 환경을 제공하여 자바서버 페이지(JSP)와 자바 서블릿이 실행할 수 있는 환경을 제공하고 있다. 톰캣은 관리툴을 통해 설정을 변경할 수 있지만, XML 파일을 편집하여 설정할 수도 있다. 그리고, 톰캣은 HTTP 서버도 자체 내장하기도 한다.
아파치 톰캣(Apache Tomcat)은 아파치 소프트웨어 재단에서 개발한 서블릿 컨테이너(또는 웹 컨테이너)만 있는 웹 애플리케이션 서버이다. 톰캣은 웹 서버와 연동하여 실행할 수 있는 자바 환경을 제공하여 자바서버 페이지(JSP)와 자바 서블릿이 실행할 수 있는 환경을 제공하고 있다. 톰캣은 관리툴을 통해 설정을 변경할 수 있지만, XML 파일을 편집하여 설정할 수도 있다. 그리고, 톰캣은 HTTP 서버도 자체 내장하기도 한다.
VirtualBox에 OS를 설치하고 Network이 되는지 확인해 보면 일반적으로 별 탈 없이 잘 되곤한다. 잘 되니까 별다르게 신경쓰는 일이 없는 것이 사실이다. 네트워크와 관련된 작업을 하지 않는 이상 별 다르게 변경해야할 필요도 없다.
하지만 일반 사용자를 넘어서 advanced user가 되고자 한다면 기본 설정 외에 어떤 설정이 가능한지 한 번 살펴볼 필요가 있다. 혹시 아는가. 알고 보면 나에게 최적화된 설정은 기본 설정이 아니라 생각지도 못한 다른 설정일 수도 있다.
매뉴얼에 따르면 가산 머신당 총 8개까지 가상 네트워크(가상 PCI 이더넷 카드) 생성 및 설정이 가능하다. 4개는 설정 화면을 통해서 가능하고 나머지는 VboxManage command를 통해서 가능하다.
우선 하나의 설정만 제대로 할 줄 알면 나머지 것들은 추가하는 수준일테니 우선 하나의 가상 네트워크를 설정하는 방법을 알아보도록 하자.
가상 네트워크를 설정하기 위해서는 다음의 것들을 정해야 한다.
-.어떤 하드웨어를 통해 가상화할 것인가.
: PC에 설치된 Ethernet 카드 중 어떤 카드를 통해 가상화하여 네트워크를 사용할 것인지 정한다.
-.어떤 가상화 모드로 설정할 것인가.
: 설정가능한 6개의 가상화 모드 중 어떤 것을 사용할 것인지 정한다. 기본으로는 NAT가 설정되어 있다.
(참고로 VirtualBox의 네트워크라는 표현을 사용하기는 하였지만 정확히 말하면 virtualbox manual에서 볼 수 있듯이virtual networking, 즉 virtualbox의 가상 네트워킹이다.)
위 2가지 중에 "어떤 가상화 모드로 설정할 것인가"에 대해 어떤 가상화 모드가 있고, 선택이 가능한지 알아보자.
우선 기본적으로 아래와 같이 NAT로 설정되어 있다.
> 처음 화면에서 확인할 수 있는 기본 설정
이를 변경하기 위해서 설정하기 원하는 가상 머신을 선택한 후 (위에서는 Ubuntu 16.04가 선택) "머신 > 설정 > 네트워크"를 선택한다.
"다음에 연결됨(A):" 부분 옆 Combobox를 열어보면 설정 가능한 네트워크 종류를 확인할 수 있다.
연결되지 않음
NAT
NAT 네트워크
브리지 어댑터
내부 네트워크
호스트 전용 어댑터
일반 드라이버
하나씩 특징을 살펴보면 다음과 같다.
"연결되지 않음"
해당 모드는 네트워크 카드는 존재하지만 마치 케이블을 꼽지 않은 것과 같이연결하지 않은 것과 같이 동작하는 것이다.
NAT (Network Address Translation)
가상머신 내부 네트워크 -> Host PC 외부 네트워크 단방향 통신 가능
Host PC 내의 가상 머신 간의 통신 불가능
해당 모드는 기본 선택사항으로 가상 머신 내에서 단순히 인터넷 사용이나 파일 다운로드와 같은 용도로만 사용할 경우 설정이 가능하다. 가상 머신 내에서는 자체 사설 IP 주소를 사용하지만 실제 외부로 나갈 때는 Host PC가 가진 IP 주소를 바꿔 달고 나가게 된다. Host PC의 외부 네트워크에서는 내부의 가상 머신에 접근 불가능하다. (일반적으로 통용되는 NAT의 개념을 적용한 부분이라 자세한 설명은 넘어간다.)
즉, 아래 그림과 같이 NAT 모드일 경우 192.168.0.1의 주소를 사용하는 가상 머신은 외부 네트워크와 통신할 때 123.123.123.x 주소를 달고 외부와 통신하게 된다. 반면 192.168.0.x 의 주소를 가진 다른 가상 머신들과는 통신이 불가능하다.
NAT Network
가상머신 내부 네트워크 -> Host PC 외부 네트워크 단방향 통신 가능
Host PC 내의 가상 머신 간의 통신 가능
해당 모드는 NAT와 거의 동일하지만 Host PC 내의 가상 머신끼리 통신이 가능하다는 점이 다르다. 가상 머신 간에 상호 통신이 필요한 작업이 있다면 해당 모드를 사용해야 한다.
NAT Network의 경우는 아래 그림과 같이 NAT 와 다 동일하지만 192.168.0.x 의 주소를 가진 다른 가상 머신들과도 통신이 가능하다는 점이 다르다.
브리지 어댑터 (Bridged Adapter)
Host PC와 동등한 수준의 네트워크 구성
추가의 IP 할당이 필요함
해당 모드는 가상 머신의 네트워크를 Host PC 와 동등 수준으로 구성할 수 있게 해준다. 즉, 예를 들어 Host PC의 네트워크가 192.168.0.2로 설정이 되어 있다면 가상 머신의 네트워크 또한 192.168.0.4 정도로 같은 네트워크로 설정할 수 있는 것이다. 근데 잘 생각해 보면 실제 물리적인 네트워크 인터페이스는 Host PC의 Ethernet 카드 하나밖에 없다. 그렇다면 어떻게 Host PC와 가상 머신의 네트워크를 구분해 내는 것일까. VirtualBox 의 Manual에 따르면 소위 "net filter"라 불리는 Host PC의 network device driver를 사용하여 구분해 낸다고 한다. 해당 net filter를 통해 가상 머신은 자신의 data를 Host PC의 네트워크 카드로 부터 분리해내고 삽입하기도 한다.
브리지 어댑터의 경우 아래 그림과 같이 물리적으로는 Host PC 내에 존재하지만 Host PC의 주소와 동등한 수준의 별도의 주소를 가지고 외부와 통신한다.
내부 네트워크 (Internal Network)
Host PC와 독립적인 내부 네트워크
같은 Host PC 내의 가상 머신 간 연결이 가능
해당 모드는 브리지 어댑터와 많은 부분에서 유사하지만 가장 큰 차이점으로 외부와 통신이 되지 않는다는 점이 있다. 즉, Host PC의 네트워크와 분리되어 있고, Host PC 내 가상 머신 간에만 상호 연결하여 통신이 가능하다. Host PC의 물리적인 네트워크 인터페이스와 연결되어 있지 않다.
아래 그림과 같이 내부 네트워크는 Host PC 네트워크와 분리되어 있고, 가상 머신 간에만 통신이 가능하다.
호스트 전용 어댑터 (Host-only Adapter)
Host PC를 포함한 내부 네트워크 (외부 네트워크와는 단절)
같은 Host PC 내의 가상 머신 간 연결이 가능
해당 모드는 "브리지 어댑터"모드와 같이 Host PC와 내부 가상 머신들과 통신이 가능하고, "내부 네트워크"모드와 같이 외부 네트워크와는 통신이 불가능하다. Host PC의 물리 네트워크 어댑터외에 별도의 Loopback 어댑터를 생성하여 해당 어댑터를 통해 통신한다.
호스트 전용 어댑터의 경우는 아래 그림과 같이 외부 네트워크가 단절되어 있다.
일반 드라이버 (Generic Driver)
거의 사용되지 않는 모드
UDP Tunnel networking과 VDE(Virtual Distributed Ethernet) 지원
C언어를 배우면서 가장 먼저 나오는 함수가 printf일텐데, 리눅스 스크립트에서도 printf 명령이 거의 같은 형태로 구현되어 있어서 특정한 형식에 맞춰서 결과를 출력하고 싶을 때 요긴하게 쓸 수 있다.아래의 몇가지 예시를 보면 감을 잡을 수 있을 것이다. 기본 형태는 printf [형식] [내용] 이런 식이이다.
/usr/bin/printf printf 문자열 출력 리눅스 명령어
# 줄바꿈(new line) 없이 문자열(%s) 출력 printf "%s" "Hello World" Hello World(명령 프롬프트가 바로 뒤에 위치)
# 줄바꿈 포함 문자열 출력(\n) printf "%s\n" "Hello World" Hello World (명령 프롬프트가 다음 줄에 위치)
# 탭으로 구분하기(\t) printf "%s\t%s\n" "Hello" "World" Hello World
# 앞에 0을 출력하면서 네자리로 정수(%d) 출력 printf "%04d\n" "123" 0123
ulimit는 프로세스의 자원 한도를 설정하는 명령어입니다. ulimit에는 soft한도와 hard한도 두가지가 있는데 soft한도는 새로운 프로그램을 생성하면 기본으로 적용되는 한도이고, hard한도는 소프트 한도에서 최대로 늘릴수 있는 한도로 슈퍼유저에 의해서만 조정이 가능합니다.
ulimit [옵션] 값
-a : 모든 제한 사항을 보여줌.
-c : 최대 코어 파일 사이즈
-d : 프로세스 데이터 세그먼트의 최대 크기
-f : shell에 의해 만들어질 수 있는 파일의 최대 크기
-s : 최대 스택 크기
-p : 파이프 크기
-n : 오픈 파일의 최대수
-u : 오픈파일의 최대수
-v : 최대 가상메모리의 양
-S : soft 한도
-H : hard 한도
ulimit의 사용법을 쉽게 이해하기 위해서 예를 하나 들어보겠습니다.
아파치 재시작을 할려고 하는데 재시작이 되지 않아서 error_log 파일을 열어 보았습니다.
(24)Too many open files: httpd: could not open error log file ~~~
너무나 많은 파일을 오픈한다고 에러 메세지가 찍혀 있는 경우가 있습니다.
이럴 때는 현재 최대 파일 오픈 허용 갯수를 확인 해 보도록 합니다.
[root@localhost ~]#ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 7746 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 10240 cpu time (seconds, -t) unlimited max user processes (-u) 7746 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited [root@localhost ~]#
현재는 1024개까지의 파일을 오픈 할 수 있다는 것을 확인 하실 수 있습니다. 에러를 해결하기 위에 오픈 파일 허용갯수를 늘리도록 하겠습니다.
[root@localhost ~]#ulimit -n 8192 [root@localhost ~]#ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 7746 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 8192 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 10240 cpu time (seconds, -t) unlimited max user processes (-u) 7746 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited [root@localhost ~]#
오픈 파일 허용 갯수를 8192까지 늘리고 확인하였습니다. 그런데 리부팅을 하면 처음 설정되었던 초기값으로 돌아오기 때문에 이것을 저장시키기 위해서는 다음과 같은 작업을 진행해야 됩니다.
[root@i-web conf]#vi /etc/security/limits.conf
root soft nofile 8192 root hard nofile 8192
위와 같이 저장하면 되는데 첫째 칸에는 해당유저을 입력하고 둘째 칸에는 한도타입, 그리고 셋째칸에는 옵션 그리고 마지막에는 값을 입력하면 됩니다. 그러면 ulimit 설정이 저장되어져서 리부팅 후 해당 값으로 적용됩니다. 그러면 아파치 재시작을 해도 에러 없이 사용이 가능해집니다.