When a site is slow, unreachable, or returning errors, a structured troubleshooting approach saves time and prevents unnecessary changes. This guide walks through the checks SerVee IT engineers use first on Linux web servers running Apache or NGINX with PHP and MySQL/MariaDB.
Confirm the Symptom
Before changing configuration, document exactly what fails: browser error code, affected URLs, whether the issue is global or limited to one domain, and when it started. Test from more than one network (mobile data vs office Wi‑Fi) to rule out local DNS or ISP problems.
Check HTTP Status and Response
From your workstation or the server, request the site and inspect headers and body:
curl -I https://example.com
curl -sS -o /dev/null -w "%{http_code} %{time_total}\n" https://example.com/Compare HTTP vs HTTPS. A redirect loop often shows as 301/302 chains; a dead backend may return 502 or 504. See the MDN HTTP status reference for code meanings.
Verify DNS and Connectivity
Confirm the domain resolves to the expected IP and that ports 80 and 443 are reachable:
dig +short example.com A
dig +short www.example.com A
nc -zv YOUR_SERVER_IP 443If DNS is wrong, fix records at your registrar or DNS provider (e.g. Cloudflare DNS) before debugging the web stack.
Check Web Service Status
On the server, confirm the web server and PHP-FPM (if used) are running:
# Apache (RHEL/Alma/Rocky/CentOS-style)
sudo systemctl status httpd
# NGINX
sudo systemctl status nginx
# PHP-FPM (version may vary)
sudo systemctl status php-fpmRestart only after identifying a clear failure; document the prior state. Official references: Apache HTTP Server documentation, NGINX documentation.
systemctl reload httpd or nginx -s reload).
Review Error Logs
Logs usually pinpoint the failing layer. Typical locations:
- Apache:
/var/log/httpd/error_logor/var/log/apache2/error.log - NGINX:
/var/log/nginx/error.log - PHP-FPM:
/var/log/php-fpm/www-error.log(path varies by distro) - MySQL/MariaDB:
/var/log/mysqld.logor journal viajournalctl -u mysqld
sudo tail -n 100 /var/log/nginx/error.log
sudo journalctl -u php-fpm --since "1 hour ago" --no-pagerDisk, Memory, and Load
Full disks and exhausted memory cause 500 errors, failed uploads, and database crashes:
df -h
free -h
uptime
dmesg | tail -n 20Clear old logs and temporary files only after confirming they are safe to remove. Rotate logs via logrotate rather than deleting active files held open by daemons.
wp-content/debug.log or backup plugin folders are frequent causes of full partitions.
Database and Application Layer
For CMS sites, verify database connectivity and credentials in the application config. On WordPress, a white screen often ties to PHP fatal errors—enable logging without displaying errors to visitors (see our WordPress debugging guide).
mysql -u DB_USER -p -e "SELECT 1;"
mysql -u DB_USER -p DB_NAME -e "SHOW TABLES LIMIT 5;"SSL and Firewall
Certificate expiry and firewall rules block HTTPS and admin ports:
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates
sudo firewall-cmd --list-all 2>/dev/null || sudo iptables -L -nRenew certificates via your ACME client or control panel before they expire. Let's Encrypt documentation covers automated renewal.
Recent Changes
Correlate the incident with deployments: DNS updates, PHP version changes, plugin updates, .htaccess edits, or firewall changes. Roll back one change at a time and retest.
Summary
Effective server troubleshooting starts with a clear symptom, then validates DNS, service health, logs, resources, database connectivity, and SSL. Work top-down from the network to the application, change one variable at a time, and keep notes for post-incident review. SerVee IT clients with managed support can open a ticket with curl output, log excerpts, and timestamps to speed resolution.