Web Server์™€ WAS

์ฝ”๋”ฉ๋•ยท2024๋…„ 5์›” 7์ผ

๐Ÿ’ก Web Server์™€ WAS

1. Client

์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์š”์ฒญ์„ ๋ณด๋‚ด์ฃผ๋Š” ์ฃผ์ฒด

2. Web Server(WS)

์ •์ ์ธ ๋ฆฌ์†Œ์Šค(HTML, CSS, JS, ์ด๋ฏธ์ง€ ๋“ฑ)๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ์ œ๊ณตํ•˜๋Š” ์„œ๋ฒ„

  • Nginx, Apache

3. Web Application Server(WAS)

๋™์ ์ธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™ ๋ฐ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์„œ๋ฒ„

  • Tomcat, JBoss, Jeus, Spring Boot

4. DB

ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ์ •๋ณด๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ์ €์žฅ, ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ์Šคํ…œ

  • PostgreSQL, MYSQL

๐Ÿ” ์ •์  ์›น ํŽ˜์ด์ง€, ๋™์  ์›นํŽ˜์ด์ง€

์ •์  ์›นํŽ˜์ด์ง€

  • HTML, CSS, JavaScript ๋“ฑ ๊ณ ์ •๋œ ์ฝ˜ํ…์ธ ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์›น ํŽ˜์ด์ง€
  • ์„œ๋ฒ„์—์„œ ์š”์ฒญ์„ ๋ฐ›์œผ๋ฉด ํŒŒ์ผ ๊ทธ๋Œ€๋กœ ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)์— ์‘๋‹ต
  • ์ฃผ๋กœ ๋žœ๋”ฉ ํŽ˜์ด์ง€, ํฌํŠธํด๋ฆฌ์˜ค ์‚ฌ์ดํŠธ, ๋ฌธ์„œ ํŽ˜์ด์ง€ ๋“ฑ์— ์‚ฌ์šฉ๋จ

๋™์  ์›นํŽ˜์ด์ง€

  • ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(DB)์™€ ์—ฐ๋™ํ•˜์—ฌ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ฝ˜ํ…์ธ ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์›น ํŽ˜์ด์ง€
  • ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ๋งˆ๋‹ค ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ๋™์ ์œผ๋กœ HTML์„ ์ƒ์„ฑ
  • ๋กœ๊ทธ์ธ, ๊ฒŒ์‹œํŒ, ์‡ผํ•‘๋ชฐ, ์†Œ์…œ ๋ฏธ๋””์–ด ๊ฐ™์€ ๊ธฐ๋Šฅ์ด ํฌํ•จ๋œ ์›น ์‚ฌ์ดํŠธ
  • ๋ฐฑ์—”๋“œ ๊ธฐ์ˆ ์ด ํ•„์š”ํ•จ


ํ”„๋ก์‹œ

ํ”„๋ก์‹œ๋Š” ์ธํ„ฐ๋„ท ์ ‘์†์„ ํ•  ๋•Œ ๋ณด์•ˆ์ƒ์˜ ๋ฌธ์ œ๋กœ ์ง์ ‘ ํ†ต์‹ ์„ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์—†์„๋•Œ,
๊ทธ ์‚ฌ์ด์˜ ์ค‘๊ฐ„์—ญํ• ๋กœ ๋Œ€๋ฆฌ๋กœ ํ†ต์‹ ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ์›น์„ ํ†ตํ•ด ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด, ์ด ์š”์ฒญ์€ ๋จผ์ € ํ”„๋ก์‹œ ์„œ๋ฒ„๋ฅผ ๊ฑฐ์ณ ์›น ์„œ๋ฒ„์— ๋„๋‹ฌํ•˜๊ณ , ์ •์  ์ž์›์€ ์›น ์„œ๋ฒ„์—์„œ ์ง์ ‘ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ๋™์  ์š”์ฒญ์€ WAS๋กœ ์ „๋‹ฌ๋˜์–ด ์ตœ์ข…์ ์œผ๋กœ ์‘๋‹ต์ด ํด๋ผ์ด์–ธํŠธ์— ๋Œ์•„๊ฐ„๋‹ค.

๋˜ํ•œ ํ”„๋ก์‹œ๋Š” ํฌ๊ฒŒ ํฌ์›Œ๋“œ ํ”„๋ก์‹œ, ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋กœ ๋‚˜๋‰œ๋‹ค.

ํฌ์›Œ๋“œ ํ”„๋ก์‹œ(Foward)

ํด๋ผ์ด์–ธํŠธ์™€ ์ธํ„ฐ๋„ท ์‚ฌ์ด์— ์œ„์น˜ํ•˜์—ฌ, ์‚ฌ์šฉ์ž๊ฐ€ ์ธํ„ฐ๋„ท์— ์ง์ ‘ ์ ‘๊ทผํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ํฌ์›Œ๋“œ ํ”„๋ก์‹œ ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ๋ฐ›๊ณ  ์ธํ„ฐ๋„ท์— ์—ฐ๊ฒฐํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ์ „๋‹ฌ ํ•ด์ค€๋‹ค.

๋”ฐ๋ผ์„œ ํด๋ผ์ด์–ธํŠธ์˜ IP์ฃผ์†Œ๊ฐ€ ์›น ์„œ๋ฒ„์— ๋…ธ์ถœ๋˜์ง€ ์•Š๊ณ  ํŠน์ • IP์ฃผ์†Œ, ๋„๋ฉ”์ธ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ, ์ผ๋ฐ˜์ ์ธ ์›น ์„œ๋น„์Šค ๊ตฌ์กฐ์—์„œ๋Š” Reverse Proxy๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋Œ€๋ถ€๋ถ„์ด๋‹ค.

์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ธํ„ฐ๋„ท์— ์ž์œ ๋กญ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Forward Proxy๋Š” ๊ตณ์ด ํ•„์š” ์—†์Œ (๊ธฐ์—… ๋‚ด๋ถ€๋ง, ๋ณด์•ˆ ํ”„๋ผ์ด๋ฒ„์‹œ ๋ชฉ์ ์ผ๋•Œ๋งŒ ์‚ฌ์šฉ)

๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ(Reverse)

์ธํ„ฐ๋„ท๊ณผ ๋ฐฑ์—”๋“œ ์‚ฌ์ด์— ์œ„์น˜ํ•˜์—ฌ, ์‚ฌ์šฉ์ž๊ฐ€ ์ธํ„ฐ๋„ท์— ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋ฉด ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๊ฐ€ ์ด ์š”์ฒญ์„ ๋ฐ›์•„ ๋‚ด๋ถ€ ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์€ ํ›„ ํด๋ผ์ด์–ธํŠธ์— ์ „๋‹ฌํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ์„œ๋ฒ„์˜ IP ์ฃผ์†Œ๋ฅผ ๋…ธ์ถœ์‹œํ‚ค์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๊ตฌ์„ฑํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ WEB(Apache, nginx) - WAS(Tomcat) ๋ถ„๋ฆฌ ํ˜•ํƒœ๋ฅผ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.
nginx์€ ์›น์„œ๋ฒ„์ž„๊ณผ ๋™์‹œ์—, ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

โœ… ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ์˜ ์žฅ์ 

  • ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ
    ์„œ๋ฒ„์˜ ํŠธ๋ž˜ํ”ฝ์ด ๋ชฐ๋ฆฌ๊ฒŒ ๋˜๋ฉด ํ•˜๋‚˜์˜ ์„œ๋ฒ„๋กœ๋Š” ํ•ด๋‹น ์š”์ฒญ์„ ๊ฐ๋‹นํ•˜๊ธฐ ํž˜๋“ค์–ด ์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋Ÿด ๋•Œ ์—ฌ๋Ÿฌ ๋Œ€์˜ ์„œ๋ฒ„๋ฅผ ๋‘๊ณ  ์š”์ฒญ์„ ๋ถ„์‚ฐ์‹œํ‚ค๋Š” ๊ฒƒ์ด ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ์ด๋‹ค. ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋Š” ์—ฌ๋Ÿฌ ๋Œ€์˜ ์„œ๋ฒ„์— ๋ถ„์‚ฐ์‹œ์ผœ ์š”์ฒญ์„ ๋ณด๋‚ด๊ฒŒ ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์„œ๋ฒ„์˜ ๋ถ€ํ•˜๋ฅผ ๋ถ„์‚ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

  • ๋ณด์•ˆ
    ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋Š” ์›น ์„œ๋ฒ„ ์•ž์— ๋†“์ด๊ธฐ ๋•Œ๋ฌธ์— ์›น ์„œ๋ฒ„์— ์ง์ ‘ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์›น ์„œ๋ฒ„์˜ IP๋ฅผ ๋…ธ์ถœ์‹œํ‚ค์ง€ ์•Š์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์›น ์„œ๋ฒ„์— ๋Œ€ํ•œ 1์ฐจ์ ์ธ ๊ณต๊ฒฉ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค. (Proxy ์„œ๋ฒ„์˜ IP๋งŒ ๋…ธ์ถœ)

  • ์บ์‹ฑ
    ํ”„๋ก์‹œ ์„œ๋ฒ„์— ์บ์‹ฑ๋˜์–ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์— ๋Œ€ํ•œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. (ํฌ์›Œ๋“œ ํ”„๋ก์‹œ ์บ์‹ฑ๊ณผ ๋น„์Šทํ•œ ๊ธฐ๋Šฅ์ด๊ธฐ๋„ ํ•˜๋ฉฐ ํ”„๋ก์‹œ ์„œ๋ฒ„์˜ ๋ณธ๋ž˜ ๊ธฐ๋Šฅ์ด๋‹ค.)

  • SSL
    SSL์€ HTTPS๋กœ ์•Œ๋ ค์ง„ ๋ณด์•ˆ ํ”„๋กœํ† ์ฝœ์˜ ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ๋กœ ๊ธฐ๋ณธ HTTP๋ฅผ ์•”ํ˜ธํ™”ํ•˜์—ฌ HTTPS๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€์˜ ๊ฐœ์ธ์ •๋ณด์™€ ๊ธฐ๋ฐ€ ์ •๋ณด๋ฅผ ๋ณดํ˜ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.


nginx์˜ configํŒŒ์ผ๊ณผ proxy ์„ค์ •

user nginx;   # ํ”„๋กœ์„ธ์Šค์˜ ์‹คํ–‰๋˜๋Š” ๊ถŒํ•œ
worker_processes auto;   # ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•  ๊ฒƒ์ธ์ง€๋ฅผ ์ง€์ •, ๋ณดํ†ต auto๋กœ ์ ์šฉํ•œ๋‹ค.
error_log  /var/log/nginx/error.log warn;   # ๋กœ๊ทธ ๋ ˆ๋ฒจ ์„ค์ •
pid        /var/run/nginx.pid;   # nginx์˜ ๋งˆ์Šคํ„ฐ ํ”„๋กœ์„ธ์Šค id์ •๋ณด๊ฐ€ ์ €์žฅ๋œ๋‹ค.
events {
    worker_connections  1024;   # ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ปค๋„ฅ์…˜์˜ ์ˆซ์ž
}
http {
    include       /etc/nginx/mime.types; # ์˜ต์…˜ ํ•ญ๋ชฉ์„ ์„ค์ •ํ•ด๋‘” ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •
    default_type  application/octet-stream; # ์˜ฅํ…Ÿ ์ŠคํŠธ๋ฆผ ๊ธฐ๋ฐ˜์˜ http๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ง€์‹œ์–ด
    
    # WAS, ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„(๋ฐฑ์—”๋“œ)๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ nginx์™€ ์—ฐ๊ฒฐํ•œ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋ฅผ ์ง€์ •ํ•œ๋‹ค.
    # ํ•˜์œ„์— ์žˆ๋Š” server ์ง€์‹œ์–ด๋Š” ์—ฐ๊ฒฐํ•  ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์˜ host์ฃผ์†Œ:ํฌํŠธ๋ฅผ ์ง€์ •ํ•œ๋‹ค.
    upstream docker-server { 
        server server:8080;
    }
    
    # ํ•˜๋‚˜์˜ ์›น ์‚ฌ์ดํŠธ๋ฅผ ์„ ์–ธํ•˜๋Š”๋ฐ ์‚ฌ์šฉ. 
    # server ๋ธ”๋ก์ด ์—ฌ๋Ÿฌ ๊ฐœ์ด๋ฉด ํ•œ ๊ฐœ์˜ ๋จธ์‹ (ํ˜ธ์ŠคํŠธ)์— ์—ฌ๋Ÿฌ ์›น์‚ฌ์ดํŠธ๋ฅผ ์„œ๋น™ํ• ์ˆ˜์žˆ์œผ๋ฉฐ ๊ฐ€์ƒ ํ˜ธ์ŠคํŠธ๋ผ๊ณ  ํ•œ๋‹ค.
    server {
        listen 80;   # ์ด ์›น ์‚ฌ์ดํŠธ๊ฐ€ ๋ฐ”๋ผ๋ณด๋Š” ํฌํŠธ
        server_name localhost;   # ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ ‘์†ํ•˜๋Š” ์„œ๋ฒ„(์ฃผ๋กœ ๋„๋ฉ”์ธ)
        
        # ํŠน์ • ์›น ์‚ฌ์ดํŠธ์˜ url์„ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค. 
        location / {
            root /usr/share/nginx/html;                # ํ”„๋ŸฐํŠธ์—”๋“œ buildํŒŒ์ผ ๊ฒฝ๋กœ
            index index.html index.htm;
            try_files $uri $uri/ /index.html =404;
        }
        location /api {
            proxy_pass         http://docker-server;   # ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋กœ ์š”์ฒญ์ „๋‹ฌ
            proxy_redirect     off;
            proxy_set_header   Host $host;             # HTTP์š”์ฒญ ์ฒ˜๋ฆฌ
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
    server_tokens     off;   # ํ—ค๋”์— nginx๋ฒ„์ „์„ ์ˆจ๊ธฐ๋Š” ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค. ๋ณด์•ˆ์ƒ off๋กœ ์„ค์ •์„ ๊ถŒ์žฅ
    keepalive_timeout  65;   # ์ ‘์†์‹œ ์ปค๋„ฅ์…˜ ์œ ์ง€ ์‹œ๊ฐ„์„ ์ง€์ •ํ•œ๋‹ค.
    include /etc/nginx/conf.d/*.conf;
}

0๊ฐœ์˜ ๋Œ“๊ธ€