Skip to main content

Having trouble with your server? Our support team is here to help.

Discover our plans

Common Errors by Service

This guide lists the most common errors and their solutions for each service.

Nginx

502 Bad Gateway

Cause: The backend (PHP-FPM, Node.js, etc.) is not responding.

# Check PHP-FPM
systemctl status php8.1-fpm

# Check logs
tail -50 /var/log/nginx/error.log

Solutions:

# Restart PHP-FPM
sudo systemctl restart php8.1-fpm

# Check the socket
ls -la /run/php/php8.1-fpm.sock

504 Gateway Timeout

Cause: The backend takes too long to respond.

Solutions:

# In nginx.conf or location block
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;

# For PHP-FPM
fastcgi_read_timeout 300;

403 Forbidden

Cause: Permission or configuration issue.

# Check permissions
ls -la /var/www/html/

# Fix
sudo chown -R www-data:www-data /var/www/html
sudo chmod -R 755 /var/www/html

Check Nginx config:

location / {
index index.html index.php;
try_files $uri $uri/ =404;
}

413 Request Entity Too Large

Cause: Uploaded file too large.

# In nginx.conf
client_max_body_size 100M;

Invalid Configuration

# Test configuration
sudo nginx -t

# See detailed error
sudo nginx -T

Apache

AH00558: Could not reliably determine the server's fully qualified domain name

sudo nano /etc/apache2/apache2.conf

Add:

ServerName localhost

AH01630: client denied by server configuration

Cause: Missing Require directive.

<Directory /var/www/html>
Require all granted
</Directory>

AH01071: Got error 'Primary script unknown'

Cause: PHP-FPM can't find the file.

# Check file exists
ls -la /var/www/html/index.php

# Check PHP-FPM config
cat /etc/php/8.1/fpm/pool.d/www.conf | grep "listen ="

PHP-FPM

Unable to open primary script

# Check permissions
sudo chown -R www-data:www-data /var/www/

# Check pool is listening
ss -ln | grep php

Max children reached

Cause: Too many simultaneous requests.

sudo nano /etc/php/8.1/fpm/pool.d/www.conf
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20

Allowed memory size exhausted

sudo nano /etc/php/8.1/fpm/php.ini
memory_limit = 256M
sudo systemctl restart php8.1-fpm

MySQL / MariaDB

Access denied for user

# Connect as root
sudo mysql

# Create/modify user
ALTER USER 'user'@'localhost' IDENTIFIED BY 'new_password';
FLUSH PRIVILEGES;

Too many connections

# View current connections
sudo mysql -e "SHOW PROCESSLIST;"

# Kill sleeping connections
sudo mysql -e "SELECT CONCAT('KILL ', id, ';') FROM information_schema.processlist WHERE command = 'Sleep' AND time > 300;"

Increase limit:

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
max_connections = 200

Table is marked as crashed

# Repair a table
mysqlcheck -r database_name table_name -u root -p

# Repair all tables
mysqlcheck --repair --all-databases -u root -p

InnoDB: Unable to lock ./ibdata1

Cause: Multiple MySQL instances or crash.

# Check processes
ps aux | grep mysql

# Kill and restart properly
sudo systemctl stop mysql
sudo killall -9 mysqld
sudo systemctl start mysql

Can't connect to local MySQL server through socket

# Check MySQL is running
systemctl status mysql

# Check socket
ls -la /var/run/mysqld/mysqld.sock

# Restart
sudo systemctl restart mysql

Node.js

EADDRINUSE: address already in use

Cause: Port is already in use.

# Find the process
sudo lsof -i :3000
sudo ss -tlnp | grep 3000

# Kill the process
kill -9 PID

ENOMEM: not enough memory

Solutions:

# Increase swap
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# Limit Node RAM
node --max-old-space-size=512 app.js

EACCES: permission denied

# Avoid running as root
# Use port > 1024 or configure capabilities
sudo setcap 'cap_net_bind_service=+ep' $(which node)

Docker

Cannot connect to the Docker daemon

# Check service
sudo systemctl status docker
sudo systemctl start docker

# Check permissions
sudo usermod -aG docker $USER
# Log out and log back in

No space left on device

# Clean Docker
docker system prune -af
docker volume prune -f

# Check space
df -h

Container keeps restarting

# View logs
docker logs --tail 100 container_name

# Inspect
docker inspect container_name | grep -A 10 "State"

Port already allocated

# Find container using the port
docker ps | grep PORT

# Or find host process
sudo lsof -i :PORT

SSH

Connection refused

# Check service
sudo systemctl status sshd

# Check port
sudo ss -tlnp | grep ssh

# Check firewall
sudo ufw status

Permission denied (publickey)

# Check permissions
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/id_*

# Check owner
chown -R $USER:$USER ~/.ssh

Host key verification failed

# Remove old key
ssh-keygen -R SERVER_IP

Fail2ban

ERROR: NOK: ('sshd',)

# Check syntax
sudo fail2ban-client -d

# Check filters
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf

Unable to find a corresponding IP address

# Check backend
sudo nano /etc/fail2ban/jail.local
[DEFAULT]
backend = systemd
# or
backend = auto

Let's Encrypt / Certbot

Challenge failed

# Check port 80 is open
sudo ufw allow 80/tcp

# Check .well-known is accessible
curl http://yourdomain.com/.well-known/acme-challenge/test

Nginx configuration:

location /.well-known/acme-challenge/ {
root /var/www/html;
}

Too many certificates already issued

Wait for rate limit to end (1 week) or use staging:

sudo certbot certonly --staging -d yourdomain.com

UFW Firewall

ERROR: Could not find a profile matching

# List available profiles
sudo ufw app list

# Use port directly
sudo ufw allow 22/tcp
# instead of
sudo ufw allow OpenSSH

UFW not blocking

# Check rule order
sudo ufw status numbered

# Rules are evaluated in order
# An allow rule first blocks subsequent deny rules

Universal Diagnostic Commands

# Recent system logs
sudo journalctl -xe

# Service logs
sudo journalctl -u service_name -n 100

# Last system errors
dmesg | tail -50

# All failed services
systemctl --failed
Tip

Always check logs first:

  • /var/log/syslog: System logs
  • /var/log/nginx/error.log: Nginx
  • /var/log/apache2/error.log: Apache
  • /var/log/mysql/error.log: MySQL
  • journalctl -u service: systemd service