IM Info
3 min read

NixOS ์ž…๋ฌธ: ์„ ์–ธํ˜• ์‹œ์Šคํ…œ ์„ค์ •์ด๋ž€

NixOS ์ž…๋ฌธ: ์„ ์–ธํ˜• ์‹œ์Šคํ…œ ์„ค์ •
Table of Contents

NixOS๋Š” ๋‹ค๋ฅธ ๋ฆฌ๋ˆ…์Šค ๋ฐฐํฌํŒ๊ณผ ๊ทผ๋ณธ์ ์œผ๋กœ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๋ฐฐํฌํŒ์€ ๋ช…๋ น์–ด๋ฅผ ํ•˜๋‚˜์”ฉ ์‹คํ–‰ํ•˜๋ฉฐ ์‹œ์Šคํ…œ์„ โ€œ๋ช…๋ นํ˜•(imperative)โ€œ์œผ๋กœ ๊ตฌ์„ฑํ•˜์ง€๋งŒ, NixOS๋Š” ํ•˜๋‚˜์˜ ์„ค์ • ํŒŒ์ผ์— ์›ํ•˜๋Š” ์‹œ์Šคํ…œ ์ƒํƒœ๋ฅผ โ€œ์„ ์–ธ(declare)โ€œํ•˜๋ฉด ๊ทธ ์ƒํƒœ๋ฅผ ๊ทธ๋Œ€๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” โ€œ์„ ์–ธํ˜•(declarative)โ€ ๋ฐฉ์‹์„ ์ทจํ•ฉ๋‹ˆ๋‹ค.

๋ช…๋ นํ˜•๊ณผ ์„ ์–ธํ˜•์˜ ์ฐจ์ด

์ผ๋ฐ˜์ ์ธ ๋ฐฐํฌํŒ์—์„œ ์›น ์„œ๋ฒ„๋ฅผ ์„ค์ •ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด ์ด๋Ÿฐ ์ˆœ์„œ๋ฅผ ๊ฑฐ์นฉ๋‹ˆ๋‹ค.

  1. apt install nginx๋กœ ํŒจํ‚ค์ง€ ์„ค์น˜
  2. ์„ค์ • ํŒŒ์ผ์„ ์ง์ ‘ ํŽธ์ง‘
  3. ์„œ๋น„์Šค ํ™œ์„ฑํ™” ๋ฐ ์‹œ์ž‘

๋ฌธ์ œ๋Š” ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ์‹œ์Šคํ…œ์ด โ€œ์ง€๊ธˆ๊นŒ์ง€ ์‹คํ–‰ํ•œ ๋ช…๋ น์–ด์˜ ๋ˆ„์  ๊ฒฐ๊ณผโ€๊ฐ€ ๋˜์–ด๋ฒ„๋ฆฐ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ์—์„œ ์žฌํ˜„ํ•˜๋ ค๋ฉด ์‹คํ–‰ํ–ˆ๋˜ ๋ชจ๋“  ๋ช…๋ น์„ ์ •ํ™•ํžˆ ๊ธฐ์–ตํ•˜๊ณ  ์ˆœ์„œ๋Œ€๋กœ ๋‹ค์‹œ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

NixOS์—์„œ๋Š” /etc/nixos/configuration.nix ํŒŒ์ผ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์›ํ•˜๋Š” ์ƒํƒœ๋ฅผ ์ ์Šต๋‹ˆ๋‹ค.

services.nginx = {
  enable = true;
  virtualHosts."example.com" = {
    root = "/var/www/example";
  };
};

๊ทธ๋ฆฌ๊ณ  nixos-rebuild switch ๋ช…๋ น ํ•œ ๋ฒˆ์ด๋ฉด, Nix๊ฐ€ ์ด ์„ค์ •์— ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ(ํŒจํ‚ค์ง€ ์„ค์น˜, ์„ค์ • ํŒŒ์ผ ์ƒ์„ฑ, ์„œ๋น„์Šค ํ™œ์„ฑํ™”)์„ ์•Œ์•„์„œ ๊ณ„์‚ฐํ•ด ์‹œ์Šคํ…œ์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ์„ค์ • ํŒŒ์ผ ํ•˜๋‚˜๋งŒ ์žˆ์œผ๋ฉด ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ์—์„œ๋„ ์™„์ „ํžˆ ๋™์ผํ•œ ์‹œ์Šคํ…œ์„ ๊ทธ๋Œ€๋กœ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Nix ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €์˜ ํ•ต์‹ฌ: ๊ฒฉ๋ฆฌ์™€ ์žฌํ˜„์„ฑ

Nix ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋Š” ๋ชจ๋“  ํŒจํ‚ค์ง€๋ฅผ /nix/store/ํ•ด์‹œ๊ฐ’-ํŒจํ‚ค์ง€์ด๋ฆ„ ํ˜•ํƒœ์˜ ๊ณ ์œ ํ•œ ๊ฒฝ๋กœ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ํ•ด์‹œ๊ฐ’์€ ํŒจํ‚ค์ง€์˜ ์†Œ์Šค, ๋ฒ„์ „, ๋นŒ๋“œ ์˜ต์…˜, ์˜์กด์„ฑ์„ ๋ชจ๋‘ ํฌํ•จํ•ด ๊ณ„์‚ฐ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ™์€ ์†Œํ”„ํŠธ์›จ์–ด๋ผ๋„ ๋นŒ๋“œ ์กฐ๊ฑด์ด ๋‹ค๋ฅด๋ฉด ์™„์ „ํžˆ ๋‹ค๋ฅธ ๊ฒฝ๋กœ์— ๋ณ„๋„๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

์ด ๊ตฌ์กฐ ๋•๋ถ„์— ์–ป๋Š” ์ด์ ์ด ํฝ๋‹ˆ๋‹ค.

  • ๋ฒ„์ „ ์ถฉ๋Œ์ด ์—†์Œ: ๊ฐ™์€ ํŒจํ‚ค์ง€์˜ ๋‹ค๋ฅธ ๋ฒ„์ „์ด ๋™์‹œ์— ์‹œ์Šคํ…œ์— ์กด์žฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ A๋Š” Python 3.9๋ฅผ, ํ”„๋กœ์ ํŠธ B๋Š” Python 3.12๋ฅผ ์“ฐ๋”๋ผ๋„ ์„œ๋กœ ์ „ํ˜€ ๊ฐ„์„ญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์•ˆ์ „ํ•œ ๋กค๋ฐฑ: ์‹œ์Šคํ…œ์„ ์—…๋ฐ์ดํŠธํ•ด๋„ ์ด์ „ ์„ค์ •์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ /nix/store ๊ฒฝ๋กœ๋Š” ๊ทธ๋Œ€๋กœ ๋‚จ์•„ ์žˆ์–ด์„œ, ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋ฉด ์ด์ „ ์„ธ๋Œ€(generation)๋กœ ์ฆ‰์‹œ ๋ถ€ํŒ…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์™„๋ฒฝํ•œ ์žฌํ˜„์„ฑ: ๊ฐ™์€ configuration.nix ํŒŒ์ผ์ด๋ผ๋ฉด ์–ด๋–ค ์ปดํ“จํ„ฐ์—์„œ ๋นŒ๋“œํ•˜๋“  ๋™์ผํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ์˜ ํ™œ์šฉ: nix-shell

NixOS์˜ ์ง„๊ฐ€๋Š” ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์„ฑ์—์„œ ๋”์šฑ ๋‘๋“œ๋Ÿฌ์ง‘๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— shell.nix ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ํ•„์š”ํ•œ ๋„๊ตฌ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „์„ ๋ช…์‹œํ•ด๋‘๋ฉด, nix-shell ๋ช…๋ น ํ•œ ๋ฒˆ์œผ๋กœ ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์— ํ•„์š”ํ•œ ์ •ํ™•ํ•œ ๋ฒ„์ „์˜ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด ๊ทธ ์ž๋ฆฌ์—์„œ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํŒ€์› ์ „์ฒด๊ฐ€ ์™„์ „ํžˆ ๋™์ผํ•œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ด๊ณ , โ€œ๋‚ด ์ปดํ“จํ„ฐ์—์„œ๋Š” ๋˜๋Š”๋ฐโ€ ๋ฌธ์ œ๋ฅผ ๊ทผ๋ณธ์ ์œผ๋กœ ์ค„์—ฌ์ค๋‹ˆ๋‹ค.

์ง„์ž… ์žฅ๋ฒฝ: Nix ์–ธ์–ด

NixOS๋ฅผ ๋ฐฐ์šฐ๋Š” ๋ฐ ๊ฐ€์žฅ ํฐ ์žฅ๋ฒฝ์€ Nix๋ผ๋Š” ํ•จ์ˆ˜ํ˜• ์„ค์ • ์–ธ์–ด ์ž์ฒด์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์…ธ ์Šคํฌ๋ฆฝํŠธ๋‚˜ YAML๊ณผ๋Š” ๋ฌธ๋ฒ•์ด ๋งŽ์ด ๋‹ฌ๋ผ์„œ, ์ฒ˜์Œ์—๋Š” ๊ฐ„๋‹จํ•œ ์„ค์ •์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐ๋„ ์‹œ๊ฐ„์ด ๊ฝค ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ณต์‹ ๋งค๋‰ด์–ผ๊ณผ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๋งŒ๋“  ํ•™์Šต ์ž๋ฃŒ(Nix Pills ๋“ฑ)๊ฐ€ ์ž˜ ์ •๋ฆฌ๋˜์–ด ์žˆ์–ด์„œ, ์‹œ๊ฐ„์„ ํˆฌ์žํ•  ์˜์ง€๋งŒ ์žˆ๋‹ค๋ฉด ์ถฉ๋ถ„ํžˆ ๊ทน๋ณต ๊ฐ€๋Šฅํ•œ ์ˆ˜์ค€์ž…๋‹ˆ๋‹ค.

์–ด๋–ค ์‚ฌ๋žŒ์—๊ฒŒ ์–ด์šธ๋ฆด๊นŒ

  • ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ์˜ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์™„๋ฒฝํ•˜๊ฒŒ ๊ฒฉ๋ฆฌํ•˜๊ณ  ์‹ถ์€ ๊ฐœ๋ฐœ์ž
  • ์‹œ์Šคํ…œ ์„ค์ •์„ ํ…์ŠคํŠธ ํŒŒ์ผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ(Git)์— ์˜ฌ๋ ค ํŒ€๊ณผ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ
  • ์—ฌ๋Ÿฌ ๋Œ€์˜ ์„œ๋ฒ„๋‚˜ ์ปดํ“จํ„ฐ์— ๋™์ผํ•œ ํ™˜๊ฒฝ์„ ์ •ํ™•ํžˆ ์žฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ์ธํ”„๋ผ ์—”์ง€๋‹ˆ์–ด

๋ฐ˜๋Œ€๋กœ GUI ์œ„์ฃผ์˜ ์„ค์ •๊ณผ ์ฆ‰ํฅ์ ์ธ ์‹œ์Šคํ…œ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์„ ์„ ํ˜ธํ•œ๋‹ค๋ฉด NixOS์˜ ๋ฐฉ์‹์ด ์˜คํžˆ๋ ค ๋ถˆํŽธํ•˜๊ฒŒ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ โ€œ์‹œ์Šคํ…œ ์ƒํƒœ๋ฅผ ์ฝ”๋“œ๋กœ ๊ด€๋ฆฌํ•œ๋‹คโ€๋Š” ๊ฐœ๋… ์ž์ฒด๋Š”, ํ•œ ๋ฒˆ ์ตํžˆ๊ณ  ๋‚˜๋ฉด ๋‹ค๋ฅธ ๋ฐฐํฌํŒ์œผ๋กœ ๋Œ์•„๊ฐ€๋”๋ผ๋„ ์ธํ”„๋ผ๋ฅผ ๋Œ€ํ•˜๋Š” ์‚ฌ๊ณ ๋ฐฉ์‹์— ์˜ค๋ž˜ ๋‚จ๋Š” ๊ฒฝํ—˜์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋Œ“๊ธ€

์ฒซ ๋ฒˆ์งธ ๋Œ“๊ธ€์„ ๋‚จ๊ฒจ๋ณด์„ธ์š”!