๐Ÿš‘ [์šฐ๋ถ„ํˆฌ ์„œ๋ฒ„] ์‚ฌ์ดํŠธ๊ฐ€ ๊ฐ‘์ž๊ธฐ ๋А๋ ค์ง€๊ฑฐ๋‚˜ ์•ˆ ๋œฐ ๋•Œ ํ•ด๊ฒฐ๋ฒ• (์‘๊ธ‰์ฒ˜์น˜ ๋งค๋‰ด์–ผ)

์ž˜ ๋Œ์•„๊ฐ€๋˜ ์šฐ๋ถ„ํˆฌ ์„œ๋ฒ„(Nginx + PHP + MySQL)๊ฐ€ ๊ฐ‘์ž๊ธฐ ๊ฑฐ๋ถ์ด๊ฐ€ ๋˜๊ฑฐ๋‚˜ ์ ‘์† ์˜ค๋ฅ˜(502 Bad Gateway)๋ฅผ ๋ฟœ์„ ๋•Œ๊ฐ€ ์žˆ๋‹ค. ์›์ธ์€ ๋ณดํ†ต 1. ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ, 2. DB ๋ณ‘๋ชฉ, 3. ์™ธ๋ถ€ ๊ณต๊ฒฉ(๋ด‡, ๋””๋„์Šค) ์ค‘ ํ•˜๋‚˜๋‹ค.

๋‹นํ™ฉํ•˜์ง€ ๋ง๊ณ  ์•„๋ž˜ ์ˆœ์„œ๋Œ€๋กœ ํ™•์ธํ•˜์ž.

1๋‹จ๊ณ„: ๋ฒ”์ธ ์ƒ‰์ถœํ•˜๊ธฐ (์ž์› ๋ชจ๋‹ˆํ„ฐ๋ง)

๊ฐ€์žฅ ๋จผ์ € ๋ˆ„๊ฐ€ ๋‚ด ์„œ๋ฒ„์˜ CPU์™€ ๋žจ(RAM)์„ ์žก์•„๋จน๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

Bash

htop
  • ํ™•์ธํ•  ๊ฒƒ:

    • Mem(๋ฉ”๋ชจ๋ฆฌ): ๊ฝ‰ ์ฐผ๋Š”๊ฐ€? (ํŠนํžˆ MySQL์ด ํ˜ผ์ž ๋‹ค ๋จน๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธ)

    • Swp(์Šค์™‘): 0K/0K๋ผ๋ฉด ์œ„ํ—˜ํ•˜๋‹ค. ๋žจ ๋ถ€์กฑ ์‹œ ์‚ฌ์šฉํ•  ๋น„์ƒ๊ธˆ(๊ฐ€์ƒ๋ฉ”๋ชจ๋ฆฌ)์ด ์—†๋‹ค๋Š” ๋œป.

    • Load Average: ์ฝ”์–ด ์ˆ˜๋ณด๋‹ค ์ˆซ์ž๊ฐ€ ํ›จ์”ฌ ๋†’๋‹ค๋ฉด ์ž‘์—…์ด ๋ฐ€๋ ค์žˆ๋Š” ์ƒํƒœ.


2๋‹จ๊ณ„: ์‹ค์‹œ๊ฐ„ ์ ‘์† ๋กœ๊ทธ ํ™•์ธ (CCTV ๋Œ๋ ค๋ณด๊ธฐ)

๋ˆ„๊ฐ€ ์ ‘์†ํ•˜๊ณ  ์žˆ๋Š”์ง€ ๋ˆˆ์œผ๋กœ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. 1์ดˆ์— ์ˆ˜์‹ญ ๋ฒˆ์”ฉ ๋“ค์–ด์˜ค๋Š” IP๊ฐ€ ์žˆ๋‹ค๋ฉด 100% ๊ณต๊ฒฉ์ด๋‚˜ ๋ด‡์ด๋‹ค.

Bash

sudo tail -f /var/log/nginx/access.log
  • ํ™•์ธํ•  ๊ฒƒ:

    • ํŠน์ • IP๊ฐ€ ๋ฏธ์นœ ๋“ฏ์ด ์˜ฌ๋ผ์˜ค๋Š”๊ฐ€?

    • ์ด์ƒํ•œ ๋ฌธ์ž์—ด(%27, /etc/passwd ๋“ฑ)์„ URL ๋’ค์— ๋ถ™์ด๋Š”๊ฐ€? (ํ•ดํ‚น ์‹œ๋„)

    • ํ•ด๊ฒฐ: ๊ณต๊ฒฉ์ž IP๋ฅผ ๋ฉ”๋ชจ์žฅ์— ๋ณต์‚ฌํ•ด ๋‘”๋‹ค.


3๋‹จ๊ณ„: ๊ณต๊ฒฉ์ž ์ฐจ๋‹จ (๋ฐฉํ™”๋ฒฝ & ์›น์„œ๋ฒ„)

์ด์ƒํ•œ ๋†ˆ์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค๋ฉด ์ฆ‰์‹œ ์ฐจ๋‹จํ•œ๋‹ค.

๋ฐฉ๋ฒ• A: UFW ๋ฐฉํ™”๋ฒฝ์œผ๋กœ ์ฐจ๋‹จ (๊ฐ€์žฅ ๊ฐ•๋ ฅํ•จ)

์•„์˜ˆ ์„œ๋ฒ„ ์ž…๊ตฌ์—์„œ ์ปทํ•ด๋ฒ„๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

Bash

# 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 ๋ธ”๋ก ์•ˆ์— ์ถ”๊ฐ€ํ•œ๋‹ค.

Nginx

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)

Ini, TOML

[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) ๋งŒ๋“ค๊ธฐ

๋žจ์ด ํ„ฐ์งˆ ๊ฒƒ ๊ฐ™์„ ๋•Œ ํ•˜๋“œ๋””์Šคํฌ๋ฅผ ๋นŒ๋ ค ์“ฐ๋Š” ‘์Šค์™‘ ๋ฉ”๋ชจ๋ฆฌ’๊ฐ€ ์—†์œผ๋ฉด, ๋ฆฌ๋ˆ…์Šค๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ•์ œ๋กœ ์ฃฝ์—ฌ๋ฒ„๋ฆฐ๋‹ค.

Bash

# 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๋‹จ๊ณ„: ์„œ๋น„์Šค ์žฌ์‹œ์ž‘ (๋งˆ๋ฌด๋ฆฌ)

์„ค์ •์„ ๋‹ค ๋ฐ”๊ฟจ๊ฑฐ๋‚˜, ๋„ˆ๋ฌด ๋А๋ ค์„œ ์ ‘์†์ด ์•ˆ ๋Š๊ธธ ๋•Œ๋Š” ์‹œ์›ํ•˜๊ฒŒ ์žฌ์‹œ์ž‘ํ•ด์ฃผ๋Š” ๊ฒŒ ๋‹ต์ด๋‹ค.

Bash

# PHP ํ”„๋กœ์„ธ์Šค ์ดˆ๊ธฐํ™” (์ ‘์† ์ฐŒ๊บผ๊ธฐ ์ œ๊ฑฐ)
sudo service php8.1-fpm restart  
# (๋ฒ„์ „์— ๋”ฐ๋ผ php7.4-fpm ๋“ฑ ์ˆซ์ž๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Œ)

# Nginx ์žฌ์‹œ์ž‘
sudo service nginx restart

# MySQL ์žฌ์‹œ์ž‘
sudo service mysql restart

๐Ÿ’ก ๊ฟ€ํŒ: robots.txt๋ฅผ ์ž˜ ์„ค์ •ํ•ด์„œ ์“ธ๋ฐ์—†๋Š” ํ•ด์™ธ ๋ด‡(Amazonbot, MJ12bot ๋“ฑ)์ด ๊ธ์–ด๊ฐ€๋Š” ๊ฒƒ๋งŒ ๋ง‰์•„๋„ ์„œ๋ฒ„๊ฐ€ ํ›จ์”ฌ ์พŒ์ ํ•ด์ง„๋‹ค!

๋Œ“๊ธ€ ๋‹ฌ๊ธฐ

์ด๋ฉ”์ผ ์ฃผ์†Œ๋Š” ๊ณต๊ฐœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•„์ˆ˜ ํ•„๋“œ๋Š” *๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค

์œ„๋กœ ์Šคํฌ๋กค