Skip to content

๐Ÿš€ nginx proxy pass๋ฅผ ๋ฐ”๊ฟจ๋”๋‹ˆ ์ƒ๊ธด ์—๋Ÿฌ โ€ ์Šค์›จ๊ฑฐ ์ธ์‹ ๋ฌธ์ œ

Yoonseo Han edited this page Dec 3, 2024 · 1 revision

๋ฐฑ์—”๋“œ ์„œ๋ฒ„์˜ proxy pass๋ฅผ ๊ธฐ์กด์˜ http://backend์—์„œ http://backend/๋กœ ์ˆ˜์ •ํ–ˆ๋”๋‹ˆ ์ƒ๊ธฐ๋Š” ์—๋Ÿฌ์— ๊ด€ํ•œ ์ •๋ฆฌ๋ฅผ ํ•œ ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค

์ดˆ๊ธฐ ์ƒํ™ฉ

์šฐ์„  ํด๋ผ์šฐ๋“œ์—์„œ ๋„์ปค๋ฅผ ๋Œ๋ฆฌ๋ ค ํ•˜๋‹ค๋ณด๋‹ˆ ๊ณ„์†ํ•ด์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ์„ ํ•˜์˜€๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ๋กœ์ปฌ์—์„œ ๋„์ปค๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋Š” ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•ด๋‘์—ˆ๋‹ค

ํ˜„์žฌ ๋ฐฑ์—”๋“œ์— ๋ณ„๋„์˜ api์— ๊ด€๋ จ๋œ ์ฝ”๋“œ๊ฐ€ ์—†์—ˆ๊ธฐ์— ๋ฐฑ์—”๋“œ ํ…Œ์ŠคํŠธ๋กœ ๊ฐ€์žฅ ์ง๊ด€์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ ๊ฒƒ์ด public ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์— ์žˆ๋Š” server-test.html ํŒŒ์ผ์„ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.

nginx์˜ ์„ค์ •์„ ๋ณด๊ฒŒ ๋˜๋ฉด

location /api {
    proxy_pass http://backend;
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
}

ํ•ด๋‹น ๋ฐฉ์‹์œผ๋กœ /api์˜ prefix๋ฅผ ๋ถ™์ด๋Š” ์š”์ฒญ๋“ค์ด ๋ฐฑ์—”๋“œ ์ปจํ…Œ์ด๋„ˆ๋กœ ํ–ฅํ•˜๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ ‡๊ธฐ์— localhost/api/socket-test.html๋กœ GET ์š”์ฒญ์„ ๋ณด๋‚ด๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ ์ดˆ๊ธฐ์— ๋ฐฑ์—”๋“œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋Œ๋ฆฌ๊ณ  ๊ธฐ์กด์ฒ˜๋Ÿผ socket-test.html ์š”์ฒญ์„ ๋ณด๋‚ด๋„ 404์—๋Ÿฌ๊ฐ€ ์ง€์†์ ์œผ๋กœ ๋‚˜์™”๋‹ค.

socket-test.html์€ ์„œ๋ฒ„ ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์— ์žˆ๋Š” ํŒŒ์ผ์ด๋‹ค๋ณด๋‹ˆ ๋ฐฑ์—”๋“œ์— ์š”์ฒญ์„ ๋ณด๋‚ผ๋•Œ /api๋ฅผ ์„ ํ–‰ํ•˜์—ฌ ๋ณด๋‚ด์•ผ ํ•˜๋Š”๋ฐ ๊ทธ๋ ‡๊ฒŒ ๋  ๊ฒฝ์šฐ prefix ๊นŒ์ง€ ์ •์ ํŒŒ์ผ ์š”์ฒญ ๊ฒฝ๋กœ์— ํฌํ•จ์ด ๋˜์„œ public ์•ˆ์—์„œ ํŒŒ์ผ์„ ์ฐพ์ง€๋ฅผ ๋ชปํ•œ๋‹ค

์‚ฌ์‹ค ์ด๋Ÿฐ ๊ฒฝ์šฐ

app.useStaticAssets(join(__dirname, '..', 'public'), {
  prefix: '/api'});
}

์ด๋Ÿฐ ์‹์œผ๋กœ prefix๋ฅผ ์ง€์ •ํ•ด์ฃผ๋ฉด ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์—์„œ ์ •์  ํŒŒ์ผ ์„œ๋น™์„ ์ง„ํ–‰์„ ํ• ๋•Œ, ์š”์ฒญ ์ฃผ์†Œ์˜ /api prefix๋ฅผ ์•Œ์•„์„œ ์ œ๊ฑฐ๋ฅผ ํ•ด์ฃผ๊ณ  ์˜ฌ๋ฐ”๋ฅธ ๊ฒฝ๋กœ๋กœ ์ง„ํ–‰์ด ๋˜๋Š”๋ฐ ๋‚˜์˜ ๊ฒฝ์šฐ๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ๊ฐ€ ์žˆ๋‹ค!!!

๋‚˜ ๊ฐ™์€ ๊ฒฝ์šฐ nginx์˜ default.conf์—์„œ ์ง์ ‘์ ์œผ๋กœ ๋ชจ๋“  ์š”์ฒญ์— ๊ด€ํ•˜์—ฌ api prefix๋ฅผ ์ œ์™ธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ๋‹ค

location /api {
    proxy_pass http://backend/; //์—ฌ๊ธฐ์— ๋ฐฑ์Šฌ๋ž˜์‹œ ์ถ”๊ฐ€!!!!
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
}

์š”๋Ÿฐ์‹์œผ๋กœ proxy_pass์— trailing slash๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋  ๊ฒฝ์šฐ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์— ๊ด€ํ•˜์—ฌ api๊ฐ€ ์ œ๊ฑฐ๊ฐ€ ๋œ๋‹ค

์˜ˆ๋ฅผ ๋“ค์–ด /api/users์ด๋Ÿฐ์‹์˜ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๊ฒŒ ๋  ๊ฒฝ์šฐ, ๋ฐฑ์—”๋“œ๋กœ ๋‘˜๋‹ค ์ฒ˜๋ฆฌ๊ฐ€ ๋˜๋Š”๊ฑด ๋˜‘๊ฐ™์ง€๋งŒ

  • trailing slash ์—†๋Š” ๊ฒฝ์šฐ: http://backend/users (api๊ฐ€ ์ œ๊ฑฐ๋จ)
  • trailing slash ์žˆ๋Š” ๊ฒฝ์šฐ: http://backend/api/users (api๊ฐ€ ์ œ๊ฑฐ๋˜๋‹ˆ ์•Š์Œ)

๊ทธ๋ ‡๊ธฐ์— ์ •์  ํŒŒ์ผ ์š”์ฒญ๊ณผ backend api ์š”์ฒญ๋“ค ๋ชจ์กฐ๋ฆฌ ๋‹ค api๊ฐ€ ๋ฌด์‹œ๋˜์–ด์„œ ๊ทธ๋ฆฌ ์ง„ํ–‰์„ ๋งŒ์•ฝ ํ•  ๊ฒฝ์šฐ, ๋ฐฑ์—”๋“œ์— ๊ด€ํ•œ ์š”์ฒญ์ฒ˜๋ฆฌ์™€ swagger๊ฐ€ ์ •์ƒ ์ž‘๋™์ด ๋˜์ง€ ์•Š๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค!

setGlobalPrefix์— ๊ด€ํ•˜์—ฌ ์•Œ์•„๋ณด์ž

app.setGlobalPrefix('api');
  • ๋ชจ๋“  ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋ผ์šฐํŠธ์— ์ž๋™์œผ๋กœ '/api' prefix ์ถ”๊ฐ€
  • ์ปจํŠธ๋กค๋Ÿฌ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•  ํ•„์š” ์—†์ด ์ „์—ญ์ ์œผ๋กœ ์ ์šฉ

setGlobalPrefix('api') ์ ์šฉ ์ „:

GET /users
POST /users

setGlobalPrefix('api') ์ ์šฉ ํ›„:

GET /api/users
POST /api/users

static file๊ณผ ์Šค์›จ๊ฑฐ์—์„œ ๊ฒฝ๋กœ๋ฅผ ์ธ์‹์„ ๋ชปํ•˜๋Š” ๋ฌธ์ œ!!!

setGlobalPrefix๋Š” ๋ผ์šฐํŠธ ํ•ธ๋“ค๋Ÿฌ(์ปจํŠธ๋กค๋Ÿฌ์˜ ์—”๋“œํฌ์ธํŠธ)์—๋งŒ ์ ์šฉ๋˜๊ณ , ์ •์  ํŒŒ์ผ ์„œ๋น™์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

๋˜ํ•œ setGlobalPrefix๋Š” Swagger์™€๋„ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ์— swagger๋‚ด์—์„œ๋„ ๋ณ„๋„๋กœ prefix๋ฅผ ์„ค์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค

๋”ฐ๋ผ์„œ ๋‘๊ฐœ์˜ ๊ฒฝ์šฐ์—๋Š” prefix๋ฅผ ๋”ฐ๋กœ ํ•ด๋‹น ์ฝ”๋“œ๋“ค ์•ˆ์—์„œ ๋ช…์‹œ๋ฅผ ํ•ด๋‘ฌ์•ผํ•œ๋‹ค

SwaggerModule.setup('api/api-document', app, document);

app.useStaticAssets(join(__dirname, '..', 'public'), {
  prefix: '/api',
});

inear

๊ธฐ์ˆ  ๊ณต์œ 

๐Ÿš€ ffmpeg๋Š” stderr๋กœ ๋””๋ฒ„๊น…์„ ํ•˜๋Š” ์ด์œ 
๐Ÿš€ HLS ํ”„๋กœํ† ์ฝœ์— ๊ด€ํ•œ ์ •๋ฆฌ ๋ฐ FFmpeg ์‚ฌ์šฉ๊ธฐ
๐Ÿš€ ๋น„ํŠธ๋Š” tsconfig.json์ด ์„ธ ๊ฐœ?
๐Ÿš€ NestJS ๊ธฐ๋ณธ ๊ฐœ๋… - Modules
๐Ÿš€ Socket.io ์ตœ(๊ฐ•)์ ํ™”
๐Ÿš€ ๋„์ปค์™€ nginx์˜ ์‚ฌ์šฉ๊ธฐ
๐Ÿš€ ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด์ž

๊ฐœ๋ฐœ ์ผ์ง€

๐Ÿš€ FSD ์‚ฌ์šฉ๊ธฐ, ๊ทผ๋ฐ ์ด์ œ ๋‚˜๋งŒ์˜ ๊ทœ์น™์„ ๊ณ๋“ค์ธ
๐Ÿš€ CICD ๊ตฌ์กฐ ์ˆ˜์ •
๐Ÿš€ ์•จ๋ฒ” ๋‹จ์œ„๋กœ ์ŠคํŠธ๋ฆฌ๋ฐ ํ•˜๊ธฐ (with HLS)
๐Ÿš€ HLS๋กœ ์Œ์•… ์ฃผ๊ณ ๋ฐ›๊ธฐ
๐Ÿš€ vite + react + typescript ํ™˜๊ฒฝ์—์„œ path alias ์„ค์ •
๐Ÿš€ React Scan์ด ๋ญ์ฃ ?
๐Ÿš€ ๋กœ์ปฌ ํ™˜๊ฒฝ ๊ฐœ๋ฐœ ๋ชจ๋“œ ๋ฐฐํฌ
๐Ÿš€ ์•จ๋ฒ” ์ „์ฒด๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐํ•œ๋‹ค๊ณ ? (with HLS)
๐Ÿš€ ์ฝ”๋“œ์˜ ์•ˆ์ •์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž

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

๐Ÿš€ ์ƒˆ๋กœ๊ณ ์นจ ์‹œ HLS ERROR
๐Ÿš€ input ํƒœ๊ทธ์— ํ•œ๊ธ€ ์ž…๋ ฅ ํ›„, Enter๋ฅผ ๋ˆ„๋ฅด๋ฉด ํ•จ์ˆ˜๊ฐ€ ๋‘๋ฒˆ ํ˜ธ์ถœ๋˜๋Š” ์˜ค๋ฅ˜
๐Ÿš€ nginx proxy pass๋ฅผ ๋ฐ”๊ฟจ๋”๋‹ˆ ์ƒ๊ธด ์—๋Ÿฌ - ์Šค์›จ๊ฑฐ ์ธ์‹ ๋ฌธ์ œ
๐Ÿš€ ๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ WS handshake
๐Ÿš€ ๋ Œ๋”๋ง ๋ฒ”์ธ์€ ํ•˜๋‚˜!

ํ˜‘์—… ๊ทœ์น™

๐ŸŒˆ ๊ทธ๋ผ์šด๋“œ ๋ฃฐ
๐Ÿฅ” ํŒ€์› ์†Œ๊ฐœ
๐Ÿ”Ž ์ฝ”๋“œ & ๊นƒ ์ปจ๋ฒค์…˜
๐ŸŒณ ๊นƒ branch ์ „๋žต
๐Ÿ“Œ ๋…ธ์…˜ ๋ฌธ์„œ ์ €์žฅ์†Œ

ํ”„๋กœ์ ํŠธ ๊ธฐํš

๐ŸŽจ ํ”ผ๊ทธ๋งˆ
๐Ÿง‘โ€๐Ÿ’ป ๊ธฐํš ๊ณต์œ  ๋ฐœํ‘œ ์ž๋ฃŒ
๐ŸŽค 2์ฃผ์ฐจ ๋ฐœํ‘œ ์ž๋ฃŒ
๐Ÿ˜Ž ๋ฐฑ๋กœ๊ทธ

๋ฐ์ผ๋ฆฌ ์Šคํฌ๋Ÿผ

๐Ÿ“ 1์ฃผ์ฐจ
๐Ÿ“ 2์ฃผ์ฐจ
๐Ÿ“ 3์ฃผ์ฐจ
๐Ÿ“ 4์ฃผ์ฐจ
๐Ÿ“ 5์ฃผ์ฐจ

์ฃผ๊ฐ„ ๊ณ„ํš์„œ

๐Ÿ—“๏ธ 1์ฃผ์ฐจ
๐Ÿ—“๏ธ 2์ฃผ์ฐจ
๐Ÿ—“๏ธ 3์ฃผ์ฐจ
๐Ÿ—“๏ธ 4์ฃผ์ฐจ
๐Ÿ—“๏ธ 5์ฃผ์ฐจ

๊ทธ๋ฃน ํšŒ๊ณ 

โœจ 1์ฃผ์ฐจ
โœจ 2์ฃผ์ฐจ
โœจ 3์ฃผ์ฐจ
โœจ 4์ฃผ์ฐจ


view

Clone this wiki locally