1. ๐จ ๋ฌธ์ ๋ฐ์: ๋ชจ๋ ์๋น์ค๊ฐ 500 ์๋ฌ๋ก ๋ฉ์ท๋ค
์๋๋ ๊ฐ์ธ NAS์ raspberrypi๋ก ๋ด์ธ๋ถ ์๋น์ค๋ฅผ ์ด์์ ํ ๋์๋ ๋ฌธ์ ์์ด ์ด์ ์ค์ด์์ต๋๋ค. ๊ฐ์ธ ์๋ฃ๋ฅผ ๋ณดํธํ๊ธฐ ์ํด ์ธ๊ทธ๋จผํธ๋ฅผ ๋๋ Proxmox(PVE) ํ๊ฒฝ์ LXC ์ปจํ
์ด๋์์ Nginx Proxy Manager(NPM)๋ฅผ ํตํด Jenkins, DoEatFit ๋ฑ ์๋น์ค๋ฅผ ์ด์ํ๋ค ๋ณด๋ NPM์ ํตํด ํ๋ก์๋๋ ๋ชจ๋ ์๋น์ค๊ฐ 500 Internal Server Error๋ฅผ ๋ฐํํ๋ฉฐ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํด์ก์ต๋๋ค.
์ฒ์์ DoEatFit ์ ๊ทผ ์ 500 Internal Server Error๋ฅผ ๋ฐํํ์ฌ ์๋ฒ ์์ฒด ๋ฌธ์ ์ธ ์ค ์์์ต๋๋ค. ๊ทผ๋ฐ NPM web GUI๋ฅผ ์ ๊ทผํ๋ ๋๊ฐ์ด 500 Internal Server Error๋ฅผ ๋ฐํํ๋๊ตฐ์. ๊ทธ๋์ ์ฌ๋ถํ
์ ํ๋ ์ ์ ์๋๋์ด ๋ณ ์ผ ์๋์ค ์๊ณ ๋ฐฉ์นํ์์ต๋๋ค.
๊ทผ๋ฐ ์ผ์ฃผ์ผ์ ๋๊ฐ๊ฐ ์ง๋๋ฉด ๋ค์ ๋ฐ์ํ๋๊ตฐ์.
์ฃผ์ ์ฆ์์ ๋ค์๊ณผ ๊ฐ์์ต๋๋ค.
-
LXC ์ปจํ ์ด๋(
pct restart <CT_ID>)๋ฅผ ์ฌ๋ถํ ํ๋ฉด ์ผ์์ ์ผ๋ก ์ ์ํ๋ฉ๋๋ค. -
ํ์ง๋ง ์ผ์ ์๊ฐ์ด ์ง๋๊ฑฐ๋ ํธ๋ํฝ์ด ๋ชฐ๋ฆฌ๋ฉด ์ด๊น์์ด 500 ์๋ฌ๊ฐ ์ฌ๋ฐํ์ต๋๋ค.
๊ธฐ์กด ์ธํ๋ผ ์ํคํ ์ฒ
Host: Proxmox VE
Container: LXC (Unprivileged)
Service: Nginx Proxy Manager (Docker-in-LXC)
Symptom: NPM์ ๊ฑฐ์น๋ ๋ชจ๋ ์๋น์ค(Jenkins, DoEatFit ๋ฑ)๊ฐ 500 ์๋ฌ ๋ฐํ
2. 1์ฐจ ์ง๋จ: ๋ฒ์ธ์ โFile Descriptorโ
์ฌ๋ถํ ์ผ๋ก ํด๊ฒฐ๋๋ค๋ ์ ์์ ์ฒ์์๋ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ(OOM Killer)์ด๋ ๋์คํฌ ์ฉ๋ ๋ฌธ์ ๋ฅผ ์์ฌํ์ต๋๋ค.
-
๋ฆฌ์์ค ํ์ธ (
free -h,df -h): ์ปจํ ์ด๋ ์ ์ ํ ํ์ธ ๊ฒฐ๊ณผ, ๋์คํฌ ์ฌ์ฉ๋ฅ (23%)๊ณผ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ ๋งค์ฐ ์ฌ์ ๋ก์ ์ต๋๋ค. -
๋ก๊ทธ ํ์ธ (The Smoking Gun): ๋ฆฌ์์ค ๋ฌธ์ ๊ฐ ์๋๋ผ๋ฉด ๋ต์ ๋ก๊ทธ์ ์์ต๋๋ค. NPM์ด ์ค์น๋
/data/logs/์error.log๋ฅผ ํ์ธํ์, ์์คํ ์ด ๋ฉ์ถ ์์ ์ ๋์ผํ ์๋ฌ๊ฐ ๋ฐ๋ณต๋๊ณ ์์์ต๋๋ค.
[์ฅ์ ๋ก๊ทธ 1]
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...
2025/10/26 17:06:18 [crit] 611451#611451: *404543 open() "/usr/local/nginx/proxy_temp/..." failed (24: No file descriptors available) ...
2025/10/26 17:06:56 [crit] 611451#611451: *404569 open() "/html/frontend/index.html" failed (24: No file descriptors available)...2-1. ์์ธ ๋ถ์
๋ก๊ทธ์ ๋ช ํํ ์ ํ์๋๊ตฐ์ โ(24: No file descriptors available)โ, ์ฆ โ์ฌ์ฉ ๊ฐ๋ฅํ ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ์์ต๋๋ค.โ File Descriptor๊ฐ ๋ญ์ง ๋นํฉ์ค๋ฌ์ ์ต๋๋ค.
**ํ์ผ ๋์คํฌ๋ฆฝํฐ(FD)**๋ ๋ฆฌ๋
์ค ์ปค๋์ด ์ด๋ฆฐ ํ์ผ์ด๋ ๋คํธ์ํฌ ์ฐ๊ฒฐ(์์ผ)์ ์๋ณํ๊ธฐ ์ํด ๋ถ์ฌํ๋ โ๋๊ธฐํ ๋ฒํธโ์
๋๋ค. Nginx๊ฐ ์๋ก์ด ๋ฐฉ๋ฌธ์ ์ ์(accept4())์ ๋ฐ๊ฑฐ๋ ํ์ผ์ ์ด(open()) ๋๋ง๋ค ์ด ๋๊ธฐํ๋ฅผ ์๋ชจํฉ๋๋ค.
์ปจํ ์ด๋์ ํ์ฌ ํ๋๋ฅผ ํ์ธํ์ต๋๋ค.
npmplus:~# ulimit -n
1024๋ฒ์ธ์ 1024๋ผ๋ ์ด ๋ฎ์ ๊ธฐ๋ณธ๊ฐ์ด์์ต๋๋ค. ํ๋ก์ ์๋ฒ๋ก์ ์๋ง์ ๋์ ์ ์์ ์ฒ๋ฆฌํด์ผ ํ Nginx์๊ฒ ๊ณ ์ 1024๊ฐ์ โ์ฐฝ๊ตฌโ๋ง ํ์ฉ๋ ๊ฒ์
๋๋ค. 1025๋ฒ์งธ ์์ฒญ์ด ์ค์, โ๋๊ธฐํ๊ฐ ์์ง๋์๋คโ๋ฉฐ 500 ์๋ฌ๋ฅผ ๋ฐํํ ๊ฒ์
๋๋ค.
2-2. ํด๊ฒฐ ๋ชฉํ
๋ชฉํ๋ ulimit -n ๊ฐ์ 1024์์ ๋๋ํ ํ์ค๊ฐ์ธ 65536์ผ๋ก ์ฌ๋ฆฌ๋ ๊ฒ์ด์์ต๋๋ค.
3. 2์ฐจ ์คํจ: cgroup v2 ์ค์ (์กด์ฌํ์ง ์๋ ํ์ผ)
Proxmox๋ LXC์ ๋ฆฌ์์ค ์ ํ์ ์ํด cgroup(์ ์ด ๊ทธ๋ฃน)์ ์ฌ์ฉํฉ๋๋ค. cgroup ์ค์ ์ ํตํด ์ด ํ๋๋ฅผ ์ฌ๋ฆด ์ ์์ ๊ฒ์ด๋ผ ํ๋จํ์ต๋๋ค.
-
์๋: PVE ํธ์คํธ ์ ธ์์
nano /etc/pve/lxc/<CT_ID>.confํ์ผ์ ์ด๊ณ ์ต์ cgroup v2 ๊ตฌ๋ฌธ์ ์ถ๊ฐํ์ต๋๋ค.lxc.prlimit.nofile: 65536 lxc.cgroup2.rlimit.nofile: 65536 -
๊ฒฐ๊ณผ: ์ปจํ ์ด๋ ์์(
pct start <CT_ID>) ์คํจ.
[์๋ 1 ๋ก๊ทธ]
cgfsng_setup_limits: 3523 No such file or directory - Failed to set "rlimit.nofile"3-1. ์์ธ ๋ถ์
์ PVE ํ๊ฒฝ์ cgroup v1์ ์ฌ์ฉ ์ค์ด์๊ณ , cgroup2 ์ค์ ์ ๋น์ฐํ ์ธ์๋์ง ์์์ต๋๋ค.
4. 3์ฐจ ์คํจ: ๋นํน๊ถ ์ปจํ ์ด๋์ ํจ์ (1024)
cgroup v1์ฉ ๊ตฌ๋ฌธ์ผ๋ก ๋ณ๊ฒฝํ์ฌ ๋ค์ ์๋ํ์ต๋๋ค.
-
์๋:
<CT_ID>.confํ์ผ์ ์ด์ ๋ด์ฉ์ ์ง์ฐ๊ณcgroup v1๊ตฌ๋ฌธ์ผ๋ก ๋ณ๊ฒฝํ์ต๋๋ค.lxc.cgroup.rlimit.nofile: 65536 -
๊ฒฐ๊ณผ: ์ปจํ ์ด๋ ์์์ ์ฑ๊ณต! ํ์ง๋ง
pct enter <CT_ID>๋ก ๋ค์ด๊ฐulimit -n์ ํ์ธํ๋โฆ ์ฌ์ ํ1024์์ต๋๋ค.
4-1. ์์ธ ๋ถ์
์ด๊ฒ์ด ์ด๋ฒ ์ฅ์ ์ ํต์ฌ์ด์์ต๋๋ค. ์ <CT_ID>.conf ์ค์ ์๋ unprivileged: 1 (๋นํน๊ถ ์ปจํ
์ด๋) ํ๋๊ทธ๊ฐ ์์์ต๋๋ค.
-
**cgroup(์ ์ด ๊ทธ๋ฃน)**์ ์ปจํ ์ด๋์ ๋ฆฌ์์ค(CPU, RAM, FD)๋ฅผ ์ ํํฉ๋๋ค.
-
๋นํน๊ถ ์ปจํ ์ด๋๋ ๋ณด์์ ์ํด PVE ํธ์คํธ์
root๊ฐ ์๋, ๋ณ๋ ๋งคํ๋ ์ ์ ๊ถํ์ผ๋ก ์คํ๋ฉ๋๋ค. -
์ด ๋๋ฌธ์ ์ปจํ ์ด๋๋ ํธ์คํธ
root์ ์ ์ ํ๊ณ๋ฅผ ์์๋ฐ์ต๋๋ค. -
์ปจํ ์ด๋ ์ค์ (
lxc.cgroup...)์์ ํ๋๋ฅผ65536์ผ๋ก ์ฌ๋ฆฌ๋ ค ํด๋, ํธ์คํธ์root์ ์ ํ๋๊ฐ1024๋ก ๋งํ์์๊ธฐ ๋๋ฌธ์ ๋ฌต์ด๋ ๊ฒ์ ๋๋ค.
5. โ๏ธ ์ต์ข ํด๊ฒฐ: โHostโ์ โContainerโ ๋์ ์์
๋นํน๊ถ ์ปจํ ์ด๋์ ํ๋๋ฅผ ์ฌ๋ฆฌ๋ ค๋ฉด, ์ปจํ ์ด๋๋ฅผ ์คํํ๋ โํธ์คํธ(PVE)โ์ ํ๊ณ์ โ์ปจํ ์ด๋โ์ ์ค์ ์ ๋ชจ๋ ์์ ํด์ผ ํ์ต๋๋ค.
๋ชจ๋ ์์ ์ Proxmox ํธ์คํธ(PVE) ์ ธ์์ ์ํํฉ๋๋ค.
5-1. 1๋จ๊ณ: PVE ํธ์คํธ ํ๋ ์ํฅ
PVE ํธ์คํธ๊ฐ ์ปจํ
์ด๋์ ๋์ ํ๋๋ฅผ โํ์ฉโํ๋๋ก root ์ ์ ์ ์์คํ
ํ๋๋ฅผ ์์ ํฉ๋๋ค.
-
์์ :
nano /etc/security/limits.confํ์ผ์ ์ฝ๋๋ค. -
ํ์ผ ๋งจ ์๋์ ๋ค์ ๋ ์ค์ ์ถ๊ฐํฉ๋๋ค. (ํธ์คํธ์ root ์ ์ ํ๋๋ฅผ 65536์ผ๋ก ์ํฅ)
root soft nofile 65536
root hard nofile 655365-2. 2๋จ๊ณ: LXC ์ปจํ ์ด๋ ์ค์ ์์
์ด์ ํธ์คํธ๊ฐ ํ์ฉํ์ผ๋, LXC ์ปจํ
์ด๋๊ฐ ์ด ํ๋๋ฅผ ์ฌ์ฉํ๊ฒ ๋ค๊ณ prlimit (ํ๋ก์ธ์ค ํ๋)์ ํตํด ๋ช
์ํฉ๋๋ค.
-
์์ :
nano /etc/pve/lxc/<CT_ID>.confํ์ผ์ ๋ค์ ์ฝ๋๋ค. -
์๋ 2์
lxc.cgroup...์ค์ ์ญ์ ํ๊ณ , ๋ค์ ํ ์ค๋ก ๋ณ๊ฒฝํฉ๋๋ค. (v2์์ ์๋ํ๋prlimit๊ตฌ๋ฌธ์ด ๋ง์์ต๋๋ค)
lxc.prlimit.nofile: 655365-3. 3๋จ๊ณ: Proxmox ํธ์คํธ(PVE) ์ฌ๋ถํ (ํ์)
1๋จ๊ณ์ limits.conf ์ค์ ์ ์ด๋ฏธ ๋ก๊ทธ์ธ๋ ์ธ์
์ด ์๋, ์์คํ
์ ์ญ์ ์ ์ฉ๋์ด์ผ ํฉ๋๋ค. Proxmox VE ํธ์คํธ ์์ฒด๋ฅผ ์ฌ๋ถํ
ํฉ๋๋ค.
5-4. ์ต์ข ํ์ธ
PVE ํธ์คํธ ์ฌ๋ถํ
ํ, LXC ์ปจํ
์ด๋(<CT_ID>)๋ฅผ ์์ํ๊ณ ulimit -n์ ๋ค์ ํ์ธํ์ต๋๋ค.
root@pve:~# pct enter <CT_ID>
~ # ulimit -n
65536๋๋์ด 65536์ด ์ ์ฉ๋์์ต๋๋ค!
6. ๊ฒฐ๋ก ๋ฐ ์ํฌํ๋ก์ฐ ์ ์ํ
NPM 500 ์๋ฌ์ ์์ธ์ Nginx๊ฐ ์๋, **๋นํน๊ถ LXC ์ปจํ
์ด๋์ ํ์ผ ๋์คํฌ๋ฆฝํฐ(FD) ํ๋(1024)๊ฐ ๋๋ฌด ๋ฎ์๊ธฐ ๋๋ฌธ์
๋๋ค. File Descriptor๋ ๋ค์ ํฌ์คํธ์์ ์์ธํ ์์๋ดค์ต๋๋ค.
Proxmox์ ๋นํน๊ถ(unprivileged) LXC์์ ์ด ํ๋๋ฅผ ์ํฅํ๋ ค๋ฉด, PVE ํธ์คํธ์ ํ๊ณ์ LXC์ ์ค์ ์ ๋ชจ๋ ์์ ํด์ผ ํ์ต๋๋ค.
graph TD subgraph "BEFORE (Limit: 1024)" PVE["PVE Host (root limit: 1024)"] --"limits.conf"--> L_Root["LXC Root (unprivileged)"] L_Root --"inherits"--> Conf["LXC Config (lxc.cgroup...: 65536)"] Conf --"is ignored (bottleneck)"--> L_Proc["LXC Process (Nginx)"] L_Proc --> O1["ulimit -n: 1024"] O1 --> F["๐ฅ 500 Error"] end subgraph "AFTER (Limit: 65536)" PVE_A["PVE Host (root limit: 65536)"] --"limits.conf (Reboot)"--> L_Root_A["LXC Root (unprivileged)"] L_Root_A --"allows"--> Conf_A["LXC Config (lxc.prlimit...: 65536)"] Conf_A --"applies"--> L_Proc_A["LXC Process (Nginx)"] L_Proc_A --> O2["ulimit -n: 65536"] O2 --> S["โ ์์ "] end
์ด ์กฐ์น ์ดํ, NPM์ ํธ๋ํฝ์ด ๋ชฐ๋ฆฌ๋ ์ํฉ์์๋ (No file descriptors available) ์๋ฌ ์์ด ์์ ์ ์ผ๋ก ์๋ํ๊ณ ์์ผ๋ฉฐ, 500 ์๋ฌ๋ ํด๊ฒฐ๋์์ต๋๋ค.