Debug School

rakesh kumar
rakesh kumar

Posted on

How to Fix MySQL Error 2002: Connection Timed Out While Connecting Laravel to traccar MariaDB

Traccar MariaDB Connection Timeout Troubleshooting Summary

  1. Commands to check connection timeout from Laravel server

Run these commands on your Laravel server.

Check ping

ping 13.126.68.234
Enter fullscreen mode Exit fullscreen mode

Stop ping using:

CTRL + C
Enter fullscreen mode Exit fullscreen mode

Note: Ping can fail if ICMP is blocked. So ping is not the final test.

Check MySQL port 3306 on public IP

nc -vz 13.126.68.234 3306
Enter fullscreen mode Exit fullscreen mode

Check MySQL port 3306 on private IP

nc -vz 172.31.34.212 3306
Enter fullscreen mode Exit fullscreen mode

If nc command is missing

sudo apt update
sudo apt install netcat-openbsd -y
Enter fullscreen mode Exit fullscreen mode

Test MySQL login from Laravel server

mysql -h 172.31.34.212 -P 3306 -u traccar -p traccar
Enter fullscreen mode Exit fullscreen mode

or public IP test:

mysql -h 13.126.68.234 -P 3306 -u traccar -p traccar
Enter fullscreen mode Exit fullscreen mode

After login:

SHOW TABLES;
Enter fullscreen mode Exit fullscreen mode
  1. Meaning of timeout

You received:

nc: connect to 172.31.34.212 port 3306 (tcp) failed: Connection timed out

This means:

Laravel server cannot reach Traccar DB server on port 3306.

Since MariaDB is already listening on:

0.0.0.0:3306

the problem is mostly:

AWS Security Group
UFW firewall
iptables firewall
Network ACL
Different VPC/routing issue

  1. Commands to check MariaDB on Traccar server

Run these commands on the Traccar DB server.

Check MariaDB is listening on 3306

sudo ss -tulnp | grep 3306
Enter fullscreen mode Exit fullscreen mode

Expected output:

0.0.0.0:3306
Enter fullscreen mode Exit fullscreen mode

Your output is already correct.

Check MariaDB service status
sudo systemctl status mariadb

or:

sudo systemctl status mysql
Restart MariaDB if needed
sudo systemctl restart mariadb

or:

sudo systemctl restart mysql

  1. Commands to resolve firewall issue on Traccar server

Run on Traccar DB server.

Check UFW status

sudo ufw status
Enter fullscreen mode Exit fullscreen mode

Allow Laravel server private IP

sudo ufw allow from 172.31.6.53 to any port 3306
Enter fullscreen mode Exit fullscreen mode
sudo ufw reload
Enter fullscreen mode Exit fullscreen mode

Check UFW again
sudo ufw status numbered

  1. Commands to check iptables on Traccar server
sudo iptables -L -n
Enter fullscreen mode Exit fullscreen mode

Check only MySQL related rules:

sudo iptables -L -n | grep 3306
Enter fullscreen mode Exit fullscreen mode

Check if any DROP rule exists:

sudo iptables -L -n | grep DROP
Enter fullscreen mode Exit fullscreen mode

Temporary allow rule for testing:

sudo iptables -I INPUT -p tcp -s 172.31.6.53 --dport 3306 -j ACCEPT
Enter fullscreen mode Exit fullscreen mode

Then test again from Laravel server:

nc -vz 172.31.34.212 3306
Enter fullscreen mode Exit fullscreen mode
  1. AWS Security Group rule to add

In AWS Console, go to:

EC2 > Traccar Server > Security > Security Group > Inbound Rules

Add this inbound rule:

Type: MySQL/Aurora
Protocol: TCP
Port: 3306
Source: 172.31.6.53/32
Enter fullscreen mode Exit fullscreen mode

Better option:

Source: Laravel server Security Group ID

Do not open MySQL to:

0.0.0.0/0
Enter fullscreen mode Exit fullscreen mode
  1. DB user permission commands

Run on Traccar DB server.

mysql -u root -p

Check existing Traccar user:

SELECT user, host FROM mysql.user WHERE user='traccar';

Create user for Laravel private IP:

CREATE USER 'traccar'@'172.31.6.53' IDENTIFIED BY 'NEW_STRONG_PASSWORD';
Enter fullscreen mode Exit fullscreen mode

Read-only permission:

GRANT SELECT ON traccar.* TO 'traccar'@'172.31.6.53';
FLUSH PRIVILEGES;
Enter fullscreen mode Exit fullscreen mode

Read/write permission if needed:

GRANT SELECT, INSERT, UPDATE, DELETE ON traccar.* TO 'traccar'@'172.31.6.53';
FLUSH PRIVILEGES;
Enter fullscreen mode Exit fullscreen mode

Check grants:

SHOW GRANTS FOR 'traccar'@'172.31.6.53';
Enter fullscreen mode Exit fullscreen mode
  1. Final testing commands

Run on Laravel server after firewall/AWS fix.

Test port

nc -vz 172.31.34.212 3306
Enter fullscreen mode Exit fullscreen mode

Expected output:

Connection to 172.31.34.212 3306 port [tcp/mysql] succeeded
Enter fullscreen mode Exit fullscreen mode

Test MySQL login

mysql -h 172.31.34.212 -P 3306 -u traccar -p traccar
Enter fullscreen mode Exit fullscreen mode

Inside MySQL:

SHOW TABLES;

  1. Laravel .env update

Use private IP:

TRACCAR_DB_HOST=172.31.34.212
TRACCAR_DB_PORT=3306
TRACCAR_DB_DATABASE=traccar
TRACCAR_DB_USERNAME=traccar
TRACCAR_DB_PASSWORD=NEW_STRONG_PASSWORD
Enter fullscreen mode Exit fullscreen mode

Then clear Laravel cache:

php artisan config:clear
php artisan cache:clear
Enter fullscreen mode Exit fullscreen mode

Test in Laravel:

php artisan tinker
Enter fullscreen mode Exit fullscreen mode

Inside tinker:

DB::connection('mysqlTraccar')->select('SHOW TABLES');

  1. Best final setup

Use this:

Laravel Server Private IP: 172.31.6.53
Traccar DB Server Private IP: 172.31.34.212
MariaDB Port: 3306
Connection: Private AWS network
Enter fullscreen mode Exit fullscreen mode

Most important fix:

Allow inbound MySQL/Aurora port 3306 in Traccar server AWS Security Group from 172.31.6.53/32.

chatgptlink

Top comments (0)