[Server] Jeus 서버 동작방식
지금 진행하는 프로젝트 서버가 제우스 서버인데, 정말 아는 게 하나도 없어서 야금야금 정리해둔 것을 공유해보려고 한다.
1. 제우스 서버란?
웹 애플리케이션 서버(WAS)로 웹 서버인 WebToB와 함께 사용된다.
- 웹 애플리케이션 서버 : 요청에 따라 동적인 컨텐츠를 제공하는 서버
- 웹 서버 : HTTP 요청을 받아 정적인 컨텐츠를 제공하는 서버
2. 프로세스
1) 요청 수신
웹 서버인 WebToB가 클라이언트의 요청을 수신한다.
요청은 HTTP 메소드, URI, 헤더 등의 정보를 담고 있다.
클라이언트가 특정 웹 페이지를 요청하면 이 요청은 먼저 WebToB 웹 서버로 전송된다.
2) 요청 분석 및 라우팅
WebToB는 이 요청을 수신하고 분석하여, 클라이언트의 요청 정보를 파악한다.
3) 응답 전송
- 정적 파일 서비스 : 요청이 정적 파일에 대한 것이라면, WebToB는 설정된 DOCROOT 디렉토리에서 해당 파일을 찾아 클라이언트에게 전송한다.
- 동적 컨텐츠 처리 : 요청이 동적으로 생성되는 컨텐츠에 대한 것이라면, WebToB는 이 요청을 JEUS 애플리케이션 서버로 전달한다. JEUS 서버는 요청에 따른 로직을 실행하고, 그 결과를 다시 WebToB로 전송한다.
이런 프로세스를 거쳐 클라이언트의 요청이 완전히 처리되고,
클라이언트는 요청한 웹 페이지를 볼 수 있다.
3. URL 요청 시, JEUS(WebToB) 작동 프로세스
1. *VHOST.Port 에 선언된 포트 번호(ex. 80, 443)로 요청이 들어온다.
2. 들어온 요청은 Host 헤더를 확인하여 *VHOST.HostName,
*VHOST.HostAlias 설정과 비교,
VHOST 하나가 선택되어 처리된다.
3. VHOST에 설정되어 있는 ServiceOrder 순서에 따라 다음 처리가 선택된다.
"uri, ext" 설정인 경우 *REVERSE_PROXY 설정으로 이동하고,
"ext,uri" 설정인 경우 *EXT 설정으로 이동한다.
4-1. "uri,ext" 설정으로 *REVERSE_PROXY로 이동된 경우,
해당 VHOST 와 연결된 프록시 서버가 존재하면 PathPrefix 를 확인한다.
일치하는 경우 프록시 서버로 처리하고 없는 경우 *URI 설정으로 이동한다.
* 프록시 서버 : 클라이언트와 서버 사이에서 대리 통신 담당하는 서버
4-2. *URI 절에 설정된 경로들을 순서대로 체크하면서 해당되는 경우,
서버 처리단계로 이동한다.
GotoEXT 옵션이 Y 로 설정되어 있는 경우, 우선 *EXT 절 처리로 이동한다.
*EXT 절에 설정이 존재하는 경우, *EXT 절 설정에 따라 처리한다.
*EXT 절 설정에 해당되지 않는 경우, 원래 *URI 설정대로 처리한다.
4-3. *URI 설정에 해당되지 않는 경우 *EXT 절 처리로 이동한다.
5. "ext, uri" 설정으로 *EXT로 이동된 경우, *EXT 절에 설정된 확장자대로 처리한다.
*EXT 절 설정에 해당되지 않는 경우 *REVERSE_PROXY 절 처리로 이동한다.
6. *REVERSE_PROXY에 해당된 경우, 프록시로 연결된 서버로 처리를 넘기고
응답을 받아 서비스 처리를 완료한다.
7. *URI에 해당된 경우, SvrType에 설정된 것과 일치하는
SVRGROUP을 선택한다. 해당 SVRGROUP에 설정된 SERVER로 처리를 넘기고
응답을 받아 서비스 처리를 완료한다.
SvrName 옵션이 설정되어 있는 경우 해당 서버로 처리를 넘기고
응답을 받아 서비스 처리를 완료한다.
8. *EXT에 해당된 경우, *URI와 동일한 방식으로 진행된다.
대부분 *EXT 절 설정에 해당되는 경우는 WebtoB 처리이므로 WebtoB에서 응답 처리를 한다.
WebToB 설정은 httpd.m 파일에서 확인할 수 있다!
4. 예시
사실 개념만 보면 이해가 잘 가지 않을 것이다.
예시를 들어보자면, 요청 url 이 httpd://127.0.0.0:8080/login 이라면,
8080 포트에 대한 요청이므로 httpd.m 파일의
test3 DOCROOT="프로젝트 파일 위치"
HOSTNAME = "127.0.0.1",
HOSTALIAS = "url 경로",
PORT = "8080",
ServiceOrder = “uri, ext”
ERRORDOCUMENT =
METHOD =
Headers =
LOGGING =
ERRORLOG =
위의 설정이 선택된다!
ServiceOrder = “uri, ext” 설정이므로 *REVERSE_PROXY로 이동하나 현재 설정되어 있지 않아서 *URI절로 이동하게 된다.
*URI
#test1 Uri = "/attachment", Svrtype = html, VhostName =
#test2 Uri = "/attachment", Svrtype = html, VhostName =
#test3 Uri = "/attachment", Svrtype = html, VhostName =
test1 Uri = "/", Svrtype = JSV, VhostName =
test2 Uri = "/", Svrtype = JSV, VhostName =
test3 Uri = "/", Svrtype = JSV, VhostName =
VhostName이 test3 이었으므로
test3 Uri = "/", Svrtype = JSV, VhostName =
위의 URI 설정으로 처리가 진행된다.
5.웹 서버 작동 방식 정의
*DOMAIN
webtob1
*NODE
lmmawebdev WEBTOBDIR="C:/TmaxSoft/JEUS8/webserver",
SHMKEY = 54000,
DOCROOT="C:/TmaxSoft/JEUS8/webserver/docs",
PORT = "8080",
HTH = 1,
#Group = "nobody",
#User = "nobody",
NODENAME = "$(NODENAME)",
ServiceOrder = "uri,ext",
#UpperDirRestrict = Y,
ERRORDOCUMENT = "400,401,403,404,405,406,503",
Options="ExcludeAllowHeaderOnError",
METHOD = "GET, POST, HEAD, -OPTIONS",
#JSVPORT = 7700,
IPCPERM = 0777,
LOGPERM = 0600,
LOGGING = "acc_node",
ERRORLOG = "err_node",
SYSLOG = "syslog"
*DOMAIN webtob1 | 도메인 이름 |
*NODE lmmawebdev | 노드(웹 서버 인스턴스) 이름 |
WEBTOBDIR="C:/TmaxSoft/JEUS8/webserver" | 웹 서버가 설치된 루트 디렉토리 |
SHMKEY = 54000 | 공유 메모리 키 (서버 프로세스 간 데이터 공유를 식별함) |
DOCROOT="C:/TmaxSoft/JEUS8/webserver/docs" | 웹 서버가 웹 페이지와 관련된 정적 파일을 찾는 디렉토리 |
PORT = "8080" | 웹 서버가 클라이언트 요청을 수신하는 네트워크 포트 |
HTH = 1 | Handle To Host의 약자. 웹 서버가 동시에 연결할 수 있는 최대 연결 수 |
NODENAME = "$(NODENAME)" | 노드 이름 동적으로 설정 가능 |
ServiceOrder = "uri,ext" | 서비스 순서 설정 |
ERRORDOCUMENT = "400,401,403,404,405,406,503" | 에러 문서 설정 |
Options="ExcludeAllowHeaderOnError" | 웹 서버 옵션 - 에러 발생 시 허용 헤더 제외하도록 설정함 |
METHOD = "GET, POST, HEAD, -OPTIONS" | 허용되는 HTTP 메소드 설정 |
IPCPERM = 0777, LOGPERM = 0600 | IP 통신과 로그 파일에 대한 권한 설정 |
LOGGING = "acc_node", ERRORLOG = "err_node", SYSLOG = "syslog” |
로깅 설정 지정 - 접근 로그 / 에러 로그 / 시스템 로그 |
*HTH_THREAD
hworker WorkerThreads = 8 // HTTP 워커가 동시에 처리할 수 있는 작업의 수 : 8개
*SVRGROUP // 서버 그룹 정의
g_html SVRTYPE = HTML
g_test1 SVRTYPE = JSV, VhostName = "test1"
g_test2 SVRTYPE = JSV, VhostName = "test2"
g_test3 SVRTYPE = JSV, VhostName = "test3"
*SERVER // 개별 서버 설정 정의
test3 SVGNAME = g_test3, MinProc = 60, MaxProc = 60,
RequestLevelPing = Y, SvrChkTime = 60#,
SessionIdCookieKey = "JSESSIONID"
test3서버는 최소 60개, 최대 60개의 프로세스를 사용하며, 요청 레벨에서 핑을 보낸다.('RequestLevelPing = Y')
서버를 확인하는 시간 간격은 60초이다.('SvrChkTime = 60#')
세션 ID를 관리하는 쿠키의 키는 "JSESSIONID" 이다.
이런 식으로 해석해볼 수 있다.
서버 세팅을 직접한 게 아니라서 분석하는 것 밖에 못 해봤지만...
그래도 새로운 걸 알아가서 뿌듯한 느낌!
실제로 사용되고 있는 httpd.m 파일을 가져와서 수정한 거라... 서버 이름 정의는 생략하고 봐주셨으면 합니다 ㅎㅎ