

Web Server의 개념Web Server의 기능Web Server의 예WAS의 개념WAS는 Web Server와 Web Container가 합쳐진 형태로서, 웹 서버 단독으로는 처리할 수 없는 데이터베이스의 조회나 다양한 로직 처리가 필요한 동적 컨텐츠를 제공하는 덕분에 사용자의 다양한 요구에 맞춰 웹 서버리를 제공할 수 있음Container란 JSP, Servlet을 실행시킬 수 있는 소프트웨어를 말함WAS는 JSP, Servlet 구동 환경을 제공WAS의 역할WAS = Web Server + Web ContainerWeb Server 기능들을 구조적으로 분리하여 처리하고자하는 목적으로 제시WAS가 가지고 있는 Web Server도 정적인 컨텐츠를 처리하는 데 있어서 성능상 큰 차이가 없음WAS의 주요 기능WAS의 예개념 요약
Web Server: 단순히 정적 파일을 응답WAS(Web Application Server) : 클라이언트 요청에 대해 동적인 처리가 이뤄진 후 응답
Web Server가 필요한 이유?Web Server를 통해 정적인 파일들을 Application Server까지 가지 않고 앞단에서 빠르게 보내줄 수 있음Web Server에서는 정적 컨텐츠만 처리하도록 기능을 분배하여 서버의 부담을 줄일 수 있음WAS가 필요한 이유?Web Server만을 이용한다면 사용자가 원하는 요청에 대한 결과값을 모두 미리 만들어 놓고 서비스를 해야 함WAS를 통해 요청에 맞는 데이터를 DB에서 가져와서 비즈니스 로직에 맞게 그때 그때 결과를 만들어서 제공함으로써 자원을 효율적으로 사용할 수 있음WAS가 Web Server의 기능도 모두 수행하면 되지 않을까?WAS는 DB 조회나 다양한 로직을 처리하느라 바쁘기 때문에 단순한 정적 컨텐츠는 Web Server에서 빠르게 클라이언트에 제공하는 것이 좋음WAS는 기본적으로 동적 컨텐츠를 제공하기 위해 존재하는 서버WAS가 처리한다면 정적 데이터 처리로 인해 부하가 커지게 되고, 동적 컨텐츠의 처리가 지연됨에 따라 수행 속도가 느려짐SSL에 대한 암복호화 처리에 Web Server를 사용WAS를 연결 가능Load Balancing을 위해서 Web Server를 사용fail over(장애 극복), fail back 처리에 유리Web Server와 WAS를 분리하여 무중단 운영을 위한 장애 극복에 쉽게 대응할 수 있음Web Server에서 오류가 발생한 WAS를 이용하지 못하도록 한 후 WAS를 재시작함으로써 사용자는 오류를 느끼지 못하고 이용할 수 있음Web Server에서 처리하면 효율적Web Server와 WAS를 분리Web Server를 WAS 앞에 두고 필요한 WAS들을 Web Server에 플러그인 형태로 설정하면 더욱 효율적인 분산 처리가 가능
동작 과정
Web Server는 웹 브라우저 클라이언트(사용자)로부터 HTTP 요청을 받음Web Server는 클라이언트의 요청(Request)을WAS에 보냄WAS는 관련된Servlet을 메모리에 올림WAS는web.xml을 참조하여 해당Servlet에 대한 Thread를 생성 (Tread Pool 이용)- HttpServletRequest와 HttpServletResponse 객체를 생성하여
Servlet에 전달
5-1. Thread는Servlet의service()메서드를 호출
5-2.service()메서드는 요청에 맞게doGet()또는doPost()메서드를 호출protected doGet(HttpServletRequest request, HttpServletResponse response)doGet()또는doPost()메서드는 인자에 맞게 생서된 적절한 동적 페이지를 Response 객체에 담아WAS에 전달WAS는 Response 객체를 HttpResponse 형태로 바꾸어Web Server에 전달- 생성된 Thread를 종료하고 HttpServletRequest와 HttpServletResponse 객체를 제거
(하는 일은 동일) 기능의 차이는 없고 역할의 차이만 존재
Servlet를 보완하고 기술을 확장한 스크립트 방식 표준Servlet의 모든 기능 + 추가적인 기능
ServletServlet이 수정된 경우 Java 코드를 컴파일(.class 파일 생성)한 후 동적인 페이지를 처리하기 때문에 전체 코드를 업데이트하고 다시 컴파일한 후 재배포하는 작업이 필요 (개발 생산성 저하)JSPJSP가 수정된 경우 재배포할 필요가 없이 WAS가 알아서 처리 (쉬운 배포)Nginx는 간단하게 말하자면 경량 Web Server
클라이언트로부터 요청을 받았을 때 요청에 맞는 정적 파일을 응답해주는 HTTP Web Server로 활용되기도 하고, Reverse Proxy Server로 활용하여 WAS 서버의 부하를 줄일 수 있는 로드 밸런서로 활용되기도 함
Web Server는 무엇일까? Web Server가 직접 Application Server 를 실행할 수 있음Application Server 로 전달하는 역할을 함Web Server가 사용되는 가장 큰 이유 중 하나이기도 함nginx의 가장 큰 특징은 비동기 Event Driven 에 의한 Non Blocking 처리를 한다는 것apache 서버에 비해 소비 메모리량이 적어지면서 동시 처리수를 급격하게 늘릴 수 있음nginx는 하나의 Master Process와 다수의 Worker Process로 구성되어 실행nginx는 이벤트 기반 모델을 사용하고, Worker Process 사이에 요청을 효율적으로 분배하기 위해 OS에 의존적인 메커니즘을 사용
nginx 에서 읽기/쓰기가 자주 일어난다면 apache가 더 좋을 수도 있음Web Server에서는 하드웨어 읽기가 발생하지 않는 캐시 제공, 리버스 프록시 서버, 로드 벨런서 등의 역할을 주로 담당하게 되므로 최근들어 더 자주 사용된다고 생각할 수 있음nginx는 여러 기능을 모듈 단위로 개발하여 nginx를 컴파일할 때 필요한 모듈들만 조합해서 사용할 수 있음

nginx 모듈의 동작은 configuration 파일에 있는 지시어(directives)에 의해 제어simple directive와 block directive 두 가지 종류가 있음simple directive세미콜론(;)으로 끝남worker_process 1;
block directivesimple directive의 구조에 블록("{", "}")을 감싼 형태의 지시어block directive는 해당 지시어 안에 또 다른 block directive가 포함될 수 있음events {
worker_connections 1024;
}
http {
server {
location / {
root /path/to/html ;
}
location /images/ {
root /path/to/image ;
}
}
}
include 지시어http {
# mime.types 파일을 읽어들인다. (단일 파일을 include)
include /etc/nginx/mime.types;
# /etc/nginx/conf.d 디렉토리 아래 있는 .conf 파일을 모두 읽어 들임 (특정 디렉토리의 모든 파일을 include)
include /etc/nginx/conf.d/*.conf;
}
k 또는 K : 킬로바이트
m 또는 M : 메가바이트
ms : 밀리초
s : 초
m : 분
h : 시
d : 일
w : 주
M : 월(30일)
y : 연(365일)
# 아래의 세 지시어는 모두 같은 값을 가짐
# 시간의 기본 단위는 초
client_body_timeout 3m;
client_body_timeout 180s;
client_body_timeout 180;
' 또는 " 을 사용하지 않고 문자열을 나타낼 수 있음공백 문자, 세미 콜론(;), 중괄호 등 특수문자를 사용하기 위해서는 ' 또는 " 으로 문자열을 감싸서 지시어를 선언해야 함# worker 프로세스를 실행할 사용자 설정
# - 이 사용자에 따라 권한이 달라질 수 있다.
user nginx;
# 실행할 worker 프로세스 설정
# - 서버에 장착되어 있는 코어 수 만큼 할당하는 것이 보통, 더 높게도 설정 가능
worker_processes 1;
# 오류 로그를 남길 파일 경로 지정
error_log /var/log/nginx/error.log warn;
# NGINX 마스터 프로세스 ID 를 저장할 파일 경로 지정
pid /var/run/nginx.pid;
# 접속 처리에 관한 설정을 한다.
events {
# 워커 프로레스 한 개당 동시 접속 수 지정 (512 혹은 1024 를 기준으로 지정)
worker_connections 1024;
}
# 웹, 프록시 관련 서버 설정
http {
# mime.types 파일을 읽어들인다.
include /etc/nginx/mime.types;
# MIME 타입 설정
default_type application/octet-stream;
# 엑세스 로그 형식 지정
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;
# sendfile api 를 사용할지 말지 결정
sendfile on;
#tcp_nopush on;
# 접속시 커넥션을 몇 초동안 유지할지에 대한 설정
keepalive_timeout 65;
# (추가) nginx 버전을 숨길 수 있다. (보통 아래를 사용해서 숨기는게 일반적)
server_tokens off
#gzip on;
# /etc/nginx/conf.d 디렉토리 아래 있는 .conf 파일을 모두 읽어 들임
include /etc/nginx/conf.d/*.conf;
}
http 블록server와 location의 루트 블록이라고 할 수 있음http, server, location 블록은 계층 구조를 가지고 있음http 블록의 내용은 server 블록의 기본값이 되고, server 블록의 내용은 location 블록의 기본값이 됨http 블록 안에 한 개 이상의 server 블록을 선언할 수 있음server 블록server 블록은 하나의 호스트를 선언하는데 사용하며, http 블록 안에서만 사용할 수 있음server 블록에는 한 개 이상의 location 블록을 선언할 수 있음location 블록location 블록에는 server 블록 안에 정의되며, 특정 URL을 처리하는 방법을 정의http://example.com/hello/1 과 http://example.com/world/1 접근하는 요청을 다르게 처리하고 싶을 때 사용events 블록events 블록은 네트워크의 작동 환경을 설정하는 지시어를 제공events 블록의 지시어는 events 블록에서만 사용할 수 있고, http, server, local 블록과는 상속 관계를 갖지 않음events 블록 안에서만 사용해야 함accept_mutexaccept_mutex on;accept_mutex_delayaccept_mutex_delay 500ms;accept_mutex 지시어가 off 로 설정되어 있으면 이 값은 사용되지 않음worker_connectionsworker_connections 1024;worker_processes * worker_connections = 최대 접속자 수nginx는 리버스 프록시로도 활용할 수 있음
nginx는 SSL 설정도 가능http {
server {
listen 80;
location / {
proxy_pass http://127.0.0.1:8081;
}
}
}