# ๐Ÿ” ์„œ๋น„์Šค๋กœ ์‹คํ–‰ ์„ค์น˜ ํ”„๋กœ๊ทธ๋žจ์€ `systemd` ์œ ๋‹›์„ ํ™œ์„ฑํ™”ํ•œ ์ฑ„ ์‹คํ–‰ ์ค‘์œผ๋กœ ๋‚จ๊น๋‹ˆ๋‹ค. ์ด ํŽ˜์ด์ง€๋Š” ๊ทธ ์œ ๋‹›์„ ์ฐจ๋ก€๋กœ ์ฝ๊ณ , ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ ์ฃผ๊ณ , ๋‘ ๊ฐ€์ง€ ์‹คํŒจ ํ˜•ํƒœ๋ฅผ ๋ฐ–์—์„œ ๋ณด์ด๋Š” ๊ทธ๋Œ€๋กœ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์‹œ์ž‘ํ•˜์ง€ ์•Š๋Š” ์„œ๋ฒ„์™€, ์‹คํ–‰ ์ค‘์ธ ์„œ๋ฒ„๊ฐ€ ์„ค์ •์„ ๊ฑฐ๋ถ€ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ## ๐Ÿงพ ์œ ๋‹›์ด ํ•˜๋Š” ์ผ ```bash systemctl cat pingclair ``` ์ค‘์š”ํ•œ ํ‚ค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ```text [Service] Type=notify NotifyAccess=main User=pingclair Group=pingclair AmbientCapabilities=CAP_NET_BIND_SERVICE CapabilityBoundingSet=CAP_NET_BIND_SERVICE Environment="RUST_LOG=info" ExecStart=/usr/local/bin/pingclair run /etc/Pingclair/Pingclairfile ExecReload=/bin/kill -USR1 $MAINPID WorkingDirectory=/var/lib/pingclair Restart=on-failure RestartPreventExitStatus=1 RestartSec=5s LimitNOFILE=1048576 LimitNPROC=512 ProtectSystem=full PrivateTmp=true NoNewPrivileges=true ``` ์ˆœ์„œ๋Œ€๋กœ ์ฝ์Šต๋‹ˆ๋‹ค. - `Type=notify`์™€ `NotifyAccess=main`: ์„œ๋ฒ„๋Š” ๋ฆฌ์Šค๋„ˆ๊ฐ€ ๋ฐ”์ธ๋”ฉ๋œ ์‹œ์ ์„ `systemd`์— ์•Œ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ `systemctl start`๋Š” ํ”„๋กœ์„ธ์Šค์˜ ์กด์žฌ๊ฐ€ ์•„๋‹ˆ๋ผ ํ”„๋ก์‹œ๊ฐ€ ์‘๋‹ตํ•  ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. - `User=pingclair`์™€ `AmbientCapabilities=CAP_NET_BIND_SERVICE`: ์„œ๋ฒ„๋Š” ๋น„ํŠน๊ถŒ ์‚ฌ์šฉ์ž๋กœ ์‹คํ–‰๋˜๋ฉด์„œ๋„ 80๊ณผ 443์— ๋ฐ”์ธ๋”ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - `PINGCLAIR_TLS_STORE`๋Š” ์˜๋„์ ์œผ๋กœ ๋‘์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„œ๋น„์Šค ๊ณ„์ •์˜ ํ™ˆ์ด `/var/lib/pingclair`์ด๋ฏ€๋กœ ์ธ์ฆ์„œ๋Š” `/var/lib/pingclair/.local/share/pingclair`์— ์žˆ์Šต๋‹ˆ๋‹คโ€”โ€”๋ฐ”์ด๋„ˆ๋ฆฌ ์ž์ฒด์˜ ๊ธฐ๋ณธ๊ฐ’์ด๊ณ , ์„ค์น˜ ํ”„๋กœ๊ทธ๋žจ์ด ๋งŒ๋“ค๊ณ  ์ด์ „ํ•ด ๋„ฃ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ์ด๋ฉฐ, `pingclair environ`์ด ์ถœ๋ ฅํ•˜๋Š” ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ €์žฅ์†Œ๋ฅผ ์ด๋ฆ„์œผ๋กœ ์ง€์ •ํ•˜๋ฉด ์ด๋ฏธ ๋‹ต์ด ์žˆ๋Š” ์งˆ๋ฌธ์— ๋‘ ๋ฒˆ์งธ ๋‹ต์„ ๋งŒ๋“œ๋Š” ์…ˆ์ž…๋‹ˆ๋‹ค. - `ExecStartPre`๋กœ `validate`๋ฅผ ๋Œ๋ฆฌ๋Š” ์ผ์€ ์˜๋„์ ์œผ๋กœ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•ˆ์ „ํ•œ ๊ฒ€์‚ฌ ์ž๋ฆฌ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๊ทธ๊ฒƒ์ด ํ•จ์ •์ž…๋‹ˆ๋‹ค. `systemd`๊ฐ€ `RestartPreventExitStatus=`๋ฅผ ์ ์šฉํ•˜๋Š” ๋Œ€์ƒ์€ ์ฃผ ํ”„๋กœ์„ธ์Šค์ด์ง€ ์‹คํŒจํ•œ ์‚ฌ์ „ ๋ช…๋ น์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ฑฐ๋ถ€ํ•˜๋Š” ์„ค์ •์€ ์œ ๋‹›์„ failed๋กœ ๋‚จ๊ฒจ ๋‘๋Š” ๋Œ€์‹  5์ดˆ๋งˆ๋‹ค ๋‹ค์‹œ ์‹œ๋„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ๋ฌด์—‡์ด๋“  ๋ฐ”์ธ๋”ฉํ•˜๊ธฐ ์ „์— ํŒŒ์ผ์„ ์Šค์Šค๋กœ ์ปดํŒŒ์ผํ•˜๊ณ , ๊ฑฐ๋ถ€ํ•  ๋•Œ ์ข…๋ฃŒ ์ฝ”๋“œ 1๋กœ ๋๋‚ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์œ„์˜ ์žฌ์‹œ์ž‘ ์ •์ฑ…์ด ์“ฐ์ธ ์ด์œ ์ธ ์ข…๋ฃŒ ์ฝ”๋“œ์ด๋ฉฐ, `pingclair run`์€ ๊ทธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋˜๊ธฐ ์œ„ํ•ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. - `ExecReload`๋Š” `SIGUSR1`์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ "ํŒŒ์ผ์„ ๋‹ค์‹œ ์ฝ์–ด๋ผ"๋กœ ํ•ด์„ํ•˜๋Š” ์‹ ํ˜ธ์ž…๋‹ˆ๋‹ค. `SIGHUP`์€ ์˜๋„์ ์œผ๋กœ ๋ฌด์‹œ๋˜๋ฉฐ, ๊ทธ๊ฒƒ์„ ๋ณด๋‚ด๋˜ ์œ ๋‹›์€ ์ด์ „ ์„ค์ •์ด ๊ณ„์† ์„œ๋น„์Šค๋˜๋Š” ๋™์•ˆ ์„ฑ๊ณต์„ ๋ณด๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค ([issue #66](https://github.com/dorianverlaine/pingclair/issues/66)). `systemd`๊ฐ€ ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ `kill`์˜ ์ข…๋ฃŒ๋ฟ์ด๋ฏ€๋กœ, ์„œ๋ฒ„๋Š” ํŒŒ์ผ์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ–ˆ๋Š”์ง€๋ฅผ ์œ ๋‹›์˜ status line์— ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค โ€” `Serving (reloaded 1 listener(s) in 323.341ยตs)` ๋˜๋Š” `Reload rejected: โ€ฆ` โ€” ๊ทธ๋ฆฌ๊ณ  `systemctl status`๊ฐ€ ๊ทธ๊ฒƒ์„ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜ [์žฌ์ ์šฉ์˜ ์˜๋ฏธ](#-์žฌ์ ์šฉ์˜-์˜๋ฏธ)์— ์žˆ์Šต๋‹ˆ๋‹ค. - `Restart=on-failure`์™€ `RestartPreventExitStatus=1`, `RestartSec=5s`: ์ข…๋ฃŒ ์ฝ”๋“œ 1์€ ์„ค์ •์ด๋‚˜ ์ธ์ฆ์„œ ์ €์žฅ์†Œ๋ฅผ ์•„์˜ˆ ์“ธ ์ˆ˜ ์—†์—ˆ๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ, 5์ดˆ๋งˆ๋‹ค ๋‹ค์‹œ ์‹œ๋„ํ•˜๋Š” ๋Œ€์‹  ์œ ๋‹›์€ ์šด์˜์ž๊ฐ€ ๋ณด๋„๋ก `failed` ์ƒํƒœ๋กœ ๋‚จ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋ฐ–์˜ ์‹คํŒจ๋Š” ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. - `ProtectSystem=full`, `PrivateTmp`, `NoNewPrivileges`, `LimitNPROC`, `LimitNOFILE`: ์„œ๋ฒ„๋Š” ํ•„์š”ํ•œ ํŒŒ์ผ ์‹œ์Šคํ…œ ์‹œ์•ผ์™€ ํ”„๋กœ์„ธ์Šค ํ•œ๋„๋งŒ ๋ฐ›๊ณ , ๊ทธ ์ด์ƒ์€ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‘ ์„ค์น˜ ๊ฒฝ๋กœ ๋ชจ๋‘ ๊ฐ™์€ ํŒŒ์ผ์„ ์”๋‹ˆ๋‹ค. ํ•œ ์ค„ ์„ค์น˜๋Š” `scripts/pingclair.service`์˜ ๋ฐ”์ดํŠธ ๋‹จ์œ„ ์‚ฌ๋ณธ์„ ๋‚ด์žฅํ•˜๊ณ  โ€” `just repo-lint`๋Š” ๋‘˜์ด ์–ด๊ธ‹๋‚˜๋ฉด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค โ€” `curl | bash` ์‹ ๊ทœ ์„ค์น˜์™€ ์ €์žฅ์†Œ ์„ค์น˜๊ฐ€ ๊ฐ™์€ ์œ ๋‹›์„ ๋งŒ๋“ค๋ฉฐ, `systemd-analyze verify /etc/systemd/system/pingclair.service`๋Š” ์–ด๋А ์ชฝ์—์„œ๋„ ์ด ์œ ๋‹›์— ๋Œ€ํ•ด ์•„๋ฌด๊ฒƒ๋„ ๋ณด๊ณ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ## ๐ŸŽ›๏ธ ์„œ๋น„์Šค ๋‹ค๋ฃจ๊ธฐ `pc service`๋Š” ์ด ์œ ๋‹›์— ๋Œ€ํ•œ `systemctl` ๋ž˜ํผ์ด๋ฏ€๋กœ ๋‘˜์€ ์„œ๋กœ ๋ฐ”๊ฟ” ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. | ์ž‘์—… | `pc` ์‚ฌ์šฉ | `systemctl` ์‚ฌ์šฉ | | --- | --- | --- | | ์‹œ์ž‘ | `sudo pc service start` | `sudo systemctl start pingclair` | | ์ค‘์ง€ | `sudo pc service stop` | `sudo systemctl stop pingclair` | | ์„ค์ • ์žฌ์ ์šฉ | `sudo pc service reload` | `sudo systemctl reload pingclair` | | ๋ฆฌ์Šค๋„ˆ๋‚˜ ํ”„๋กœ์„ธ์Šค ์ „์—ญ ๋ณ€๊ฒฝ ํ›„ ๋‹ค์‹œ ์‹œ์ž‘ | `sudo pc service restart` | `sudo systemctl restart pingclair` | | ์ƒํƒœ | `pc service status` | `systemctl status pingclair` | | ๋กœ๊ทธ ๋”ฐ๋ผ๊ฐ€๊ธฐ | โ€” | `journalctl -u pingclair -f` | `pc service status`๋Š” ์„œ๋ฒ„๊ฐ€ ๋ณด๋‚ธ ์ค€๋น„ ์™„๋ฃŒ ์ค„์„ ํฌํ•จํ•ด ์œ ๋‹› ์ž์ฒด์˜ ์‹œ์•ผ๋ฅผ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค. ```text โ— pingclair.service - Pingclair High-Performance Web Server Loaded: loaded (/etc/systemd/system/pingclair.service; enabled; preset: enabled) Active: active (running) Docs: https://github.com/dorianverlaine/pingclair Main PID: 1808 (pingclair) Status: "Serving (reloaded 1 listener(s) in 323.341ยตs)" ``` ## ๐Ÿ” ์žฌ์ ์šฉ์˜ ์˜๋ฏธ ์ˆ˜์ •ํ•œ `/etc/Pingclair/Pingclairfile`์€ ํ•˜๋‚˜์˜ ์‹ ํ˜ธ๋กœ ์‹คํ–‰ ์ค‘์ธ ์„œ๋ฒ„์— ๋„๋‹ฌํ•˜๊ณ , ๋‘ ๋ช…๋ น์ด ๊ทธ ์‹ ํ˜ธ๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค. `SIGUSR1`์ด ์žฌ์ ์šฉ ์‹ ํ˜ธ์ด๊ณ , ์ถ”๊ฐ€ ์„ค์ •์ด ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค. ```bash sudo kill -USR1 "$(systemctl show -p MainPID --value pingclair)" ``` `pc service reload` โ€” ๊ฐ™์€ ํ˜ธ์ถœ์ธ `sudo systemctl reload pingclair`๋„ โ€” ๊ฐ€ ๊ทธ ์‹ ํ˜ธ๋ฅผ ๋Œ€์‹  ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์œ ๋‹›์˜ `ExecReload`๋Š” `/bin/kill -USR1 $MAINPID`์ด๊ณ , ๋‹น์—ฐํ•ด ๋ณด์ด๋Š” ๋ช…๋ น์ด ์ด์ œ ๋™์ž‘ํ•˜๋Š” ๋ช…๋ น์ž…๋‹ˆ๋‹ค. `SIGHUP`์„ ๋ณด๋‚ด๋˜ ์œ ๋‹›์€ ์„ฑ๊ณต์„ ๋ณด๊ณ ํ•˜๊ณ  ์•„๋ฌด๊ฒƒ๋„ ์ ์šฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด [issue #66](https://github.com/dorianverlaine/pingclair/issues/66)์— ๊ธฐ๋ก๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. `pingclair reload`๋Š” Admin API๋ฅผ ๊ฑฐ์ณ ๊ฐ™์€ ์ฝ”๋“œ์— ๋„๋‹ฌํ•˜๊ณ  ์„œ๋ฒ„๊ฐ€ ํŒŒ์ผ์„ ์–ด๋–ป๊ฒŒ ๋ดค๋Š”์ง€ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์ „์—ญ ์˜ต์…˜ ๋ธ”๋ก์˜ `admin`์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ```text โœ… Configuration reloaded successfully ``` ```text Error: โŒ Reload failed (400): HTTP/1.1 400 Bad Request ``` `systemctl reload`๊ฐ€ ๋ณด๊ณ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ํ•˜๋‚˜๋ฟ์ž…๋‹ˆ๋‹ค. `kill`์ด ์‹ ํ˜ธ๋ฅผ ์ „๋‹ฌํ–ˆ๋‹ค๋Š” ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ๊ทธ ๋’ค์— ํŒŒ์ผ์„ ์ฝ์œผ๋ฏ€๋กœ, ๊ทธ ํŒ๋‹จ์€ ์œ ๋‹›์˜ status line๊ณผ ์ €๋„์— ๋‚จ์Šต๋‹ˆ๋‹ค. `pc service reload`๋Š” ์„ค์ •์ด ์ ์šฉ๋˜์—ˆ๋‹ค๊ณ  ์ฃผ์žฅํ•˜๋Š” ๋Œ€์‹  ๊ทธ๋ ‡๊ฒŒ ๋งํ•ฉ๋‹ˆ๋‹ค. ```text $ sudo pc service reload โœ… Reload signal delivered to pingclair.service โ„น๏ธ The result lands a moment later: `systemctl status pingclair` or `journalctl -u pingclair -n 20` $ systemctl status pingclair --no-pager | grep Status Status: "Serving (reloaded 1 listener(s) in 323.341ยตs)" ``` ์‹คํ–‰ ์ค‘์ธ ์„œ๋ฒ„๊ฐ€ ํŒŒ์ผ์ด ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์„ ์ ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฉด ์ด์ „ ์„ค์ •์ด ๊ณ„์† ์„œ๋น„์Šค๋˜๊ณ , status line์€ ์–ด๋–ค ๋ณ€๊ฒฝ์ด ๊ฑฐ๋ถ€๋˜์—ˆ๋Š”์ง€ ์•Œ๋ ค ์ค๋‹ˆ๋‹ค. ์‚ฌ์ดํŠธ๋ฅผ `:80` ์—์„œ `:8080`์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์ด ํ”ํ•œ ์˜ˆ์ž…๋‹ˆ๋‹ค. ๋ฆฌ์Šค๋„ˆ ๊ตฌ์„ฑ์€ ์‹œ์ž‘ํ•  ๋•Œ ์†Œ์ผ“๊ณผ ํ•จ๊ป˜ ๋‹ค์‹œ ๋งŒ๋“ค์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ```text Status: "Reload rejected: listener topology changed (added: ["[::]:8080"], removed: ["[::]:80"]); restart Pingclair to rebuild H1, H2, H3, and TLS together" ``` ์–ด๋А ๊ฒฝ๋กœ๋“  ์ปดํŒŒ์ผ๋˜์ง€ ์•Š๋Š” ์„ค์ •์€ ์ด์ „ ์„ค์ •์„ ๊ทธ๋Œ€๋กœ ๋‘ก๋‹ˆ๋‹ค. ๋จผ์ € ๊ฒ€์ฆํ•˜์‹ญ์‹œ์˜ค. ```bash sudo pingclair validate /etc/Pingclair/Pingclairfile ``` ์˜ˆ์™ธ๋Š” ํ”„๋กœ์„ธ์Šค ์ „์—ญ ์ •์ฑ…์ž…๋‹ˆ๋‹ค. `trusted_proxies`์ฒ˜๋Ÿผ ์‹œ์ž‘ ์‹œ ํ™•๋ฆฝ๋˜๋Š” ์˜ต์…˜์€ ์žฌ์‹œ์ž‘ ํ›„์—๋งŒ ํšจ๋ ฅ์„ ๋ƒ…๋‹ˆ๋‹ค: `sudo pc service restart`. ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์˜ฎ๊ธฐ๋Š” ์„ค์ •๋„ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ฑฐ๋ถ€๋ฉ๋‹ˆ๋‹ค โ€” status line์ด ์ถ”๊ฐ€๋˜๊ณ  ์ œ๊ฑฐ๋œ ์ฃผ์†Œ๋ฅผ ์•Œ๋ ค ์ค๋‹ˆ๋‹ค โ€” ์žฌ์ ์šฉ์ด ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ •์ฑ…์ด์ง€ ์ƒˆ๋กœ์šด ๋Œ€๊ธฐ ์†Œ์ผ“์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ## ๐Ÿ“œ ๋กœ๊ทธ ์œ ๋‹›์€ `RUST_LOG=info`๋ฅผ ์„ค์ •ํ•˜๊ณ  ๋ชจ๋“  ๊ฒƒ์„ journal๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ```bash sudo journalctl -u pingclair -f sudo journalctl -u pingclair --since '10 min ago' ``` ์‹œ์ž‘, ์žฌ์ ์šฉ, ์ธ์ฆ์„œ ์ž‘์—…, ์š”์ฒญ๋งˆ๋‹ค ํ•œ ์ค„์˜ ์•ก์„ธ์Šค ๋กœ๊ทธ๊ฐ€ ๊ทธ๊ณณ์— ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ```text INFO pingclair::run: ๐Ÿš€ Starting Pingclair v0.2.0-rc.3 INFO pingclair::run: ๐Ÿ“„ Loaded configuration from: /etc/Pingclair/Pingclairfile INFO pingclair::run: ๐Ÿ”” Received SIGUSR1, reloading configuration from: /etc/Pingclair/Pingclairfile INFO pingclair::run: ๐Ÿ“‹ Step 1/3: Validating configuration... INFO pingclair::run: โœ… Configuration reload completed successfully in 323.341ยตs INFO pingclair::run: ๐Ÿ“Š 1 listener(s) updated INFO pingclair_proxy::server: ๐Ÿ“ Access request_id="65c09fa25d457-6" method="GET" host="localhost" path="/" status=200 bytes=18747 duration_ms=0 remote_ip=::1 user_agent="curl/8.18.0" ``` ์„œ๋ฒ„๊ฐ€ ๊ฑฐ๋ถ€ํ•œ ์žฌ์ ์šฉ๋„ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ, ์ด์œ ์™€ "์•„๋ฌด๊ฒƒ๋„ ๋ฐ”๋€Œ์ง€ ์•Š์•˜๋‹ค"๋Š” ์‚ฌ์‹ค๊ณผ ํ•จ๊ป˜ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ```text ERROR pingclair::run: โŒ Configuration reload rejected after 414.491ยตs: listener topology changed (added: ["[::]:8080"], removed: ["[::]:80"]); restart Pingclair to rebuild H1, H2, H3, and TLS together kind=RestartRequired ERROR pingclair::run: ๐Ÿ’ก Previous configuration remains active, unchanged ``` ํšŒ์ „์ด ์žˆ๋Š” ๋ณ„๋„ ๋กœ๊ทธ๋ฅผ ์›ํ•˜๋ฉด `log` ์‹ฑํฌ๋ฅผ ์„ค์ •ํ•ด ์„ค์น˜ ํ”„๋กœ๊ทธ๋žจ์ด ๋งŒ๋“ค๊ณ  ์„œ๋น„์Šค ์‚ฌ์šฉ์ž์—๊ฒŒ ์ค€ `/var/log/pingclair` ์•„๋ž˜์— ์“ฐ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ## โš ๏ธ ์„œ๋น„์Šค๊ฐ€ ์˜ฌ๋ผ์˜ค์ง€ ์•Š์„ ๋•Œ - **`is-active`๊ฐ€ `activating`์ด๊ณ  `NRestarts`๊ฐ€ ๊ณ„์† ์ฆ๊ฐ€.** ์„ค์น˜๋œ ์žฌ์‹œ์ž‘ ์ •์ฑ…์ด ์•„๋‹ˆ๋ผ ์˜› ์œ ๋‹›์˜ ์€ํ‡ดํ•œ ๋™์ž‘์ž…๋‹ˆ๋‹ค. ๊ทธ ์œ ๋‹›์€ `RestartPreventExitStatus` ์—†์ด `Restart=always`๋ฅผ ๋‹ฌ๊ณ  ์žˆ์—ˆ์œผ๋ฏ€๋กœ, ์„œ๋ฒ„๊ฐ€ ๊ฑฐ๋ถ€ํ•˜๋Š” ์„ค์ •์€ 5์ดˆ๋งˆ๋‹ค ๋‹ค์‹œ ์‹œ๋„๋˜์–ด "ํ•œ ๋ฒˆ ์‹คํŒจํ•œ ์œ ๋‹›"์ด ์•„๋‹ˆ๋ผ "๋๋‚ด ์•ˆ์ •๋˜์ง€ ์•Š๋Š” ์œ ๋‹›"์œผ๋กœ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ์›์ธ์€ ํ•˜๋‚˜ ๋” ์žˆ์Šต๋‹ˆ๋‹ค. `validate`๋ฅผ `ExecStartPre`๋กœ ๋Œ๋ ธ๋Š”๋ฐ, `RestartPreventExitStatus`๋Š” ๊ทธ๊ฒƒ์„ ๋ฎ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ค์น˜๋˜๋Š” ์œ ๋‹›์€ `Restart=on-failure` + `RestartPreventExitStatus=1`์„ ๋‹ฌ๊ณ  ์žˆ๊ณ  ์‚ฌ์ „ ๋ช…๋ น์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ฑฐ๋ถ€๋œ ์‹œ์ž‘์€ `is-active`๋ฅผ `failed`๋กœ, `NRestarts`๋ฅผ 0์œผ๋กœ ๋‚จ๊น๋‹ˆ๋‹ค. ์˜› ์„ค์น˜์—์„œ๋Š” ๋””๋ฒ„๊น… ์ „์— ๋ฃจํ”„๋ฅผ ๋ฉˆ์ถ”์‹ญ์‹œ์˜ค: `sudo systemctl stop pingclair`, ํŒŒ์ผ์„ ๊ณ ์นœ ๋’ค `sudo systemctl reset-failed pingclair`. - **`Job for pingclair.service failed because the control process exited with error code`.** ๋ฌด์—‡์ด๋“  ๋ฐ”์ธ๋”ฉํ•˜๊ธฐ ์ „์— ์„œ๋ฒ„๊ฐ€ ์„ค์ •์„ ๊ฑฐ๋ถ€ํ–ˆ๊ณ , ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ด์œ ๊ฐ€ journal์— ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ: ``Error: โŒ Configuration Error: Compile error: Unsupported feature: `encode br`: Brotli is not implemented for proxied responses; use `encode zstd gzip` ``. - **`TLS store /var/lib/pingclair/.local/share/pingclair is not writable: Permission denied`.** ์ €์žฅ์†Œ๋Š” ์„œ๋น„์Šค ๊ณ„์ •์˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. `sudo ls -ld /var/lib/pingclair/.local/share/pingclair`๋กœ ์†Œ์œ ์ž๊ฐ€ `pingclair`์ธ์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. - **`systemd-analyze verify`๊ฐ€ ์„ค์น˜๋œ ์œ ๋‹›์— ๋Œ€ํ•ด `Missing '=', ignoring line`์„ ๋ณด๊ณ .** ์˜› ์›๋ผ์ด๋„ˆ ์„ค์น˜๋Š” ์ฃผ์„์ด ์…ธ์— ์˜ํ•ด ํ™•์žฅ๋œ ์œ ๋‹›์„ ์ผ์Šต๋‹ˆ๋‹ค โ€” `--help` ์ถœ๋ ฅ 25์ค„์ด๊ณ  `systemd`๋Š” ์ด๋ฅผ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์„ค์น˜ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋‹ค์‹œ ์„ค์น˜ํ•˜๋ฉด ์œ ๋‹›์ด ๊ทธ๋Œ€๋กœ ๊ธฐ๋ก๋˜์–ด ์ด ๋ณด๊ณ ๋Š” ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค. - **์œ ๋‹›์€ ์‹คํ–‰ ์ค‘์ธ๋ฐ ์•„๋ฌด๊ฒƒ๋„ ์‘๋‹ตํ•˜์ง€ ์•Š์Œ.** ๋ฆฌ์Šค๋„ˆ๋Š” ๋ฐ”์ธ๋”ฉ๋๊ณ  ์š”์ฒญ์ด ๋„์ฐฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. [์„ค์น˜](/ko/start/install/)์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋จผ์ € ์ œ๊ณต์ž์˜ ๋ฐฉํ™”๋ฒฝ, ๋‹ค์Œ์œผ๋กœ ํ˜ธ์ŠคํŠธ ์ชฝ์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ## ๐Ÿงญ ๋‹ค์Œ ๋‹จ๊ณ„ - [์—…๊ทธ๋ ˆ์ด๋“œ์™€ ์‚ญ์ œ](/ko/start/upgrade/): ์žฌ์‹คํ–‰์ด ๋ฌด์—‡์„ ๋ณด์กดํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์ „๋ถ€ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ๋ฒ•. - [HTTPS](/ko/start/https/): ์ธ์ฆ์„œ, ์ €์žฅ์†Œ ์œ„์น˜, ๊ทธ๋ฆฌ๊ณ  `pingclair trust`์— `PINGCLAIR_TLS_STORE`๊ฐ€ ํ•„์š”ํ•œ ์ด์œ . - [`log`](/ko/reference/directives/#log): ์ด ํŽ˜์ด์ง€๊ฐ€ journal์—์„œ ์ฝ๋Š” ์•ก์„ธ์Šค ๋กœ๊ทธ์˜ ์ถœ๋ ฅ ๋Œ€์ƒ.