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% ๋ด์ธ๋ก ์ง๋์น๊ฒ ๋๋ํ์ต๋๋ค.
- NPM์ ๊ฑฐ์น๋ DoEatFit ๋ฐ Jenkins๋ฅผ ํฌํจํ ๋ชจ๋ ์๋น์ค๊ฐ ์ผ์ฃผ์ผ ๊ฐ๊ฒฉ์ผ๋ก
-
์์ธ ๋ถ์ (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 ์๋ฌ๋ฅผ ๋ด๋ ค๋ณด๋๋ ๊ฒ์ ๋๋ค.
- NPM ๋ก๊ทธ ๋๋ ํ ๋ฆฌ
2-2. ๐ก ์ฅ์ ํด๊ฒฐ์ ์ํ ์ฝ์ง๊ณผ ์ต์ข ํด๊ฒฐ์ฑ
- 1๋จ๊ณ ์๋: cgroup v2 ๊ตฌ๋ฌธ ์ฃผ์
์คํจ:
- PVE ํธ์คํธ์์
/etc/pve/lxc/<CT_ID>.conf์ ์ต์lxc.cgroup2.rlimit.nofile๋ฅผ ์ค์ ํ์ผ๋ ์ปจํ ์ด๋๊ฐ ์ผ์ง์ง๋ ์์์ต๋๋ค. ๋ถ์ํด ๋ณด๋ ํด๋น ๋ ธ๋๊ฐ ๊ตฌํcgroup v1๋ชจ๋๋ก ๋๊ณ ์์๊ธฐ ๋๋ฌธ์ด์์ต๋๋ค.
- PVE ํธ์คํธ์์
- 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
- ํธ์คํธ(PVE) limits ์ค์ : ํธ์คํธ ์
ธ์์
/etc/security/limits.confํ์ผ ์ตํ๋จ์ root ์ ์ ํ๋๋ฅผ ๋๋ํ๊ฒ ์ ์ด์ค๋๋ค.root soft nofile 65536 root hard nofile 65536 - LXC ์ปจํ
์ด๋ ์ค์ ํ๋:
/etc/pve/lxc/<CT_ID>.conf์prlimit์ ์ฉ ์ต์ ์ ์ฃผ์ ํฉ๋๋ค.lxc.prlimit.nofile: 65536 - ํธ์คํธ ์ ๋ฉด ์ฌ๋ถํ
๋ฐ ๋ฐ์: ํธ์คํธ ์ธ์
์ ์์ ํ ์ ์ญ
limits.conf๊ฐ์ด ์์ ํ ์ฃผ์ ๋๋๋ก Proxmox ํธ์คํธ ์ ์ฒด๋ฅผ 1ํ ์ฌ๋ถํ ํด ์ค ๋ค ์ปจํ ์ด๋๋ฅผ ๊ฐ๋ํ์ต๋๋ค.
2-3. โ ๊ฒฐ๊ณผ ๊ฒ์ฆ ๋ฐ ๋ชจ๋ ์คํ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฒํ
-
๊ฒฐ๊ณผ ๊ฒ์ฆ:
- ํธ์คํธ ์ฌ๋ถํ ์๋ฃ ํ LXC ์ปจํ ์ด๋ ๋ด๋ถ๋ก ์ง์ ํ์ฌ ํ๋๋ฅผ ์กฐํํ์ต๋๋ค.
pct enter <CT_ID> ulimit -n # ์ถ๋ ฅ: 65536- ํ์ผ ๋์คํฌ๋ฆฝํฐ ํ๊ณ์ ์ด ์ ์์ ์ผ๋ก 64๋ฐฐ ์ด์ ๋ํญ ๋์ด๋ฌ์์ ์ฑ๊ณต์ ์ผ๋ก ๊ฒ์ฆํ์ต๋๋ค! ์ดํ ํธ๋ํฝ ์ ์ ์ด๋ ์ฅ๊ธฐ ์ด์ฉ ์์๋ ๋ฌด์๋ฏธํ 500 Internal Server Error ๋ฐ์ ์์ด ๋งค์ฐ ๋ถ๋๋ฝ๊ณ ๋ ๋ ํ๊ฒ ํจํท์ ์ ๋ฌํ๊ณ ์์ต๋๋ค.
-
์ถ์ฒ ์คํ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ์ธํ๋ผ ๋๊ตฌ ๊ฒํ :
- Prometheus Node Exporter & Grafana
- ํ๊ฐ: ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ๊ณ ๊ฐ๋๊ธฐ ์ง์ ์๊ณ์น๋ฅผ ์กฐ๊ธฐ์ ๊ฐ์งํ์ฌ ์ฌ๋(Slack) ๋ฑ์ผ๋ก ์๋ฆผ์ ์ฃผ๋ ๋ชจ๋ํฐ๋ง ํ๊ฒฝ์ ๊ฐ๋ ฅํ ์ ์ํฉ๋๋ค.
node_filefd_allocated๋ฉํธ๋ฆญ์ ์ถ์ ํ๋ฉด ์ธํ๋ผ ๋ถ์ ๋ถ๋ฅ์ ๋ฏธ๋ฆฌ ๋๋นํ ์ ์์ด ๋ฌด์ฒ ์ ์ฉํฉ๋๋ค.
- ํ๊ฐ: ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ๊ณ ๊ฐ๋๊ธฐ ์ง์ ์๊ณ์น๋ฅผ ์กฐ๊ธฐ์ ๊ฐ์งํ์ฌ ์ฌ๋(Slack) ๋ฑ์ผ๋ก ์๋ฆผ์ ์ฃผ๋ ๋ชจ๋ํฐ๋ง ํ๊ฒฝ์ ๊ฐ๋ ฅํ ์ ์ํฉ๋๋ค.
- Traefik Proxy
- ํ๊ฐ: ๋ง์ฝ Nginx Proxy Manager(NPM)์ ์ ์ ์ค์ ๋ฐ ๋์ปค ์ปดํฌ์ฆ ์์กด์์ ๋ฒ์ด๋, ์ปจํ ์ด๋ ๋ฉํ๋ฐ์ดํฐ ๋ผ๋ฒจ ๊ธฐ๋ฐ์ผ๋ก ๋์ ์ธ ๋ผ์ฐํ ๊ณผ SSL ์๋ ๋ฐ๊ธ์ ์์ ํ ํ๋ํํ๊ณ ์ถ๋ค๋ฉด Go ์ธ์ด๋ก ์์ฑ๋ ๊ฒฝ๋ ๋ฆฌ๋ฒ์ค ํ๋ก์ Traefik์ ํ๋ฅญํ ๋์ ๊ธฐ์ ๋ก ์ถ์ฒํด ๋๋ฆฝ๋๋ค.
- Prometheus Node Exporter & Grafana