์ ๋์๊ฐ๋ ์ฐ๋ถํฌ ์๋ฒ(Nginx + PHP + MySQL)๊ฐ ๊ฐ์๊ธฐ ๊ฑฐ๋ถ์ด๊ฐ ๋๊ฑฐ๋ ์ ์ ์ค๋ฅ(502 Bad Gateway)๋ฅผ ๋ฟ์ ๋๊ฐ ์๋ค. ์์ธ์ ๋ณดํต 1. ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ, 2. DB ๋ณ๋ชฉ, 3. ์ธ๋ถ ๊ณต๊ฒฉ(๋ด, ๋๋์ค) ์ค ํ๋๋ค.
๋นํฉํ์ง ๋ง๊ณ ์๋ ์์๋๋ก ํ์ธํ์.
1๋จ๊ณ: ๋ฒ์ธ ์์ถํ๊ธฐ (์์ ๋ชจ๋ํฐ๋ง)
๊ฐ์ฅ ๋จผ์ ๋๊ฐ ๋ด ์๋ฒ์ CPU์ ๋จ(RAM)์ ์ก์๋จน๊ณ ์๋์ง ํ์ธํด์ผ ํ๋ค.
htop
-
ํ์ธํ ๊ฒ:
-
Mem(๋ฉ๋ชจ๋ฆฌ): ๊ฝ ์ฐผ๋๊ฐ? (ํนํ MySQL์ด ํผ์ ๋ค ๋จน๊ณ ์๋์ง ํ์ธ)
-
Swp(์ค์):
0K/0K๋ผ๋ฉด ์ํํ๋ค. ๋จ ๋ถ์กฑ ์ ์ฌ์ฉํ ๋น์๊ธ(๊ฐ์๋ฉ๋ชจ๋ฆฌ)์ด ์๋ค๋ ๋ป. -
Load Average: ์ฝ์ด ์๋ณด๋ค ์ซ์๊ฐ ํจ์ฌ ๋๋ค๋ฉด ์์ ์ด ๋ฐ๋ ค์๋ ์ํ.
-
2๋จ๊ณ: ์ค์๊ฐ ์ ์ ๋ก๊ทธ ํ์ธ (CCTV ๋๋ ค๋ณด๊ธฐ)
๋๊ฐ ์ ์ํ๊ณ ์๋์ง ๋์ผ๋ก ํ์ธํด์ผ ํ๋ค. 1์ด์ ์์ญ ๋ฒ์ฉ ๋ค์ด์ค๋ IP๊ฐ ์๋ค๋ฉด 100% ๊ณต๊ฒฉ์ด๋ ๋ด์ด๋ค.
sudo tail -f /var/log/nginx/access.log
-
ํ์ธํ ๊ฒ:
-
ํน์ IP๊ฐ ๋ฏธ์น ๋ฏ์ด ์ฌ๋ผ์ค๋๊ฐ?
-
์ด์ํ ๋ฌธ์์ด(
%27,/etc/passwd๋ฑ)์ URL ๋ค์ ๋ถ์ด๋๊ฐ? (ํดํน ์๋) -
ํด๊ฒฐ: ๊ณต๊ฒฉ์ IP๋ฅผ ๋ฉ๋ชจ์ฅ์ ๋ณต์ฌํด ๋๋ค.
-
3๋จ๊ณ: ๊ณต๊ฒฉ์ ์ฐจ๋จ (๋ฐฉํ๋ฒฝ & ์น์๋ฒ)
์ด์ํ ๋์ ๋ฐ๊ฒฌํ๋ค๋ฉด ์ฆ์ ์ฐจ๋จํ๋ค.
๋ฐฉ๋ฒ A: UFW ๋ฐฉํ๋ฒฝ์ผ๋ก ์ฐจ๋จ (๊ฐ์ฅ ๊ฐ๋ ฅํจ)
์์ ์๋ฒ ์ ๊ตฌ์์ ์ปทํด๋ฒ๋ฆฌ๋ ๋ฐฉ๋ฒ์ด๋ค.
# 1. ์ฐจ๋จ ๊ท์น ์ถ๊ฐ
sudo ufw deny from [๊ณต๊ฒฉ์IP] to any
# 2. (์ค์) ๋ฐฉํ๋ฒฝ์ด ์ผ์ ธ ์๋์ง ํ์ธ! 'inactive'๋ฉด ์๋์ํจ
sudo ufw status
# 3. ๊บผ์ ธ์๋ค๋ฉด ์ผ๊ธฐ (SSH 22๋ฒ ํฌํธ ํ์ฉ ํ์!)
sudo ufw allow ssh
sudo ufw enable
๋ฐฉ๋ฒ B: Nginx ์ค์ ์ผ๋ก ์ฐจ๋จ (or ์ ์ฒด ์ค์ )
/etc/nginx/nginx.conf ํ์ผ์ ์ด์ด http ๋ธ๋ก ์์ ์ถ๊ฐํ๋ค.
http {
# ํน์ IP ์ฐจ๋จ
deny [๊ณต๊ฒฉ์IP];
# (์ ํ) ๋ด ๊ดํด ๋ฐฉ์ง (์๋ ์ ํ)
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
# ...
}
-
์ค์ ํ ์ฌ์์ ํ์:
sudo service nginx reload
4๋จ๊ณ: MySQL ๋ฉ๋ชจ๋ฆฌ ๋ค์ด์ดํธ (์ค์ ์ต์ ํ)
์๋ฒ๊ฐ 2GB ๋จ์ธ๋ฐ MySQL ํผ์ 1.5GB๋ฅผ ๋จน์ผ๋ฉด ์๋ฒ๊ฐ ์ฃฝ๋๋ค. ์ค์ ์ ํตํด ๊ฐ์ ๋ก ๋ค์ด์ดํธ๋ฅผ ์์ผ์ผ ํ๋ค.
-
์ค์ ํ์ผ:
/etc/mysql/mysql.conf.d/mysqld.cnf(๋๋my.cnf)
[mysqld]
# 1. ๋จ ์ฌ์ฉ๋ ์ ํ (์ ์ฒด ๋จ์ 40~50% ์ ๋๋ง ํ ๋น)
innodb_buffer_pool_size = 512M
# 2. ์ข๋น ์ ์ ๋๊ธฐ (ํ ์ผ ์๋ ์ ์์๊ฐ ๊ณ์ ๋ถ์ด์์ง ์๊ฒ)
wait_timeout = 60
interactive_timeout = 60
# 3. ์ต๋ ์ ์์ ์ ์ ํ
max_connections = 100
-
์ค์ ํ ์ฌ์์ ํ์:
sudo service mysql restart
5๋จ๊ณ: ์์ ์ฅ์น(Swap) ๋ง๋ค๊ธฐ
๋จ์ด ํฐ์ง ๊ฒ ๊ฐ์ ๋ ํ๋๋์คํฌ๋ฅผ ๋น๋ ค ์ฐ๋ ‘์ค์ ๋ฉ๋ชจ๋ฆฌ’๊ฐ ์์ผ๋ฉด, ๋ฆฌ๋ ์ค๋ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ ๋ก ์ฃฝ์ฌ๋ฒ๋ฆฐ๋ค.
# 2GB ์ค์ ํ์ผ ์์ฑ ๋ฐ ์ ์ฉ (ํ ์ค์ฉ ์
๋ ฅ)
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
-
ํ์ธ:
htop์์ Swp ๊ฒ์ด์ง๊ฐ ์๊ฒผ๋์ง ํ์ธ.
6๋จ๊ณ: ์๋น์ค ์ฌ์์ (๋ง๋ฌด๋ฆฌ)
์ค์ ์ ๋ค ๋ฐ๊ฟจ๊ฑฐ๋, ๋๋ฌด ๋๋ ค์ ์ ์์ด ์ ๋๊ธธ ๋๋ ์์ํ๊ฒ ์ฌ์์ํด์ฃผ๋ ๊ฒ ๋ต์ด๋ค.
# PHP ํ๋ก์ธ์ค ์ด๊ธฐํ (์ ์ ์ฐ๊บผ๊ธฐ ์ ๊ฑฐ)
sudo service php8.1-fpm restart
# (๋ฒ์ ์ ๋ฐ๋ผ php7.4-fpm ๋ฑ ์ซ์๊ฐ ๋ค๋ฅผ ์ ์์)
# Nginx ์ฌ์์
sudo service nginx restart
# MySQL ์ฌ์์
sudo service mysql restart
๐ก ๊ฟํ: robots.txt๋ฅผ ์ ์ค์ ํด์ ์ธ๋ฐ์๋ ํด์ธ ๋ด(Amazonbot, MJ12bot ๋ฑ)์ด ๊ธ์ด๊ฐ๋ ๊ฒ๋ง ๋ง์๋ ์๋ฒ๊ฐ ํจ์ฌ ์พ์ ํด์ง๋ค!