IT๊ธฐ์ดˆ

Nginx ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„ค์ •ํ•˜๋Š” ๋ฒ• – ํฌํŠธ ์—†์ด ๋„๋ฉ”์ธ์œผ๋กœ ์ ‘์†ํ•˜๊ธฐ

๐Ÿฅ„ํ…Œํฌ ํ•œ ์Šคํ‘ผ 2026. 5. 27. 13:57

๋ชฉ์ฐจ

  1. ํฌํŠธ ๋ฒˆํ˜ธ ์—†์ด ์ ‘์†ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด
  2. ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋ž€ ๋ฌด์—‡์ธ๊ฐ€?
  3. ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 
  4. Nginx ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„ค์ •ํ•˜๊ธฐ
  5. ์—ฌ๋Ÿฌ ์„œ๋น„์Šค๋ฅผ ๋„๋ฉ”์ธ์œผ๋กœ ๋ถ„๊ธฐํ•˜๋Š” ๋ฐฉ๋ฒ•
  6. ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ์— HTTPS ์ ์šฉํ•˜๊ธฐ
  7. ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜์™€ ํ•ด๊ฒฐ๋ฒ•
  8. ์ •๋ฆฌ ๋ฐ ๋‹ค์Œ ๋‹จ๊ณ„

1. ํฌํŠธ ๋ฒˆํ˜ธ ์—†์ด ์ ‘์†ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด

Node.js๋กœ ๋งŒ๋“  ์›น ์•ฑ์„ ์„œ๋ฒ„์— ์˜ฌ๋ฆฌ๋ฉด ๋ณดํ†ต 3000๋ฒˆ ํฌํŠธ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ ‘์†ํ•˜๋ ค๋ฉด myblog.com:3000์ฒ˜๋Ÿผ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ์ง์ ‘ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์‹ค์ œ ์„œ๋น„์Šค์—์„œ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ์€ ๋ณด๊ธฐ์—๋„ ์ข‹์ง€ ์•Š๊ณ  ๋ณด์•ˆ์ƒ์œผ๋กœ๋„ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๊ทธ๋ƒฅ myblog.com๋งŒ ์ž…๋ ฅํ•ด๋„ ์ ‘์†ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ ค๋ฉด ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

2. ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

**๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ(Reverse Proxy)**๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋ฐ›์•„ ๋‚ด๋ถ€ ์„œ๋ฒ„๋กœ ์ „๋‹ฌํ•˜๊ณ , ์‘๋‹ต์„ ๋‹ค์‹œ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋Œ๋ ค์ฃผ๋Š” ์ค‘๊ฐ„ ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค.

์‰ฌ์šด ๋น„์œ ๋กœ ์„ค๋ช…ํ•˜๋ฉด, ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋Š” ํšŒ์‚ฌ ์•ˆ๋‚ด ๋ฐ์Šคํฌ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์™ธ๋ถ€ ๋ฐฉ๋ฌธ๊ฐ(์‚ฌ์šฉ์ž)์ด ํšŒ์‚ฌ(์„œ๋ฒ„)์— ์˜ค๋ฉด ์•ˆ๋‚ด ๋ฐ์Šคํฌ(Nginx)๊ฐ€ ๋จผ์ € ๋งž์ดํ•˜๊ณ , ๋ฐฉ๋ฌธ ๋ชฉ์ ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๋ถ€์„œ(์‹ค์ œ ์•ฑ ์„œ๋ฒ„)๋กœ ์•ˆ๋‚ดํ•ด ์ค๋‹ˆ๋‹ค. ๋ฐฉ๋ฌธ๊ฐ์€ ์–ด๋А ๋ถ€์„œ๋กœ ์—ฐ๊ฒฐ๋˜๋Š”์ง€ ์•Œ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

ํฌ์›Œ๋“œ ํ”„๋ก์‹œ์™€ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋ฅผ ๊ฐ„๋‹จํžˆ ๋น„๊ตํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ตฌ๋ถ„ํฌ์›Œ๋“œ ํ”„๋ก์‹œ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ
์œ„์น˜ ํด๋ผ์ด์–ธํŠธ ์•ž ์„œ๋ฒ„ ์•ž
์—ญํ•  ํด๋ผ์ด์–ธํŠธ ๋Œ€์‹  ์š”์ฒญ ์„œ๋ฒ„ ๋Œ€์‹  ์‘๋‹ต
๋Œ€ํ‘œ ์šฉ๋„ VPN, ์ต๋ช…์„ฑ ๋ณดํ˜ธ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ, ํฌํŠธ ์ˆจ๊ธฐ๊ธฐ

3. ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

ํฌํŠธ ๋ฒˆํ˜ธ ์ˆจ๊ธฐ๊ธฐ: ์‚ฌ์šฉ์ž์—๊ฒŒ 3000, 8080 ๊ฐ™์€ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ๋…ธ์ถœํ•˜์ง€ ์•Š๊ณ  80, 443 ํฌํŠธ๋กœ๋งŒ ์ ‘์†ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

HTTPS ์ผ๊ด„ ์ ์šฉ: Nginx ์•ž๋‹จ์—์„œ SSL ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋ฉด ๋‚ด๋ถ€ ์•ฑ์€ HTTP๋กœ ํ†ต์‹ ํ•˜๋”๋ผ๋„ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” HTTPS๋กœ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜๋‚˜์˜ ์„œ๋ฒ„์—์„œ ์—ฌ๋Ÿฌ ์„œ๋น„์Šค ์šด์˜: ํฌํŠธ๋‚˜ ์„œ๋ธŒ๋„๋ฉ”์ธ์œผ๋กœ ์š”์ฒญ์„ ๋ถ„๊ธฐํ•ด ์—ฌ๋Ÿฌ ์•ฑ์„ ํ•˜๋‚˜์˜ ์„œ๋ฒ„์—์„œ ์šด์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณด์•ˆ ๊ฐ•ํ™”: ์‹ค์ œ ์•ฑ ์„œ๋ฒ„์˜ ์กด์žฌ๋ฅผ ์ˆจ๊ธฐ๊ณ  Nginx๊ฐ€ ๋จผ์ € ์š”์ฒญ์„ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.

4. Nginx ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„ค์ •ํ•˜๊ธฐ

Node.js ์•ฑ์ด 3000๋ฒˆ ํฌํŠธ์—์„œ ์‹คํ–‰ ์ค‘์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. myblog.com์œผ๋กœ ์ ‘์†ํ•˜๋ฉด ์ด ์•ฑ์œผ๋กœ ์—ฐ๊ฒฐ๋˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๋จผ์ € Nginx ์‚ฌ์ดํŠธ ์„ค์ • ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

 
 
sudo nano /etc/nginx/sites-available/myblog

ํŽธ์ง‘๊ธฐ๊ฐ€ ์—ด๋ฆฌ๋ฉด ์•„๋ž˜ ์„ค์ • ๋‚ด์šฉ์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. server_name์—๋Š” ๋ณธ์ธ์˜ ๋„๋ฉ”์ธ์„ ์ž…๋ ฅํ•˜๊ณ , proxy_pass์—๋Š” ์•ฑ์ด ์‹คํ–‰ ์ค‘์ธ ๋‚ด๋ถ€ ํฌํŠธ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

 
 
server {
    listen 80;
    server_name myblog.com www.myblog.com;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

์„ค์ • ํŒŒ์ผ์„ sites-enabled์— ์—ฐ๊ฒฐํ•ด ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

 
 
sudo ln -s /etc/nginx/sites-available/myblog /etc/nginx/sites-enabled/

์„ค์ • ํŒŒ์ผ ๋ฌธ๋ฒ•์— ์˜ค๋ฅ˜๊ฐ€ ์—†๋Š”์ง€ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.

 
 
sudo nginx -t

์ด์ƒ์ด ์—†์œผ๋ฉด Nginx์— ์„ค์ •์„ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.

 
 
sudo systemctl reload nginx

์ด์ œ myblog.com์œผ๋กœ ์ ‘์†ํ•˜๋ฉด ํฌํŠธ ๋ฒˆํ˜ธ ์—†์ด Node.js ์•ฑ์— ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

5. ์—ฌ๋Ÿฌ ์„œ๋น„์Šค๋ฅผ ๋„๋ฉ”์ธ์œผ๋กœ ๋ถ„๊ธฐํ•˜๋Š” ๋ฐฉ๋ฒ•

ํ•˜๋‚˜์˜ ์„œ๋ฒ„์—์„œ ์—ฌ๋Ÿฌ ์•ฑ์„ ์šด์˜ํ•  ๋•Œ, ์„œ๋ธŒ๋„๋ฉ”์ธ์œผ๋กœ ๊ฐ ์„œ๋น„์Šค๋ฅผ ๋ถ„๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด blog.myblog.com์€ 3000๋ฒˆ ํฌํŠธ ์•ฑ์œผ๋กœ, api.myblog.com์€ 4000๋ฒˆ ํฌํŠธ ์•ฑ์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

blog.myblog.com ์„ค์ • ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

 
 
sudo nano /etc/nginx/sites-available/blog

์•„๋ž˜ ์„ค์ •์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

 
 
server {
    listen 80;
    server_name blog.myblog.com;

    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

api.myblog.com ์„ค์ • ํŒŒ์ผ๋„ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ๋งŒ๋“ค๊ณ , proxy_pass ์ฃผ์†Œ๋งŒ http://localhost:4000์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์„ค์ • ํŒŒ์ผ์„ sites-enabled์— ์—ฐ๊ฒฐํ•˜๊ณ  Nginx๋ฅผ ์žฌ์‹œ์ž‘ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

6. ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ์— HTTPS ์ ์šฉํ•˜๊ธฐ

๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„ค์ • ํ›„ Certbot์œผ๋กœ HTTPS๋ฅผ ์ ์šฉํ•˜๋ฉด ์ž๋™์œผ๋กœ 80๋ฒˆ ์„ค์ •์„ 443์œผ๋กœ ์ „ํ™˜ํ•ด ์ค๋‹ˆ๋‹ค.

 
 
sudo certbot --nginx -d myblog.com -d www.myblog.com

Certbot์ด Nginx ์„ค์ • ํŒŒ์ผ์„ ์ž๋™์œผ๋กœ ์ˆ˜์ •ํ•˜๊ณ  SSL ์ธ์ฆ์„œ๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ http://๋กœ ์ ‘์†ํ•˜๋ฉด ์ž๋™์œผ๋กœ https://๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋ฉ๋‹ˆ๋‹ค.

7. ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜์™€ ํ•ด๊ฒฐ๋ฒ•

502 Bad Gateway ์˜ค๋ฅ˜ Nginx๊ฐ€ ์—ฐ๊ฒฐํ•˜๋ ค๋Š” ๋‚ด๋ถ€ ์•ฑ(localhost:3000)์ด ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  ์žˆ์„ ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. Node.js ์•ฑ์ด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰ ์ค‘์ธ์ง€ ๋จผ์ € ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์„ค์ • ํŒŒ์ผ ์ ์šฉ์ด ์•ˆ ๋  ๋•Œ sites-available์— ํŒŒ์ผ์„ ๋งŒ๋“ค์—ˆ์–ด๋„ sites-enabled์— ๋งํฌ๋ฅผ ๊ฑธ์ง€ ์•Š์œผ๋ฉด ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ln -s ๋ช…๋ น์œผ๋กœ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ๋งŒ๋“ค์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

Permission denied ์˜ค๋ฅ˜ Nginx๊ฐ€ ๋‚ด๋ถ€ ์†Œ์ผ“ ํŒŒ์ผ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์•ฑ์ด ์œ ๋‹‰์Šค ์†Œ์ผ“์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ํŒŒ์ผ ๊ถŒํ•œ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

8. ์ •๋ฆฌ ๋ฐ ๋‹ค์Œ ๋‹จ๊ณ„

์˜ค๋Š˜ ๋ฐฐ์šด ํ•ต์‹ฌ์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋Š” Nginx๊ฐ€ ์™ธ๋ถ€ ์š”์ฒญ์„ ๋ฐ›์•„ ๋‚ด๋ถ€ ์•ฑ ์„œ๋ฒ„๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.
  • proxy_pass ์„ค์ •์œผ๋กœ ํŠน์ • ๋„๋ฉ”์ธ ์š”์ฒญ์„ ๋‚ด๋ถ€ ํฌํŠธ๋กœ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์„œ๋ธŒ๋„๋ฉ”์ธ๋ณ„๋กœ ์„ค์ • ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ์—ฌ๋Ÿฌ ์„œ๋น„์Šค๋ฅผ ํ•˜๋‚˜์˜ ์„œ๋ฒ„์—์„œ ์šด์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Certbot๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด HTTPS๊นŒ์ง€ ์ž๋™์œผ๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๊ธ€์—์„œ๋Š” ๋ฆฌ๋ˆ…์Šค ํŒŒ์ผ ๊ถŒํ•œ(chmod, chown) ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.