1. ๊ฐœ์š”

๊ฐœ์ธ NAS์™€ Raspberry Pi๋กœ ๋‚ด์™ธ๋ถ€ ์„œ๋น„์Šค๋ฅผ ์šด์˜ํ•˜๋‹ค๊ฐ€, ๋ฆฌ์†Œ์Šค ๋ฐ ๋ณด์•ˆ ๋ถ„๋ฆฌ๋ฅผ ์œ„ํ•ด Proxmox VE(PVE) ํ™˜๊ฒฝ์˜ LXC ์ปจํ…Œ์ด๋„ˆ๋กœ ์ด์ „ํ•˜์—ฌ Nginx Proxy Manager(NPM)๋ฅผ ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์–ด๋А ๋‚ ๋ถ€ํ„ฐ Jenkins, DoEatFit ๋“ฑ NPM์„ ํ†ตํ•ด ํ”„๋ก์‹œ๋˜๋Š” ๋ชจ๋“  ์„œ๋น„์Šค๊ฐ€ ์ผ์ œํžˆ 500 Internal Server Error๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ์™„์ „ํžˆ ๋ฉˆ์ถฐ ์„œ๋Š” ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ์ผ์‹œ์ ์ธ ํ˜„์ƒ์ธ ์ค„ ์•Œ๊ณ  ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์žฌ๋ถ€ํŒ…ํ–ˆ๋”๋‹ˆ ์ •์ƒ ์ž‘๋™ํ–ˆ์œผ๋‚˜, ์•ฝ 1์ฃผ์ผ ์ •๋„ ์ง€๋‚˜ ํŠธ๋ž˜ํ”ฝ์ด ๋ˆ„์ ๋˜๋ฉด ์–ด๊น€์—†์ด ์žฌ๋ฐœํ•˜๋”๊ตฐ์š”. ๋ถ„์„ ๊ฒฐ๊ณผ Proxmox ๋น„ํŠน๊ถŒ ์ปจํ…Œ์ด๋„ˆ์˜ ์ œํ•œ๋œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ(File Descriptor) ๊ธฐ๋ณธ ํ•œ๋„๊ฐ€ ์›์ธ์ด์—ˆ์œผ๋ฉฐ, ํ˜ธ์ŠคํŠธ์™€ ์ปจํ…Œ์ด๋„ˆ ์„ค์ •์„ ๋™์‹œ์— ์ƒํ–ฅ ์กฐ์ •ํ•จ์œผ๋กœ์จ ์ด ๋ณต์žกํ•œ ์ธํ”„๋ผ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…์„ ์˜๊ตฌ์ ์œผ๋กœ ๊ทน๋ณตํ•ด ๋ƒˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ํ•ด๊ฒฐ ์—ฌ์ •์„ ์ƒ์„ธํžˆ ์•ˆ๋‚ดํ•ด ๋“œ๋ฆด๊ฒŒ์š”.


2. ํ•ต์‹ฌ ๋‚ด์šฉ

2-1. ๐Ÿšจ ๋ฌธ์ œ ํ˜„์ƒ ๋ฐ ์›์ธ ๋ถ„์„

  • ๋ฌธ์ œ ํ˜„์ƒ:

    • NPM์„ ๊ฑฐ์น˜๋Š” DoEatFit ๋ฐ Jenkins๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ์„œ๋น„์Šค๊ฐ€ ์ผ์ฃผ์ผ ๊ฐ„๊ฒฉ์œผ๋กœ 500 Internal Server Error๋ฅผ ์‘๋‹ตํ•˜๋ฉฐ ์ •์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ์ปจํ…Œ์ด๋„ˆ๋‚˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์žฌ๋ถ€ํŒ…ํ•˜๋ฉด ์ผ์‹œ์ ์œผ๋กœ ํ’€๋ฆฌ์ง€๋งŒ, ์ผ์ • ์‹œ๊ฐ„์ด ํ๋ฅด๋ฉด ์žฌ์ฐจ 500 ์—๋Ÿฌ๊ฐ€ ํ„ฐ์ ธ ๋‚˜์˜ค๋Š” ์ƒํƒœ์˜€์Šต๋‹ˆ๋‹ค. ๋””์Šคํฌ ๊ณต๊ฐ„(df -h)๊ณผ RAM ์šฉ๋Ÿ‰(free -h)์€ 20% ๋‚ด์™ธ๋กœ ์ง€๋‚˜์น˜๊ฒŒ ๋„‰๋„‰ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์›์ธ ๋ถ„์„ (File Descriptor ๋Œ€๊ธฐํ‘œ ๊ณ ๊ฐˆ):

    • NPM ๋กœ๊ทธ ๋””๋ ‰ํ† ๋ฆฌ /data/logs/error.log์—์„œ ๋ช…ํ™•ํ•œ ์›์ธ ๋‹จ์„œ๋ฅผ ํฌ์ฐฉํ–ˆ์Šต๋‹ˆ๋‹ค.
    2025/10/26 17:01:03 [crit] 611451#611451: accept4() failed (24: No file descriptors available)
    2025/10/26 17:02:03 [alert] 611451#611451: *404498 socket() failed (24: No file descriptors available) while connecting to upstream...
    • ๋กœ๊ทธ์˜ (24: No file descriptors available) ๋ฉ”์‹œ์ง€๋Š” ์‹œ์Šคํ…œ์ด ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ(FD)๊ฐ€ ๋ฐ”๋‹ฅ๋‚ฌ์Œ์„ ์•Œ๋ฆฌ๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
    • ๋ฆฌ๋ˆ…์Šค์—์„œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—ด๋ฆฐ ํŒŒ์ผ์ด๋‚˜ ๋„คํŠธ์›Œํฌ ์†Œ์ผ“ ์—ฐ๊ฒฐ์„ ์ œ์–ดํ•  ๋•Œ ๋ถ€์—ฌ๋ฐ›๋Š” โ€˜๋Œ€๊ธฐํ‘œ ๋ฒˆํ˜ธโ€™์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. Nginx๊ฐ€ ์ƒˆ๋กœ์šด ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ์ ‘์ˆ˜ํ•˜๊ฑฐ๋‚˜ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•  ๋•Œ๋งˆ๋‹ค ์ด FD๊ฐ€ ํ•˜๋‚˜์”ฉ ์†Œ๋ชจ๋ฉ๋‹ˆ๋‹ค.
    • ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ ๊ธฐ๋ณธ ํ•œ๋„๋ฅผ ulimit -n์œผ๋กœ ํ™•์ธํ•ด ๋ณด๋‹ˆ ๊ณ ์ž‘ **1024**๋กœ ์ง€์ •๋˜์–ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋™์‹œ ์ ‘์†๋Ÿ‰์ด ๋ชฐ๋ฆฌ๊ณ  ์ •์  ๋ฆฌ์†Œ์Šค ์š”์ฒญ์ด ๊ธ‰์ฆํ•˜์ž ์ˆœ์‹๊ฐ„์— 1024๊ฐœ์˜ ๋Œ€๊ธฐํ‘œ๊ฐ€ ๊ณ ๊ฐˆ๋˜์—ˆ๊ณ , 1025๋ฒˆ์งธ ์‚ฌ์šฉ์ž๋ถ€ํ„ฐ๋Š” ์•„์˜ˆ ์†Œ์ผ“์„ ์—ด์ง€ ๋ชปํ•ด 500 ์—๋Ÿฌ๋ฅผ ๋‚ด๋ ค๋ณด๋ƒˆ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

2-2. ๐Ÿ’ก ์žฅ์•  ํ•ด๊ฒฐ์„ ์œ„ํ•œ ์‚ฝ์งˆ๊ณผ ์ตœ์ข… ํ•ด๊ฒฐ์ฑ…

  • 1๋‹จ๊ณ„ ์‹œ๋„: cgroup v2 ๊ตฌ๋ฌธ ์ฃผ์ž… ์‹คํŒจ:
    • PVE ํ˜ธ์ŠคํŠธ์—์„œ /etc/pve/lxc/<CT_ID>.conf์— ์ตœ์‹  lxc.cgroup2.rlimit.nofile๋ฅผ ์„ค์ •ํ–ˆ์œผ๋‚˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ผœ์ง€์ง€๋„ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ถ„์„ํ•ด ๋ณด๋‹ˆ ํ•ด๋‹น ๋…ธ๋“œ๊ฐ€ ๊ตฌํ˜• cgroup v1 ๋ชจ๋“œ๋กœ ๋Œ๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
  • 2๋‹จ๊ณ„ ์‹œ๋„: ๋น„ํŠน๊ถŒ ์ปจํ…Œ์ด๋„ˆ ํ•œ๊ณ„ ๋ด‰์ฐฉ:
    • cgroup v1์— ๋งž๊ฒŒ lxc.cgroup.rlimit.nofile: 65536์œผ๋กœ ๋ณ€๊ฒฝํ•ด ์ปจํ…Œ์ด๋„ˆ ๋ถ€ํŒ…์€ ์„ฑ๊ณตํ–ˆ์œผ๋‚˜, ์•ˆ์—์„œ ulimit -n์„ ์ณ ๋ณด๋‹ˆ ์—ฌ์ „ํžˆ 1024๋กœ ๋ณ€ํ•จ์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค.
    • ์ปจํ…Œ์ด๋„ˆ ์„ค์ •์— ๊ธฐ์žฌ๋œ unprivileged: 1 (๋น„ํŠน๊ถŒ ์ปจํ…Œ์ด๋„ˆ) ์˜ต์…˜์ด ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค. ๋น„ํŠน๊ถŒ ์ปจํ…Œ์ด๋„ˆ๋Š” ๋ณด์•ˆ์„ ์œ„ํ•ด ํ˜ธ์ŠคํŠธ์˜ ํŠน์ • ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž ๊ถŒํ•œ์„ ๋งคํ•‘๋ฐ›์•„ ๋Œ๊ธฐ ๋•Œ๋ฌธ์—, ํ˜ธ์ŠคํŠธ root ์‚ฌ์šฉ์ž์˜ FD ์ƒ๊ณ„ ํ•œ๋„(1024) ์ด์ƒ์œผ๋กœ๋Š” ์ ˆ๋Œ€๋กœ ์ปจํ…Œ์ด๋„ˆ ํ•œ๋„๋ฅผ ๋Œ์–ด์˜ฌ๋ฆด ์ˆ˜ ์—†๋Š” ๊ตฌ์กฐ์  ๋ฐ”ํ‹€๋„ฅ์ด ์กด์žฌํ–ˆ์Šต๋‹ˆ๋‹ค.
  • 3๋‹จ๊ณ„: ์ตœ์ข… ์˜๊ตฌ ํ•ด๊ฒฐ์ฑ… (ํ˜ธ์ŠคํŠธ์™€ ์ปจํ…Œ์ด๋„ˆ ๋™์‹œ ์ƒํ–ฅ):
    • ๊ฒฐ๊ตญ PVE ํ˜ธ์ŠคํŠธ์˜ ํ—ˆ์šฉ ํ•œ๊ณ„์„ ๊ณผ LXC ์ปจํ…Œ์ด๋„ˆ ์„ค์ •์น˜ ์–‘์ชฝ์„ ๋ชจ์กฐ๋ฆฌ ๋šซ์–ด์ฃผ์–ด์•ผ๋งŒ ํ–ˆ์Šต๋‹ˆ๋‹ค.
graph TD
    subgraph "๊ธฐ์กด ์ƒํ™ฉ (Limit: 1024 ๋ณ‘๋ชฉ)"
        PVE["PVE Host (root FD limit: 1024)"] --"limits.conf"--> L_Root["LXC Root (๋น„ํŠน๊ถŒ)"]
        L_Root --"์ƒ์† ๋ฐ ์ƒํ•œ ์ฐจ๋‹จ"--> Conf["LXC Config (65536 ์„ค์ •)"]
        Conf --"๋ฌด์‹œ๋จ (1024 ๋ณ‘๋ชฉ)"--> L_Proc["Nginx ํ”„๋กœ์„ธ์Šค"]
        L_Proc --> O1["ulimit -n: 1024"]
        O1 --> F["๐Ÿ’ฅ 500 ์žฅ์•  ๋ฐœ์ƒ"]
    end

    subgraph "๊ฐœ์„  ์ƒํ™ฉ (Limit: 65536 ํ™•๋ณด)"
        PVE_A["PVE Host (root FD limit: 65536)"] --"limits.conf ์ˆ˜์ • ํ›„ ์žฌ๋ถ€ํŒ…"--> L_Root_A["LXC Root (๋น„ํŠน๊ถŒ)"]
        L_Root_A --"์Šน์ธ ๋ฐ ์ „๋‹ฌ"--> Conf_A["LXC Config (lxc.prlimit.nofile)"]
        Conf_A --"์ •์ƒ ์ฃผ์ž…"--> L_Proc_A["Nginx ํ”„๋กœ์„ธ์Šค"]
        L_Proc_A --> O2["ulimit -n: 65536"]
        O2 --> S["โœ… ์ธํ”„๋ผ ์ดˆ์•ˆ์ •"]
    end
  1. ํ˜ธ์ŠคํŠธ(PVE) limits ์„ค์ •: ํ˜ธ์ŠคํŠธ ์…ธ์—์„œ /etc/security/limits.conf ํŒŒ์ผ ์ตœํ•˜๋‹จ์— root ์œ ์ € ํ•œ๋„๋ฅผ ๋„‰๋„‰ํ•˜๊ฒŒ ์ ์–ด์ค๋‹ˆ๋‹ค.
    root soft nofile 65536
    root hard nofile 65536
  2. LXC ์ปจํ…Œ์ด๋„ˆ ์„ค์ • ํŠœ๋‹: /etc/pve/lxc/<CT_ID>.conf์— prlimit ์ „์šฉ ์˜ต์…˜์„ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค.
    lxc.prlimit.nofile: 65536
  3. ํ˜ธ์ŠคํŠธ ์ „๋ฉด ์žฌ๋ถ€ํŒ… ๋ฐ ๋ฐ˜์˜: ํ˜ธ์ŠคํŠธ ์„ธ์…˜์— ์ˆ˜์ •ํ•œ ์ „์—ญ limits.conf ๊ฐ’์ด ์™„์ „ํžˆ ์ฃผ์ž…๋˜๋„๋ก Proxmox ํ˜ธ์ŠคํŠธ ์ „์ฒด๋ฅผ 1ํšŒ ์žฌ๋ถ€ํŒ…ํ•ด ์ค€ ๋’ค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ฐ€๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

2-3. โœ… ๊ฒฐ๊ณผ ๊ฒ€์ฆ ๋ฐ ๋ชจ๋˜ ์˜คํ”ˆ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฒ€ํ† 

  • ๊ฒฐ๊ณผ ๊ฒ€์ฆ:

    • ํ˜ธ์ŠคํŠธ ์žฌ๋ถ€ํŒ… ์™„๋ฃŒ ํ›„ LXC ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€๋กœ ์ง„์ž…ํ•˜์—ฌ ํ•œ๋„๋ฅผ ์กฐํšŒํ–ˆ์Šต๋‹ˆ๋‹ค.
    pct enter <CT_ID>
    ulimit -n
    # ์ถœ๋ ฅ: 65536
    • ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ํ•œ๊ณ„์„ ์ด ์ •์ƒ์ ์œผ๋กœ 64๋ฐฐ ์ด์ƒ ๋Œ€ํญ ๋Š˜์–ด๋‚ฌ์Œ์„ ์„ฑ๊ณต์ ์œผ๋กœ ๊ฒ€์ฆํ–ˆ์Šต๋‹ˆ๋‹ค! ์ดํ›„ ํŠธ๋ž˜ํ”ฝ ์œ ์ž…์ด๋‚˜ ์žฅ๊ธฐ ์šด์šฉ ์‹œ์—๋„ ๋ฌด์˜๋ฏธํ•œ 500 Internal Server Error ๋ฐœ์ƒ ์—†์ด ๋งค์šฐ ๋ถ€๋“œ๋Ÿฝ๊ณ  ๋“ ๋“ ํ•˜๊ฒŒ ํŒจํ‚ท์„ ์ „๋‹ฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ถ”์ฒœ ์˜คํ”ˆ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ์ธํ”„๋ผ ๋„๊ตฌ ๊ฒ€ํ† :

    1. Prometheus Node Exporter & Grafana
      • ํ‰๊ฐ€: ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ๊ณ ๊ฐˆ๋˜๊ธฐ ์ง์ „ ์ž„๊ณ„์น˜๋ฅผ ์กฐ๊ธฐ์— ๊ฐ์ง€ํ•˜์—ฌ ์Šฌ๋ž™(Slack) ๋“ฑ์œผ๋กœ ์•Œ๋ฆผ์„ ์ฃผ๋Š” ๋ชจ๋‹ˆํ„ฐ๋ง ํ™˜๊ฒฝ์„ ๊ฐ•๋ ฅํžˆ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. node_filefd_allocated ๋ฉ”ํŠธ๋ฆญ์„ ์ถ”์ ํ•˜๋ฉด ์ธํ”„๋ผ ๋ถˆ์‹œ ๋ถˆ๋Šฅ์„ ๋ฏธ๋ฆฌ ๋Œ€๋น„ํ•  ์ˆ˜ ์žˆ์–ด ๋ฌด์ฒ™ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
    2. Traefik Proxy
      • ํ‰๊ฐ€: ๋งŒ์•ฝ Nginx Proxy Manager(NPM)์˜ ์ •์  ์„ค์ • ๋ฐ ๋„์ปค ์ปดํฌ์ฆˆ ์˜์กด์—์„œ ๋ฒ—์–ด๋‚˜, ์ปจํ…Œ์ด๋„ˆ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ผ๋ฒจ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ ์ธ ๋ผ์šฐํŒ…๊ณผ SSL ์ž๋™ ๋ฐœ๊ธ‰์„ ์™„์ „ํžˆ ํ˜„๋Œ€ํ™”ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด Go ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ๊ฒฝ๋Ÿ‰ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ Traefik์„ ํ›Œ๋ฅญํ•œ ๋Œ€์•ˆ ๊ธฐ์ˆ ๋กœ ์ถ”์ฒœํ•ด ๋“œ๋ฆฝ๋‹ˆ๋‹ค.