远程数据库连接必须用ssh隧道:phpstorm通过云服务器ssh(22端口)转发请求至内网127.0.0.1:3306,用户须授权'@localhost',禁用ssl并配置servertimezone=asia/shanghai,驱动版本需匹配云厂商要求。

远程数据库连接必须用 SSH 隧道,别直连 3306
云服务器数据库(如阿里云 RDS、腾讯云 CDB 或自建 MySQL)默认禁止公网直连,直接填 Host 为公网 IP + Port=3306 几乎必然失败。正确路径是走 SSH 隧道:PHPStorm 先连云服务器的 SSH(22 端口),再通过该通道转发本地请求到云服务器内网的数据库端口(通常是 127.0.0.1:3306)。这既绕过安全组限制,又避免暴露数据库端口。
操作要点:
- 确保云服务器已开通 SSH 访问(22 端口在安全组放行,且系统防火墙如
ufw或firewalld也允许) - PHPStorm 中配置数据源时,不填普通 Host/Port,而是勾选 SSH/SSL 选项卡 → 启用
Use SSH config或手动填 SSH 主机信息(Host填云服务器公网 IP,Port填 22,User填能登录系统的账号,如ubuntu或root) - SSH 认证方式优先选
Key pair (OpenSSH),密钥文件路径填你本地的id_rsa(权限必须是600,否则 PHPStorm 拒绝加载) - 隧道目标地址填
127.0.0.1:3306(不是云服务器公网 IP!因为数据库监听的是本地回环)
数据库用户权限必须限定为 localhost,不能开 ‘%’
很多人为了“方便”在云服务器上执行 GRANT ... ON *.* TO 'user'@'%',这是高危操作。SSH 隧道下,数据库看到的客户端 IP 就是 127.0.0.1 或 ::1,所以用户必须显式创建为 'user'@'localhost' 或 'user'@'127.0.0.1',否则 Access denied。
正确授权步骤(在云服务器上执行):
- 登录 MySQL:
mysql -u root -p - 创建用户(注意引号和主机名):
CREATE USER 'dev'@'localhost' IDENTIFIED BY 'StrongPass123!'; - 授库权限:
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp_db.* TO 'dev'@'localhost'; - 刷新权限:
FLUSH PRIVILEGES; - 验证:
SELECT host, user FROM mysql.user WHERE user = 'dev';—— 结果必须含localhost
驱动与 SSL 设置要匹配云服务商要求
主流云数据库(如阿里云 PolarDB、腾讯云 CDB)强制开启 SSL 连接,但 PHPStorm 的 SSH 隧道本身已加密,数据库层再启 SSL 属于冗余且易出错。实际应关闭数据库连接的 SSL 选项,除非你明确需要双向证书校验。
常见错误现象:
-
Public Key Retrieval is not allowed:在数据源的Advanced选项卡里,添加参数allowPublicKeyRetrieval=true&useSSL=false -
Could not create connection to database server:检查驱动版本 —— PHPStorm 2023.3+ 自带 MySQL Connector/J 8.0+,但云厂商可能要求降级到 5.1(如部分老 RDS 实例),此时需手动下载mysql-connector-java-5.1.49.jar并在数据源设置中点击Driver Files→+添加 - 时区错乱(时间字段全成 UTC):在
Advanced里加参数serverTimezone=Asia/Shanghai
连接测试失败时,先确认三件事
别急着重配,90% 的问题出在这三个环节:
- SSH 能通吗?终端执行:
ssh -i ~/.ssh/id_rsa ubuntu@your-server-ip—— 连不上就查密钥权限、云安全组、sshd_config是否禁用了密码或密钥登录 - 数据库在云服务器本地能连吗?SSH 登上去后执行:
mysql -u dev -p -h 127.0.0.1 -P 3306 myapp_db—— 连不上说明用户没建对、密码错、或 MySQL 没监听127.0.0.1(检查bind-address配置) - PHPStorm 日志有没有线索?菜单
Help → Show Log in Explorer,搜SSH或MySQL,常能看到具体拒绝原因(比如密钥格式不支持、认证方法不匹配)
最易被忽略的是:云服务器上的 MySQL 默认只监听 127.0.0.1,而 SSH 隧道依赖它;但如果你改过 bind-address 为 0.0.0.0,反而会因权限策略导致连接被拒 —— 它本就不该对外监听。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











