如何通过SSH隧道连接Laravel与远程PostgreSQL数据库?是否有可用包?
通过SSH隧道实现Laravel连接远程PostgreSQL的方法及相关扩展
一、手动建立SSH隧道并配置Laravel
1. 创建本地SSH端口转发
运行以下命令,将本地端口转发到远程PostgreSQL服务端口(示例中本地用5433,避免与本地PostgreSQL默认的5432冲突):
ssh -L 5433:localhost:5432 ssh_user@remote_server_ip -p ssh_port
参数说明:
-L:指定本地端口转发规则,格式为本地端口:远程数据库主机:远程数据库端口ssh_user@remote_server_ip:远程SSH服务器的用户名和IP-p ssh_port:远程SSH端口,默认22可省略
如需后台运行隧道,添加-fN参数:
ssh -fN -L 5433:localhost:5432 ssh_user@remote_server_ip
2. 配置Laravel数据库连接
修改项目根目录下的.env文件,更新PostgreSQL配置:
DB_CONNECTION=pgsql DB_HOST=127.0.0.1 DB_PORT=5433 DB_DATABASE=your_remote_db_name DB_USERNAME=remote_db_user DB_PASSWORD=remote_db_password
同步config/database.php中的pgsql连接配置(确保与.env一致):
'pgsql' => [ 'driver' => 'pgsql', 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '5433'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'prefix' => '', 'prefix_indexes' => true, 'search_path' => 'public', 'sslmode' => 'prefer', ],
测试连接:执行php artisan migrate:status或编写简单查询脚本验证是否能正常访问远程数据库。
二、自动管理SSH隧道的Laravel扩展包
无需手动执行SSH命令,直接通过Laravel配置即可完成带SSH隧道的数据库连接,推荐以下扩展:
1. laravel-ssh-database
该扩展支持在数据库配置中直接嵌入SSH参数,自动建立隧道。配置示例:
'pgsql' => [ // ... 原有数据库配置 'ssh' => [ 'host' => 'remote_server_ip', 'port' => 22, 'username' => 'ssh_user', 'password' => 'ssh_password', // 可选,密钥登录时可省略 'key' => storage_path('id_rsa'), // 密钥文件路径,优先于密码登录 ], ],
配置完成后,Laravel会在初始化数据库连接时自动创建并维护SSH隧道。
2. spatie/laravel-ssh(自定义场景)
若需要更灵活的SSH控制(比如预执行命令、多隧道管理),可使用该包配合自定义逻辑实现。例如在服务提供者中监听数据库连接事件,先建立隧道再初始化数据库连接,适合有定制需求的场景。
注意事项
- 确保远程SSH服务器端口对外开放,本地机器可正常访问该服务器
- 使用密钥登录时,需确保密钥文件权限为
600,避免SSH连接失败 - 安装扩展时需匹配Laravel版本,优先选择维护状态活跃的包版本
内容的提问来源于stack exchange,提问作者Yogendra - eCommerce Developer
相关产品推荐
相关产品推荐

