์šฐ์„  Nginx ์„ค์ • ํŒŒ์ผ์€ ํฌ๊ฒŒ 2๊ฐ€์ง€๋กœ ๋‚˜๋‰œ๋‹ค.

๊ตฌ์กฐ๋ฅผ ๋‚˜๋ˆ”์œผ๋กœ์จ ์šด์˜ ์˜ํ–ฅ๋„๋ฅผ ์ค„์ด๊ณ  ์„ค์ • ์ถฉ๋Œ ๋ฐฉ์ง€, ์„œ๋น„์Šค ์ถ”๊ฐ€/์‚ญ์ œ๊ฐ€ ์‰ฌ์šฐ๋ฉฐ ๋กค๋ฐฑ์ด ์‰ฝ๋‹ค.

 

nginx ์„ค์ • ๊ตฌ์กฐ

/etc/nginx/
โ”œโ”€โ”€ nginx.conf          # ๋ฉ”์ธ ์„ค์ • ํŒŒ์ผ
โ”œโ”€โ”€ conf.d/                # ์„œ๋ฒ„๋ณ„ ์„ค์ • include
โ”‚   โ”œโ”€โ”€ default.conf
โ”‚   โ””โ”€โ”€ api.conf

โ”‚   โ””โ”€โ”€ web.conf

 

 

์ˆ˜์ • ์‹œ ์˜ํ–ฅ๋„ ํ™•์ธ

  • nginx.conf ์ˆ˜์ • → nginx ์ „์ฒด ์˜ํ–ฅ
  • conf.d/*.conf ์ˆ˜์ • → ํ•ด๋‹น ์„œ๋น„์Šค๋งŒ ์˜ํ–ฅ

 

 

1. ๋ฉ”์ธ ์„ค์ • (Main Config) - /etc/nginx/nginx.conf 

-> nginx ์ „์ฒด ํ”„๋กœ์„ธ์Šค/๋™์ž‘ ๋ฐฉ์‹์„ ์ •์˜ํ•˜๋Š” ๋ฃจํŠธ ์„ค์ •

 

1-1. ์ „์—ญ(Global) ์„ค์ •

user  nginx;
worker_processes  auto;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

 

  • user : nginx ํ”„๋กœ์„ธ์Šค ์‹คํ–‰ ๊ณ„์ •
  • worker_processes : ์›Œ์ปค ํ”„๋กœ์„ธ์Šค ๊ฐœ์ˆ˜
  • error_log : ์—๋Ÿฌ ๋กœ๊ทธ
  • pid : PID ํŒŒ์ผ

2-2. ์ด๋ฒคํŠธ ๋ธ”๋ก

๋™์‹œ์— ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•œ ์ปค๋„ฅ์…˜ ์ˆ˜

events {
    worker_connections  1024;
}

 

2-3. http ๋ธ”๋ก

HTTP ์„œ๋ฒ„ ์ „์—ญ ์„ค์ •

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format main '$remote_addr - $remote_user ...';
    access_log /var/log/nginx/access.log main;

    sendfile        on;
    keepalive_timeout 65;

    include /etc/nginx/conf.d/*.conf; //์„œ๋น„์Šค ์„ค์ •ํŒŒ์ผ include
    
    map $http_upgrade $connection_upgrade {
    default upgrade;   # 1์ˆœ์œ„: ์•„๋ฌด๊ฒƒ๋„ ๋งค์นญ ์•ˆ ๋˜๋ฉด ์ด๊ฑฐ
    '' close;          # 2์ˆœ์œ„: ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด ์ด๊ฑฐ
    }
}
  • MIME ํƒ€์ž…
  • ๋กœ๊ทธ ํฌ๋งท
  • gzip
  • proxy ๊ด€๋ จ ๊ธฐ๋ณธ๊ฐ’
  • SSL ๊ธฐ๋ณธ๊ฐ’
  • upstream ์ •์˜ ๊ฐ€๋Šฅ
  • ์ค‘์š”! ์„œ๋น„์Šค๋ณ„ ์„ค์ •์„ ์ง์ ‘ ๋‹ค ๋„ฃ๊ธฐ๋ณด๋‹ค๋Š” include ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ

 

ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

  ์ผ๋ฐ˜ HTTP WebSocket
์—ฐ๊ฒฐ ์š”์ฒญํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ ์—ฐ๊ฒฐ ํ•œ ๋ฒˆ ์—ฐ๊ฒฐํ•˜๋ฉด ๊ณ„์† ์œ ์ง€
๋ฐฉํ–ฅ ํด๋ผ์ด์–ธํŠธ → ์„œ๋ฒ„ (๋‹จ๋ฐฉํ–ฅ) ์–‘๋ฐฉํ–ฅ ์ž์œ ๋กญ๊ฒŒ
์‚ฌ์šฉ ์˜ˆ ์›นํŽ˜์ด์ง€, REST API, ์ด๋ฏธ์ง€ ๋กœ๋”ฉ ์ฑ„ํŒ…, ์•Œ๋ฆผ, ๊ฒŒ์ž„, ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ

 

๋งŒ์•ฝ์— WebSoket์„ ์‚ฌ์šฉํ•˜๋Š” ์‹œ์Šคํ…œ์ด๋ผ๋ฉด ์„œ๋น„์Šค ์„ค์ • ํŒŒ์ผ ์•ˆ์— ํ•ด๋‹น Proxy header๊ฐ€ ๋“ค์–ด์žˆ์„๊ฒƒ์ด๋‹ค.

       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection $connection_upgrade;

 

๊ทธ๋ ‡๋‹ค๋ฉด ๋ฉ”์ธ ์„ค์ • ํŒŒ์ผ์˜ http ๋ธ”๋ก ์•ˆ์— ์•„๋ž˜ ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด๊ฐ€์•ผํ•˜๋ฉฐ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜ ๋ฐœ์ƒํ•œ๋‹ค.

    map $http_upgrade $connection_upgrade {
    default upgrade;   # 1์ˆœ์œ„: ์•„๋ฌด๊ฒƒ๋„ ๋งค์นญ ์•ˆ ๋˜๊ฑฐ๋‚˜ ๋นˆ ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋ฉด ์ด๊ฑฐ
    '' close;          # 2์ˆœ์œ„: ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด ์ด๊ฑฐ
    }

 

์ผ€์ด์Šค 1: WebSocket ์š”์ฒญ

  • $http_upgrade = "websocket" (Upgrade ํ—ค๋” ๊ฐ’)
  • ๋งค์นญ ํ™•์ธ:
    • close ๋งค์นญ โŒ (๋นˆ ๋ฌธ์ž์—ด ์•„๋‹˜)
    • default upgrade ๋งค์นญ โญ•
  • ๊ฒฐ๊ณผ: $connection_upgrade = "upgrade"

์ผ€์ด์Šค 2: ์ผ๋ฐ˜ HTTP ์š”์ฒญ

  • $http_upgrade = "" (๋นˆ ๋ฌธ์ž์—ด, Upgrade ํ—ค๋” ์—†์Œ)
  • ๋งค์นญ ํ•™์ธ:
    • close ๋งค์นญ โญ• (์—ฌ๊ธฐ์„œ ๋!)
  • ๊ฒฐ๊ณผ: $connection_upgrade = "close"
  • default๋Š” ํ™•์ธ์กฐ์ฐจ ์•ˆ ํ•จ

์ผ€์ด์Šค 3: ์ด์ƒํ•œ ๊ฐ’์ด ๋“ค์–ด์˜จ ๊ฒฝ์šฐ

  • $http_upgrade = "something-weird"
  • ๋งค์นญ ํ™•์ธ:
    • close ๋งค์นญ โŒ (๋นˆ ๋ฌธ์ž์—ด ์•„๋‹˜)
    • default upgrade ๋งค์นญ โญ•
  • ๊ฒฐ๊ณผ: $connection_upgrade = "upgrade"

 

2. ์„œ๋น„์Šค ์„ค์ • (Service / Virtual Host) - /etc/nginx/conf.d/*.conf

HTTPS + WebSocket ์˜ˆ์‹œ

์•„๋ž˜ ์ฝ”๋“œ๋Š” nginx๋ฅผ proxy server๋กœ ์‚ฌ์šฉํ•œ ์˜ˆ์‹œ์ด๋‹ค.

server {
    listen 443 ssl;
    server_name chat.example.com;
    
    # SSL ํ•ด๋…์ฒ˜๋ฆฌ๋กœ HTTPS ์—ฌ๊ธฐ์„œ ์ฒ˜๋ฆฌ!
    ssl_certificate /etc/nginx/ssl/cert.pem;
    ssl_certificate_key /etc/nginx/ssl/key.pem;
    
    location / {
        proxy_pass http://localhost:8080; # proxy server
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade; # HTTP/WebSocket ์ฒ˜๋ฆฌ
        proxy_set_header Connection $connection_upgrade; # HTTP/WebSocket ์ฒ˜๋ฆฌ
        proxy_set_header Host $host;
    }
}

 

 

1. HTTPS ์š”์ฒญ (์ผ๋ฐ˜ ์›นํŽ˜์ด์ง€)

๋ธŒ๋ผ์šฐ์ € → https://chat.example.com (443 ํฌํŠธ)
         → nginx (SSL ํ•ด๋…)
         → http://localhost:8080 (ํ‰๋ฌธ HTTP๋กœ ์ „๋‹ฌ)

 

2. WebSocket ์—ฐ๊ฒฐ (wss://)

๋ธŒ๋ผ์šฐ์ € → wss://chat.example.com (443 ํฌํŠธ)
         → nginx (SSL ํ•ด๋… + WebSocket ์—…๊ทธ๋ ˆ์ด๋“œ)
         → ws://localhost:8080 (ํ‰๋ฌธ WebSocket์œผ๋กœ ์ „๋‹ฌ)

 

Proxy Server๋ž€ ๋ญ˜๊นŒ?

-> ์ค‘๊ฐ„ ๋‹ค๋ฆฌ ์—ญํ• ์„ ํ•ด์ฃผ๋Š” ์„œ๋ฒ„์ด๋‹ค.

-> Apache (with mod_proxy), Caddy, Envoy ๊ฐ™์€ Proxy Server๊ฐ€ ์กด์žฌํ•œ๋‹ค.

 

์‚ฌ์šฉ์ž ๋ธŒ๋ผ์šฐ์ € → nginx (80ํฌํŠธ) → Node.js ์•ฑ (3000ํฌํŠธ)

 

์‚ฌ์šฉ์ž๋Š” 80, 443 ์ธํ„ฐ๋„ท ํฌํŠธ๋งŒ ์•Œ๊ณ  ์ ‘์†ํ•˜๋ฉด ์•Œ์•„์„œ ์—ฌ๋Ÿฌ ์„œ๋ฒ„์˜ ํฌํŠธ๋กœ ์—ฐ๊ฒฐ์‹œ์ผœ์ค€๋‹ค.

 

  • ๋ณด์•ˆ: ์‹ค์ œ ์„œ๋ฒ„(3000ํฌํŠธ) ์ง์ ‘ ๋…ธ์ถœ ์•ˆ ํ•จ
  • ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ: ์—ฌ๋Ÿฌ ์„œ๋ฒ„์— ํŠธ๋ž˜ํ”ฝ ๋ถ„์‚ฐ
  • SSL ์ฒ˜๋ฆฌ: nginx๊ฐ€ HTTPS ์ฒ˜๋ฆฌ, ์•ฑ์€ HTTP๋งŒ
  • ์ •์  ํŒŒ์ผ: ์ด๋ฏธ์ง€ ๊ฐ™์€ ๊ฑด nginx๊ฐ€ ์ง์ ‘ ์„œ๋น™

์™œ nginx๊ฐ€ ์ •์  ํŒŒ์ผ ์„œ๋น™์— ๋น ๋ฅผ๊นŒ?

-> ์ด๋ฏธ์ง€ ์š”์ฒญ → nginx๊ฐ€ ๋””์Šคํฌ์—์„œ ๋ฐ”๋กœ ์ฝ์–ด์„œ ์ „์†กํ•˜๊ธฐ ๋•Œ๋ฌธ!

 

  • ์—„์ฒญ ๋น ๋ฆ„: C๋กœ ์ž‘์„ฑ๋จ, ํŒŒ์ผ ์ฝ๊ธฐ์— ์ตœ์ ํ™”
  • ๋ฐฑ์—”๋“œ ๋ถ€ํ•˜ ๊ฐ์†Œ: Node.js๊ฐ€ ํŒŒ์ผ ์ฒ˜๋ฆฌ ์•ˆ ํ•ด๋„ ๋จ ( ์ด๋ฏธ์ง€ ์š”์ฒญ → nginx → Node.js → ํŒŒ์ผ ์ฝ๊ธฐ → nginx → ๋ธŒ๋ผ์šฐ์ € ) 
  • ํšจ์œจ์  ๋ฉ”๋ชจ๋ฆฌ: ํŒŒ์ผ ์บ์‹ฑ, sendfile ์‹œ์Šคํ…œ์ฝœ ์‚ฌ์šฉ

 

 

'Server > Nginx' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

nginx ๋™์ ๋ชจ๋“ˆ(dynamic module) ๋นŒ๋“œํ•ด์„œ ์ ์šฉํ•˜๊ธฐ  (0) 2026.01.25

+ Recent posts