Web Server
의 개념Web Server
의 기능Web Server
의 예WAS
의 개념WAS
는 Web Server
와 Web Container
가 합쳐진 형태로서, 웹 서버 단독으로는 처리할 수 없는 데이터베이스의 조회나 다양한 로직 처리가 필요한 동적 컨텐츠를 제공하는 덕분에 사용자의 다양한 요구에 맞춰 웹 서버리를 제공할 수 있음Container
란 JSP, Servlet을 실행시킬 수 있는 소프트웨어를 말함WAS
는 JSP, Servlet 구동 환경을 제공WAS
의 역할WAS
= Web Server
+ Web Container
Web 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
의 모든 기능 + 추가적인 기능Servlet
Servlet
이 수정된 경우 Java 코드를 컴파일(.class 파일 생성)한 후 동적인 페이지를 처리하기 때문에 전체 코드를 업데이트하고 다시 컴파일한 후 재배포하는 작업이 필요 (개발 생산성 저하)JSP
JSP
가 수정된 경우 재배포할 필요가 없이 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 directive
simple 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_mutex
accept_mutex on;
accept_mutex_delay
accept_mutex_delay 500ms;
accept_mutex
지시어가 off 로 설정되어 있으면 이 값은 사용되지 않음worker_connections
worker_connections 1024;
worker_processes * worker_connections = 최대 접속자 수
nginx
는 리버스 프록시로도 활용할 수 있음
nginx
는 SSL 설정도 가능http {
server {
listen 80;
location / {
proxy_pass http://127.0.0.1:8081;
}
}
}