Laravel (Lumen) 连接到同一网络上另一台服务器上的数据库

Laravel (Lumen) connect to database on another server on same network

我在一台服务器上有一个 Laravel 项目,在另一台服务器上有一个 Laravel Lumen 8 项目,它们都是虚拟机并且是彼此的克隆所以具有相同的硬件和 OS.

我有一个域,为了这个 Whosebug 的目的,我们称之为 foo.com,它通过 Cloudflare,两台服务器都是 ipv6 服务器,当通过 ssh 相互 ping 时,它们可以看到对方很好。

我遇到的问题是从另一台服务器上的 Lumen 项目连接到 MySQL (Maria DB) 数据库。

我试过使用:

我正在使用 Tinker 和 运行:

测试连接
DB::connection()->getPdo();

由于某种原因我无法连接,这些是我遇到的组合和错误,想知道我遗漏了什么:

尝试 1

DB_CONNECTION=mysql
DB_HOST=local ipv4
DB_PORT=3306
DB_DATABASE=my_db
DB_USERNAME=user
DB_PASSWORD=pass

PDOException with message 'SQLSTATE[HY000] [2002] No route to host

尝试 2

DB_CONNECTION=mysql
DB_HOST=ipv6 address
DB_PORT=3306
DB_DATABASE=my_db
DB_USERNAME=user
DB_PASSWORD=pass

PDOException with message 'SQLSTATE[HY000] [2002] Invalid argument'

尝试 3

DB_CONNECTION=mysql
DB_HOST=api.foo.com
DB_PORT=3306
DB_DATABASE=my_db
DB_USERNAME=user
DB_PASSWORD=pass

PDOException with message 'SQLSTATE[HY000] [2002] Connection timed out'

如何让我的 Lumen 项目连接到我在另一台服务器上的 Laravel 数据库,我很确定我已经尝试了这里的所有组合。

键入 VM 数据库的本地 IPv4。 (您可以尝试相互 ping 一台虚拟机,以确保虚拟机之间的连接正常)

我找到原因了。在 DB_HOST 的开头和结尾缺少方括号,例如:

DB_HOST=[my ipv6]

要在单独的服务器上连接 MySQL 数据库,我们必须检查以下内容:

  1. 两台服务器可以通过 ping 或 ssh 访问。
  2. MySQL可以监听专用VM或服务器的IP。
  3. Laravel或Lumen可以访问服务器IP地址

在这个答案中,我们假设网络是 192.168.1.0/24。 Lumen 服务器是 192.168.1.1 的服务器 A。 MySQL 服务器是 192.168.1.2 的服务器 B。

在我的配置中,我检查了两台服务器可以通过 ping 访问:

ping -c 4 192.168.1.2

服务器必须响应。

PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.399 ms
64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.412 ms
64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=0.352 ms
64 bytes from 192.168.1.2: icmp_seq=4 ttl=64 time=0.409 ms

--- 192.168.1.2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3057ms
rtt min/avg/max/mdev = 0.352/0.393/0.412/0.024 ms

对于 IPv6,使用 ping 6

ping6 -c 4 abcd:abcd:abcd:abcd:abcd:abcd:abcd:abcd

结果类似于 IPv4,

PING abcd:abcd:abcd:abcd:abcd:abcd:abcd:abcd(abcd:abcd:abcd:abcd:abcd:abcd:abcd:abcd) 56 data bytes
64 bytes from abcd:abcd:abcd:abcd:abcd:abcd:abcd:abcd: icmp_seq=1 ttl=61 time=0.421 ms
64 bytes from abcd:abcd:abcd:abcd:abcd:abcd:abcd:abcd: icmp_seq=2 ttl=61 time=0.333 ms
64 bytes from abcd:abcd:abcd:abcd:abcd:abcd:abcd:abcd: icmp_seq=3 ttl=61 time=0.388 ms
64 bytes from abcd:abcd:abcd:abcd:abcd:abcd:abcd:abcd: icmp_seq=4 ttl=61 time=0.324 ms

--- 2001:19f0:5:241:a315:602c:64ce:d6c1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4096ms
rtt min/avg/max/mdev = 0.324/0.368/0.421/0.035 ms

如果结果不是这样,请确保您有连接或相同的网络。数字将根据实际结果进行更改。如果失败,请使用以下命令尝试 ssh:

ssh user@192.168.1.2
ssh user@[abcd:abcd:abcd:abcd:abcd:abcd:abcd:abcd]

如果您的服务器 B 无法通过 ssh 或 ping 访问,则说明您的服务器连接存在问题。

  1. 如果这两个能ping通,就可以确定你的MySQL服务器正在监听服务器的IP地址。您可以检查使用:

#IPv4

nmap -sT -O 192.168.1.2

#IPv6

nmap -sT -O -6 abcd:abcd:abcd:abcd:abcd:abcd:abcd:abcd

结果将显示为:

Starting Nmap 7.92 ( https://nmap.org ) at 2022-02-11 10:04 EST
Nmap scan report for 192.168.1.2
Host is up (0.00036s latency).
Not shown: 998 closed tcp ports (conn-refused)
PORT     STATE SERVICE
3306/tcp open  mysql
MAC Address: AA:BB:CC:DD:EE:FF (Unknown)
Device type: general purpose
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 4.15 - 5.6
Network Distance: 1 hop

OS detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 1.45 seconds

检查会话

PORT     STATE SERVICE
3306/tcp open  mysql

如果是监听,MySQL就是监听端口。否则,请更改 mysql 配置中的以下内容。我的是 /etc/mysql/my.cnf.

port          = 3306
#ipv4
bind-address  = 192.168.1.2
#ipv6
bind-address  = abcd:abcd:abcd:abcd:abcd:abcd:abcd:abcd

注意:编辑配置需要 sudo 或 root 权限

更改并重新启动服务器后,请再次检查 nmap 以确保您的数据库服务器开始侦听。请确保防火墙已关闭以进行测试。

要禁用临时,sudo service firewalld stop 并重试。请参考您的发行版防火墙服务。 LumenMySQL 服务器都应出于测试原因而禁用。 不推荐用于生产服务器。

如果第 1 步和第 2 步运行良好。尝试使用 Laravel Tinker 或 mysql 客户端访问服务器。

mysql -h 192.168.1.2 -u root -p password

如果不是socks not found,如access denied,请参考MySQL或Mariadb手册

如果成功,请在您的 Laravel/Lumen 项目中设置您的 .env 文件。

#IPv4
DB_HOST=192.168.1.2
#IPv6
DB_HOST=[2001:19f0:5:241:a315:602c:64ce:d6c1]
DB_PORT=3306

希望对您有所帮助。在 Mariadb 工作过。