mình có 1 trang web tạo trên nền wordpress connect tới mysql database, mấy ngày nay CPU của database toàn chạy 100% cả dẫn tới wordpress chạy khá chậm, có ai có ý tưởng gì để debug vụ này ko nhỉ, query insight thì mình có.
Lần trước bị nhiễm 1 con bot javascript làm chết cả website. H cũng ko biết có phải do mấy cái javascript này nữa ko
1.
Vì bạn đã có Query Insights, hãy kiểm tra xem có truy vấn nào chạy lâu, chiếm nhiều tài nguyên không. Tìm các truy vấn:
- Chạy lâu (slow queries)
- Lặp lại quá thường xuyên (có thể do cron jobs hoặc bot tấn công)
- Dùng quá nhiều JOIN hoặc thiếu chỉ mục (indexes)
Chạy lệnh này trong MySQL để kiểm tra truy vấn đang chạy:
sql
CopyEdit
<span><span>SHOW</span> PROCESSLIST;<br></span>
Hoặc nếu có quyền admin:
sql
CopyEdit
<span><span>SELECT</span> <span>*</span> <span>FROM</span> INFORMATION_SCHEMA.PROCESSLIST <span>WHERE</span> COMMAND <span>!=</span> <span>'Sleep'</span>;<br></span>
Nếu thấy truy vấn chạy lâu, có thể cần tối ưu hóa bằng cách:
- Thêm indexes vào các bảng
- Dùng EXPLAIN để kiểm tra hiệu suất từng truy vấn
- Giảm số lần truy vấn bằng caching (Redis, WP Super Cache, hoặc Object Cache)
2.
Xem MySQL logs (MySQL slow query log, error log) để xác định xem có lỗi hoặc truy vấn nào chạy chậm không.
- Trên server Linux, check file log:
bash
CopyEdit
<span>sudo <span>tail</span> -f /var/log/mysql/mysql-slow.log<br></span>
- Trong WordPress, bật debug log bằng cách thêm vào wp-config.php:
php
CopyEdit
<span><span>define</span>(<span>'WP_DEBUG'</span>, <span>true</span>);<br><span>define</span>(<span>'WP_DEBUG_LOG'</span>, <span>true</span>);<br><span>define</span>(<span>'WP_DEBUG_DISPLAY'</span>, <span>false</span>);<br>@<span>ini_set</span>(<span>'log_errors'</span>, <span>1</span>);<br>@<span>ini_set</span>(<span>'display_errors'</span>, <span>0</span>);<br>@<span>ini_set</span>(<span>'error_log'</span>, WP_CONTENT_DIR . <span>'/debug.log'</span>);<br></span>
Sau đó kiểm tra file /wp-content/debug.log.
3.
Website từng bị bot làm sập, nên cần kiểm tra xem có dấu hiệu bất thường không:
- Xem access logs của server:
bash
CopyEdit
<span>sudo <span>tail</span> -f /var/log/apache2/access.log <span># Apache</span><br>sudo <span>tail</span> -f /var/log/nginx/access.log <span># Nginx</span><br></span>
Nếu thấy nhiều request bất thường từ cùng một IP, có thể đang bị tấn công bot.
- Kiểm tra cron jobs lạ (nhiều malware tạo cron chạy liên tục):
bash
CopyEdit
<span>crontab -l<br></span>
- Quét malware trên WordPress với plugin như:
- Wordfence
- Sucuri Security
- Anti-Malware Security
Nếu có file lạ, bạn có thể dùng lệnh này để tìm file bị sửa gần đây:
bash
CopyEdit
<span>find /var/www/html -<span>type</span> f -mtime -7<br></span>
4.
- Tắt toàn bộ plugin và bật từng cái một để xem plugin nào gây tải cao.
- Kiểm tra trong /wp-content/plugins/ có plugin nào lạ hoặc update gần đây không.
- Kiểm tra trong /wp-content/themes/ xem có theme nào bị sửa đổi hoặc chèn mã độc không.
5.
Nếu website có quá nhiều request làm MySQL quá tải, có thể giới hạn kết nối:
Thêm vào my.cnf:
ini
CopyEdit
<span><span>[mysqld]</span><br><span>max_connections</span> = <span>200</span><br><span>wait_timeout</span> = <span>60</span><br></span>
Hoặc tăng cache của MySQL bằng cách điều chỉnh:
ini
CopyEdit
<span><span>query_cache_size</span>=<span>64</span>M<br><span>query_cache_type</span>=<span>1</span><br></span>
Sau đó restart MySQL:
bash
CopyEdit
<span>sudo systemctl restart mysql<br></span>
6.
Dùng plugin cache như
WP Rocket, W3 Total Cache, hoặc bật Object Cache (Redis, Memcached) để giảm tải MySQL. Nếu có Cloudflare, hãy bật cache page để giảm truy vấn đến MySQL.
7.
Nếu bot spam request, có thể bật Cloudflare hoặc firewall để chặn bot.
- Check IP tấn côngbằng lệnh:
bash
CopyEdit
<span>netstat -anp | grep :80 | awk <span>'{print $5}'</span> | <span>cut</span> -d: -f1 | <span>sort</span> | <span>uniq</span> -c | <span>sort</span> -nr | <span>head</span> -20<br></span>
- Chặn IP đáng ngờbằng fail2ban hoặc firewall:
bash
CopyEdit
<span>sudo iptables -A INPUT -s 192.168.1.1 -j DROP<br></span>