You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Laravel中配置并维持远程数据库连接

解决Laravel连接远程数据库的SSH隧道持久化及.env配置问题

首先先帮你理清.env文件的正确配置方式——当你通过SSH隧道转发端口后,Laravel其实是连接到本地的转发端口,所以你的.env数据库配置应该是这样的:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1  # 注意用127.0.0.1而不是localhost,避免走Unix socket
DB_PORT=3307       # 对应你SSH隧道转发的本地端口
DB_DATABASE=你的远程数据库名
DB_USERNAME=远程数据库的用户名
DB_PASSWORD=远程数据库的密码

接下来重点解决SSH隧道一天后过期的问题,给你几个靠谱的方案:

方案1:通过SSH配置文件维持持久连接

你可以在本地用户的~/.ssh/config文件里添加专门的隧道配置,让SSH自动发送心跳包防止连接断开:

Host remote-db-tunnel
    HostName remotehost.com
    User myuser
    LocalForward 3307 127.0.0.1:3306
    ServerAliveInterval 60  # 每隔60秒发送一次存活信号
    ServerAliveCountMax 3   # 连续3次没收到回应才断开(默认是3,可根据需要调整)
    ExitOnForwardFailure yes  # 如果端口转发失败就退出,避免无效连接

配置好后,只需要执行这条命令启动隧道:

ssh remote-db-tunnel -fN

这样SSH会在后台运行,并且定期发送心跳,大幅降低连接自动断开的概率。

方案2:将SSH隧道做成系统服务(彻底解决断开问题)

如果希望隧道能开机自动启动,并且断开后自动重启,推荐把它做成systemd服务(适用于Linux服务器):

  1. 创建服务文件/etc/systemd/system/ssh-db-tunnel.service,内容如下:
[Unit]
Description=SSH Tunnel for Remote MySQL Database
After=network.target

[Service]
User=你的Laravel应用运行用户  # 比如www-data或者你的登录用户
ExecStart=/usr/bin/ssh -N remote-db-tunnel
Restart=always  # 服务意外终止时自动重启
RestartSec=10   # 重启前等待10秒
StandardOutput=journal+console

[Install]
WantedBy=multi-user.target
  1. 重新加载systemd配置并启动服务:
sudo systemctl daemon-reload
sudo systemctl enable ssh-db-tunnel  # 设置开机自启
sudo systemctl start ssh-db-tunnel

之后你可以用systemctl status ssh-db-tunnel查看隧道状态,就算服务器重启或者连接意外断开,systemd都会自动帮你恢复隧道。

额外注意事项

  • 确保远程服务器的SSH配置允许持久连接:检查远程服务器的/etc/ssh/sshd_config,确认ClientAliveInterval和ClientAliveCountMax没有设置过短(默认值一般足够)。
  • 确认本地的3307端口没有被其他程序占用,可以用lsof -i :3307检查。
  • 远程MySQL的bind-address设置为127.0.0.1是没问题的,因为隧道是在远程服务器本地转发到MySQL端口,不需要修改成允许外部连接。

内容的提问来源于stack exchange,提问作者Adam Kozlowski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:19:57