nginx λ° MySQL νλ‘μΈμ€μ 리μμ€λ₯Ό λͺ¨λν°λ§νκ³ , μκ³μΉλ₯Ό μ΄κ³Όν κ²½μ° SlackμΌλ‘ μλ μλμ 보λ΄λ μμ€ν μ ꡬμ±νμμ΅λλ€.
![]() |
![]() |
![]() |
|---|---|---|
| μ νΈμ€ | μ₯μν | μ΄μ±λΉ |
μ΄ νλ‘μ νΈλ μλνλ μλ² λͺ¨λν°λ§μ ν΅ν΄ μ€μκ° λμλ ₯μ λμ΄κ³ , IT μΈνλΌλ₯Ό ν¨κ³Όμ μΌλ‘ κ΄λ¦¬νλ©°, κΈ°λ‘λ λ°μ΄ν°λ₯Ό κΈ°λ°μΌλ‘ μΆν νμ©ν μ μλλ‘ νλ κ²μ λͺ©νλ‘ ν©λλ€.
π λͺ©ν
- μλ² νλ‘μΈμ€ 리μμ€(Nginx, MySQL)μ CPU λ° λ©λͺ¨λ¦¬ μ¬μ©λμ λͺ¨λν°λ§
- μκ³κ° μ΄κ³Ό μ Slack μλ μ μ‘νμ¬ μ€μκ° λμ κ°λ₯
- μ£ΌκΈ°μ μΈ λ‘κ·Έ κΈ°λ‘μ ν΅ν΄ λ°μ΄ν° νμ©
- IT μΈνλΌ κ΄μ μμ μλν λ° μ μ§λ³΄μ ν¨μ¨μ± ν₯μ
crontab(μ£ΌκΈ°μ μ€ν)grep(μ κ·ννμ μ¬μ©)uptime(μλ² κ°λ μκ° μ²΄ν¬)
| CPU μλ | λ©λͺ¨λ¦¬ μλ | Mysql |
|---|---|---|
![]() |
![]() |
![]() |
managerμλ‘μ΄ μ μ κ³μ μμ± λ° λ‘κ·Έ λλ ν 리 μμ±process_monitor.sh(Nginx) &process_monitor_mysql.sh(MySQL) μ€ν¬λ¦½νΈ μμ± λ° μ€ν κΆν λΆμ¬crontabμ νμ©νμ¬ μλ μ€ν μ€μ (1λΆλ§λ€ μ€ν)wrkμ μ΄μ©ν λΆν ν μ€νΈ λ° μ±λ₯ μ κ²
λ¨Όμ , λͺ¨λν°λ§ μ€ν¬λ¦½νΈλ₯Ό μ€νν κ΄λ¦¬ κ³μ (manager)μ μμ±νκ³ , λ‘κ·Έλ₯Ό μ μ₯ν λλ ν 리λ₯Ό μμ±
# manager μ¬μ©μ μΆκ° λ° sudo κΆν λΆμ¬
sudo adduser manager
id manager
sudo usermod -aG sudo manager
# nginx μ€μΉ λ° νμΈ
sudo apt update
sudo apt install nginx
sudo systemctl start nginx
sudo systemctl status nginx
# mysql μ€μΉ λ° νμΈ
sudo apt update
sudo apt install mysql-server
sudo systemctl start mysql
sudo systemctl status mysql
# λ‘κ·Έ μ μ₯μ μν λλ ν 리 λ° νμΌ μμ±
sudo mkdir -p /var/log/manager_logs
sudo touch /var/log/manager_logs/process_monitor.log
sudo touch /var/log/manager_logs/process_monitor_mysql.log
# κΆν μ€μ
sudo chmod 777 /var/log/manager_logs
sudo chmod 777 /var/log/manager_logs/process_monitor.log
sudo chmod 777 /var/log/manager_logs/process_monitor_mysql.log
sudo chown manager:manager /var/log/manager_logs/process_monitor.log
sudo chown manager:manager /var/log/manager_logs/process_monitor_mysql.lognano /home/manager/process_monitor.shπ process_monitor.sh (Nginx 리μμ€ λͺ¨λν°λ§)
#!/bin/bash
LOG_FILE="/var/log/manager_logs/process_monitor.log"
PROCESS="nginx: worker process"
CPU_THRESHOLD=10.0
MEM_THRESHOLD=10700
SLACK_WEBHOOK_URL="https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXX"
echo "$(date '+%Y-%m-%d %H:%M:%S') - Checking $PROCESS resource usage..." >> $LOG_FILE
PIDS=$(pgrep -f "$PROCESS")
if [ -z "$PIDS" ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - Process $PROCESS not running" >> $LOG_FILE
exit 1
fi
TOTAL_CPU=0
TOTAL_MEM=0
for PID in $PIDS; do
CPU_USAGE=$(ps -p "$PID" -o %cpu --no-headers | awk '{print $1}')
MEM_USAGE=$(ps -p "$PID" -o rss --no-headers | awk '{print $1}')
TOTAL_CPU=$(echo "$TOTAL_CPU + $CPU_USAGE" | bc)
TOTAL_MEM=$(echo "$TOTAL_MEM + $MEM_USAGE" | bc)
done
echo "$(date '+%Y-%m-%d %H:%M:%S') - Total CPU: $TOTAL_CPU% | Total Memory: $TOTAL_MEM KB" >> $LOG_FILE
send_slack_alert() {
curl -X POST -H 'Content-type: application/json' --data "{\"text\":\"$1\"}" $SLACK_WEBHOOK_URL
}
if (( $(echo "$TOTAL_CPU > $CPU_THRESHOLD" | bc -l) )); then
send_slack_alert "π₯ *High CPU Usage Alert!* Process: $PROCESS | CPU: $TOTAL_CPU%"
fi
if [ "$TOTAL_MEM" -ge "$MEM_THRESHOLD" ]; then
send_slack_alert "π₯ *High Memory Usage Alert!* Process: $PROCESS | Memory: $TOTAL_MEM KB"
finano /home/manager/process_monitor_mysql.shπ process_monitor_mysql.sh (MySQL 리μμ€ λͺ¨λν°λ§)
#!/bin/bash
LOG_FILE="/var/log/manager_logs/process_monitor_mysql.log"
PROCESS="mysqld"
CPU_THRESHOLD=10.0
MEM_THRESHOLD=10700
SLACK_WEBHOOK_URL="https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXX"
echo "$(date '+%Y-%m-%d %H:%M:%S') - Checking $PROCESS resource usage..." >> $LOG_FILE
PIDS=$(pgrep -f "$PROCESS")
if [ -z "$PIDS" ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - Process $PROCESS not running" >> $LOG_FILE
exit 1
fi
TOTAL_CPU=0
TOTAL_MEM=0
for PID in $PIDS; do
CPU_USAGE=$(ps -p "$PID" -o %cpu --no-headers | awk '{print $1}')
MEM_USAGE=$(ps -p "$PID" -o rss --no-headers | awk '{print $1}')
TOTAL_CPU=$(echo "$TOTAL_CPU + $CPU_USAGE" | bc)
TOTAL_MEM=$(echo "$TOTAL_MEM + $MEM_USAGE" | bc)
done
echo "$(date '+%Y-%m-%d %H:%M:%S') - Total CPU: $TOTAL_CPU% | Total Memory: $TOTAL_MEM KB" >> $LOG_FILE
send_slack_alert() {
curl -X POST -H 'Content-type: application/json' --data "{\"text\":\"$1\"}" $SLACK_WEBHOOK_URL
}
if (( $(echo "$TOTAL_CPU > $CPU_THRESHOLD" | bc -l) )); then
send_slack_alert "π₯ *High CPU Usage Alert!* Process: $PROCESS | CPU: $TOTAL_CPU%"
fi
if [ "$TOTAL_MEM" -ge "$MEM_THRESHOLD" ]; then
send_slack_alert "π₯ *High Memory Usage Alert!* Process: $PROCESS | Memory: $TOTAL_MEM KB"
ficrontab -eλ€μ λ΄μ©μ μΆκ°:
* * * * * /bin/bash /home/manager/process_monitor.sh
* * * * * /bin/bash /home/manager/process_monitor_mysql.sh
sudo apt install wrk -y
wrk -t4 -c1000 -d100s http://localhost/| λ¬Έμ | μμΈ | ν΄κ²° λ°©λ² |
|---|---|---|
| Slack μλμ΄ μ μ‘λμ§ μμ | SLACK_WEBHOOK_URLμ΄ μ¬λ°λ₯΄μ§ μκ±°λ, λ€νΈμν¬ λ¬Έμ λ°μ |
SLACK_WEBHOOK_URLμ΄ μ ννμ§ νμΈ |
crontabμ΄ μ€νλμ§ μμ |
crontabμ΄ μ λλ‘ λ±λ‘λμ§ μμκ±°λ, μ€ν κΆν λ¬Έμ λ°μ |
crontab -l λͺ
λ Ήμ΄λ‘ λ±λ‘λ μμ
νμΈ, /var/log/syslogμμ cron μ€ν μ¬λΆ νμΈ sudo grep process_monitor.sh /var/log/syslog , chmod +xλ‘ μ€ν κΆν λΆμ¬ ν μ¬λ±λ‘ |
| MySQL νλ‘μΈμ€κ° κ°μ§λμ§ μμ | mysqld νλ‘μΈμ€κ° μμκ³Ό λ€λ₯Έ μμΉμμ μ€ν μ€μ΄κ±°λ, μλΉμ€κ° μ€μ§λ¨ |
pgrep -a mysqld λλ systemctl status mysql μ€ν ν MySQL μλΉμ€κ° μ€ν μ€μΈμ§ νμΈνκ³ , pgrep -f "mysqld"λ‘ νλ‘μΈμ€ νμ |
| λ‘κ·Έ νμΌμ΄ μμ±λμ§ μμ | λ‘κ·Έ λλ ν 리 λλ νμΌμ λν κΆν λ¬Έμ | /var/log/manager_logs/μ /var/log/manager_logs/process_monitor.logμ κΆν νμΈ (chmod 777 λ° chown manager:manager μ€μ ) |
| Nginxμ PIDκ° μ¬λ¬ κ° λ°κ²¬λ¨ (Master, Worker μ‘΄μ¬) | Nginxλ Master νλ‘μΈμ€ 1κ° + Worker νλ‘μΈμ€ μ¬λ¬ κ°λ‘ ꡬμ±λ¨ | pgrep -f "nginx: worker process"λ₯Ό μ¬μ©νμ¬ Worker νλ‘μΈμ€λ§ λͺ¨λν°λ§νλλ‘ μ€μ |
| Nginxμ λͺ¨λ Worker νλ‘μΈμ€μ CPU λ° λ©λͺ¨λ¦¬ μ¬μ©λ ν©μ° νμ | pgrepλ‘ μ°Ύμ κ°κ°μ PID μ¬μ©λμ κ°λ³μ μΌλ‘ 체ν¬ν΄μΌ ν¨ |
for PID in $(pgrep -f "nginx: worker process"); do ... done 루νλ₯Ό μ¬μ©νμ¬ CPU λ° λ©λͺ¨λ¦¬ μ¬μ©λμ λͺ¨λ ν©μ° |
| Nginx λλ MySQLμ΄ μ¬μμλ λ PID λ³κ²½λ¨ | νλ‘μΈμ€κ° μ¬μμλ λλ§λ€ μλ‘μ΄ PIDκ° ν λΉλ¨ | λ§€λ² pgrepμ μ€ννμ¬ νμ¬ μ€ν μ€μΈ νλ‘μΈμ€λ₯Ό λ€μ κ°μ§νλλ‘ μ€ν¬λ¦½νΈ μμ |
| κΈ°λ₯ | μ€λͺ | κΈ°λ ν¨κ³Ό |
|---|---|---|
| ELK Stack μ°λ | Elasticsearch, Logstash, Kibanaλ₯Ό μ΄μ©ν λ‘κ·Έ μκ°ν | μ₯μ λ°μ μμΈ λΆμ λ° μ€μκ° λμ보λ μ 곡 |
| MySQL 쿼리 μ±λ₯ λͺ¨λν°λ§ | mysqld_exporterμ Slow Query Log λΆμ | λΉν¨μ¨μ μΈ μΏΌλ¦¬ νμ λ° μ΅μ ν |
| Nginx μν μ κ² API μ°λ | stub_status λͺ¨λμ νμ©νμ¬ Nginx μν μ‘°ν | Active Connections, Request μ²λ¦¬λ λ± λͺ¨λν°λ§ κ°λ₯ |
| Slack μλ μΈλΆν | κ²½κ³ μμ€λ³ μλ (INFO, WARNING, CRITICAL) | μ΄μμμ λΆνμν μλ νΌλ‘λλ₯Ό μ€μ΄κ³ , μ€μν μλλ§ μ¦κ° λμ κ°λ₯ |
| Failover μμ€ν κ΅¬μΆ | μ₯μ λ°μ μ λ°±μ μλ²λ‘ νΈλν½ μλ μ ν | μλΉμ€ μ°μμ± μ μ§ |
| λ°±μ λ° λ³΅κ΅¬ μλν | MySQL λ°μ΄ν° λ°±μ + μ£ΌκΈ°μ μΈ μ€λ μ· μ μ₯ | μ₯μ λ°μ μ μ μν 볡ꡬ κ°λ₯ |





