1. ๋ฌธ์ ์ฆ์ ๋ฐ ์ด๊ธฐ ์ง๋จ
๊ฐ์๊ธฐ ์น์ฌ์ดํธ์ ์ ์ํ์ ๋ 504 Gateway Time-out ๋๋ 502 Bad Gateway ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉฐ ์ฌ์ดํธ๊ฐ ๊ฐํ์ ์ผ๋ก ๋จนํต์ด ๋๋ ํ์์ด ๋ฐ์ํ์ต๋๋ค. ํนํ ํน์ ์ฌ์ดํธ์์๋ง ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ณ , HTML ๊ฐ์ ์ ์ ํ์ผ์ ์ ์ด๋ ธ์ต๋๋ค.
์ด๊ธฐ ์ง๋จ ๊ฒฐ๊ณผ, MySQL ์๋ฒ๋ ์ ์ ์๋ ์ค์ด์์ผ๋ฉฐ, ๋ฌธ์ ๋ Nginx์ ๋ฐฑ์๋ PHP-FPM ์ฌ์ด์ ํต์ ๋ฌธ์ ๋ก ์ขํ์ก์ต๋๋ค.
๐ก ๋ก๊ทธ์์ ๋ฐ๊ฒฌ๋ ํต์ฌ ๋จ์
PHP-FPM ์ค๋ฅ ๋ก๊ทธ(sudo tail -n 50 /var/log/php/8.3/fpm/www-error.log ๋๋ sudo tail -n 50 /var/log/php*-fpm.log)๋ฅผ ํ์ธํ ๊ฒฐ๊ณผ, ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ๊ณ ์ ์๋ฆผ์ด ๋ฐ๋ณต์ ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค.
WARNING: [pool www] server reached pm.max_children setting (30), consider raising it
WARNING: [pool www] seems busy...
NOTICE: Terminating ... exiting, bye-bye!
์ง๋จ ๊ฒฐ๊ณผ: PHP-FPM์ด ๋์์ ์ฒ๋ฆฌํ ์ ์๋ ์ต๋ ํ๋ก์ธ์ค ์(pm.max_children)๊ฐ ๋ถ์กฑํ์ฌ ๋ชจ๋ ํ๋ก์ธ์ค๊ฐ ๊ณ ๊ฐ๋์๊ฑฐ๋, ํ๋ก์ธ์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ์ฌ ์ด์์ฒด์ ๊ฐ PHP ์๋น์ค๋ฅผ ๊ฐ์ ์ข
๋ฃํ๊ณ ์๋ ์ํฉ์ด์์ต๋๋ค.
2. ๊ทผ๋ณธ ์์ธ: ์ธ๋ถ API ์ค๋จ๊ณผ ๋ฆฌ์์ค ๊ณ ๊ฐ
๋ฌธ์ ๊ฐ ๋ฐ์ํ ์์ ์ ์คํ API ์๋น์ค๊ฐ ์ค๋จ๋์๋ค๋ ์ ์ด ํ์ธ๋์์ต๋๋ค. ์ด๊ฒ์ด PHP ํ๋ก์ธ์ค๋ฅผ ๋ง๋น์ํจ ๊ทผ๋ณธ ์์ธ์ด์์ต๋๋ค.
- ๋ฌดํ ๋๊ธฐ: PHP ์คํฌ๋ฆฝํธ๋ API ์๋ต์ ๊ธฐ๋ค๋ฆฌ์ง๋ง, API ์๋ฒ๊ฐ ์ค๋จ๋์ด ์๋ต์ ๋ฐ์ง ๋ชปํ๊ณ ๋ฌดํ ๋๊ธฐ ์ํ์ ๋น ์ง๋๋ค.
- ํ๋ก์ธ์ค ์ ์ : ๋๊ธฐ ์ํ์ ๋น ์ง ํ๋ก์ธ์ค๋ ๋ฆฌ์์ค๋ฅผ ์ ์ ํ ์ฑ ๋ค๋ฅธ ์์ฒญ์ ์ฒ๋ฆฌํ์ง ๋ชปํฉ๋๋ค.
- ๋ฆฌ์์ค ๊ณ ๊ฐ: ์ ์์๊ฐ ๋์ด๋๋ฉด์ ๋๊ธฐํ๋ ํ๋ก์ธ์ค๊ฐ
pm.max_childrenํ๋๋ฅผ ์ฑ์ฐ๊ณ , ๊ฒฐ๊ตญ ์๋ฒ์ ๋ชจ๋ PHP ๋ฆฌ์์ค๋ฅผ ๊ณ ๊ฐ์์ผ ๋ค๋ฅธ ์ ์์ ์ธ ์ฌ์ดํธ๊น์ง ๋๋ ค์ง๊ฑฐ๋ 504 ์ค๋ฅ๋ฅผ ๋ฐ์์ํต๋๋ค.
3. ํด๊ฒฐ์ฑ : PHP-FPM ์ค์ ์ต์ ํ ๋ฐ ํ์์์ ์กฐ์
์ด ๋ฌธ์ ๋ ์๋ฒ์ RAM ์ฉ๋์ ๋ง์ถฐ PHP-FPM ํ๋ก์ธ์ค ํ๋๋ฅผ ๋๋ฆฌ๊ณ PHP๊ฐ ์ธ๋ถ ์๋ต์ ๋ฌดํ์ ๊ธฐ๋ค๋ฆฌ์ง ์๋๋ก ํ์์์์ ์ค์ ํ์ฌ ํด๊ฒฐํ ์ ์์ต๋๋ค.
A. PHP-FPM ํ๋ก์ธ์ค ํ๋ ์ฆ์ค (pm.max_children)
์๋ฒ์ RAM ์ฉ๋์ ํ์ธํ ํ, /etc/php/8.3/fpm/pool.d/www.conf ํ์ผ์์ pm.max_children ๊ฐ์ ์กฐ์ ํฉ๋๋ค.
| ์๋ฒ RAM (์์) | PHP ํ๋ก์ธ์ค๋น ๋ฉ๋ชจ๋ฆฌ (๊ฐ์ ) | ์์ ํ pm.max_children ๊ฐ (๊ถ์ฅ ์์์ ) |
| 2 GB | 50 MB | ์ฝ 30๊ฐ |
| 4 GB | 50 MB | ์ฝ 70๊ฐ |
| 8 GB | 50 MB | ์ฝ 150๊ฐ |
PHP-FPM ์ค์ ํ์ผ (www.conf) ์์ ์์:
Ini, TOML
; pm.max_children์ RAM ์ฉ๋์ ๋ง์ถฐ ์กฐ์
pm.max_children = 70
pm.start_servers = 15
pm.min_spare_servers = 10
pm.max_spare_servers = 30
B. PHP-FPM ๋ฐ Nginx ํ์์์ ์ค์
PHP ํ๋ก์ธ์ค๊ฐ ์ธ๋ถ API๋ฅผ ๋ฌดํ์ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ ๋ง๊ธฐ ์ํด ํ์์์์ ์ค์ ํฉ๋๋ค.
| ์ค์ ํญ๋ชฉ | ์ค์ ์์น | ๊ถ์ฅ ๊ฐ | ์ญํ |
request_terminate_timeout | /etc/php/8.3/fpm/pool.d/www.conf | 60s | PHP ์คํฌ๋ฆฝํธ ์คํ ์๊ฐ์ ๊ฐ์ ๋ก ์ ํ (Nginx ํ์์์๋ณด๋ค ์งง๊ฒ ์ค์ ) |
proxy_read_timeout | Nginx ์ฌ์ดํธ ์ค์ ํ์ผ (.conf) | 300s | Nginx๊ฐ ๋ฐฑ์๋(PHP)์ ์๋ต์ ๊ธฐ๋ค๋ฆฌ๋ ์ต๋ ์๊ฐ (504 ์ค๋ฅ ์ํ) |
Sheets๋ก ๋ด๋ณด๋ด๊ธฐ
๐ ๏ธ ์ต์ข ์ ์ฉ ๋ช ๋ น์ด
์ค์ ํ์ผ ์์ ํ์๋ ๋ฐ๋์ ๋ ์๋น์ค๋ฅผ ๋ชจ๋ ์ฌ์์ํด์ผ ๋ณ๊ฒฝ ์ฌํญ์ด ์ ์ฉ๋ฉ๋๋ค.
Bash
# 1. PHP-FPM ์ฌ์์
sudo systemctl restart php8.3-fpm
# 2. Nginx ์ฌ์์
sudo systemctl restart nginx
์ด ๊ณผ์ ์ ํตํด PHP ํ๋ก์ธ์ค ๊ณ ๊ฐ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ด ์๋น์ค๊ฐ ์ ์ํ๋ ์ ์์ต๋๋ค. ์ฅ๊ธฐ์ ์ผ๋ก๋ PHP ์ฝ๋ ๋ด์์ ์ธ๋ถ API ํธ์ถ ์ ํ์์์ ์ต์
(์: cURL์ CURLOPT_TIMEOUT)์ ์งง๊ฒ ์ค์ ํ์ฌ ์ธ๋ถ ์ฅ์ ๊ฐ ์๋ฒ ์ ์ฒด์ ์ํฅ์ ๋ฏธ์น๋ ๊ฒ์ ๋ฐฉ์งํด์ผ ํฉ๋๋ค.