无法从 Linux 上的 laravel 连接 azure sql server

ces*_*are 9 php sql-server laravel sqlsrv azure-sql-database

我有一个连接 Azure 上的 sql server db 的 Laravel 应用程序。

在我的本地 Wamp 服务器上,该应用程序工作正常。我已经使用 docker 镜像安装在我的 linux 服务器上,并且没有连接 Azure DB。每次返回此错误消息:

SQLSTATE[HYT00]: [Microsoft][ODBC Driver 17 for SQL Server]Login timeout expired (SQL: select * from [mytable])
Run Code Online (Sandbox Code Playgroud)

MSDOBC 驱动程序、sqlsrv 和 pdo_sqlsrv 已正确安装。

我想这与laravel有关,因为如果我用php脚本查询数据库就没有问题。

我的 .ENV 文件有 db 设置:

DB_CONNECTION=sqlsrv
DB_HOST=db.database.windows.net
DB_PORT=1433
DB_DATABASE=db_name
DB_USERNAME=db_user
DB_PASSWORD=pwd
Run Code Online (Sandbox Code Playgroud)

Laravel log 和 docker log 没什么有趣的,我不知道如何解决。

Zho*_*rov 7

Azure SQL 数据库仅支持表格数据流 (TDS) 协议(可通过 TCP 和默认端口 1433 访问)并使用其自己的基于 IP 的防火墙。因此,您可以尝试以下操作:

  • 使用带有协议、服务器名称和端口的连接字符串。你的情况,你需要使用tcp:db.database.windows.net,1433的值DB_HOST

  • 添加 LINUX 服务器的 IP 地址作为防火墙规则。这在文档中进行了解释:

当计算机尝试从 Internet 连接到您的服务器时,防火墙首先根据连接请求的数据库的数据库级 IP 防火墙规则检查请求的原始 IP 地址。

如果地址在数据库级 IP 防火墙规则中指定的范围内,则连接将授予包含该规则的数据库。

  • 如果地址不在数据库级 IP 防火墙规则的范围内,防火墙会检查服务器级 IP 防火墙规则。

  • 如果地址在服务器级 IP 防火墙规则中的范围内,则连接被授予。服务器级 IP 防火墙规则适用于服务器管理的所有数据库。

  • 如果地址不在任何数据库级或服务器级 IP 防火墙规则的范围内,则连接请求失败