如何在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服务器):
- 创建服务文件
/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
- 重新加载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
相关产品推荐
相关产品推荐

