Azure Web应用部署:Python Flask应用中SQL Server连接的SQLAlchemy操作错误

0 投票
1 回答
73 浏览
提问于 2025-04-12 15:39

我第一次将一个Python Flask应用程序部署到Azure(免费版)。这个Flask应用程序通过SQLAlchemy连接到一个SQL Server数据库。连接数据库和表的过程是在网站加载时进行的。在本地运行时,这一切都很顺利。但是,当我把应用程序部署到Azure Web App时,尝试连接SQL Server时遇到了连接超时的问题。应用程序出现了一个操作错误,提示登录超时。下面是错误的详细信息:

Traceback (most recent call last):
  File "/tmp/8dc4e3d6e3306fa/antenv/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 145, in __init__
    self._dbapi_connection = engine.raw_connection()
  ...
pyodbc.OperationalError: ('HYT00', '[HYT00] [Microsoft][ODBC Driver 17 for SQL Server]Login timeout expired (0) (SQLDriverConnect)')

这个问题只在应用程序部署到Azure时出现,而在本地运行时没有问题。以下是一些关于环境和配置的具体信息:

环境:Azure Web App
数据库:SQL Server
连接方式:使用pyodbc作为驱动的SQLAlchemy
requirements.txt文件中的依赖版本:

  • cnos-connector==0.1.9
  • pyodbc==5.1.0
  • SQLAlchemy==2.0.28
    错误:登录超时

我确认应用程序在本地环境中能够成功连接到数据库,所以这似乎是一个特定于Azure部署的问题。

这是我在应用程序中设置SQLAlchemy引擎的方式:

user = os.environ["User_Name"]
password = os.environ["Password"]
hostName = os.environ["hostName"]
port = os.environ["port"]
db = os.environ["database"]
db_context = os.environ["context"]

# Establishing the database connection URI
database_uri = f"mssql+pyodbc://{user}:{password}@{hostName}:{port}/{db}?driver=ODBC+Driver+17+for+SQL+Server"
engine = create_engine(database_uri)

环境变量都拼写正确,并且已经在Azure Web App的应用设置中正确添加为环境变量。

我尝试增加连接超时参数(虽然我可以尝试更大的数字)。在本地运行时,由于数据库连接和查询的原因,Flask应用程序的加载大约需要20到35秒。为了提供更多上下文信息,这里是用于Flask应用程序的启动命令:

gunicorn --bind=0.0.0.0 --timeout 600 app:app

我检查并确认应用程序在本地运行良好,并且环境变量名称与我在Azure Web App仪表板上写的完全匹配。我没有尝试在Web App仪表板中添加连接字符串,因为我认为这没有帮助,因为应用程序在本地运行得很好。此外,SQL Server对我和其他人来说都运行得很顺利。

更新:

  • 我已经为Web App添加了VNet集成,它应该能够与SQL Server正常通信,但我仍然遇到相同的错误。我确认环境变量是正确的(都是大写),并且我在代码中使用os.environ['var1']来获取它们。网站必须在页面加载时连接到SQL数据库/服务器(页面必须加载一个参数,以便将来传递给数据库的查询),所以我还在环境变量中设置了连接字符串的所有环境变量作为部署槽设置。如果缺少参数,应用程序会重定向到一个默认页面。

此外,这是最新的错误日志:

2024-03-29T13:31:08.492306143Z [2024-03-29 13:31:08 +0000] [78] [INFO] Starting gunicorn 21.2.0

2024-03-29T13:31:08.494285752Z [2024-03-29 13:31:08 +0000] [78] [INFO] 正在监听:http://0.0.0.0:8000 (78)
2024-03-29T13:31:08.495537458Z [2024-03-29 13:31:08 +0000] [78] [INFO] 使用的工作进程:同步
2024-03-29T13:31:08.513749140Z [2024-03-29 13:31:08 +0000] [79] [INFO] 启动工作进程,进程ID:79

2024-03-29T13:40:20.623Z 错误 - 站点remi2的容器remi2_1_322f8881在预期时间限制内未启动。经过时间 = 600.4550416秒
2024-03-29T13:40:20.631Z 错误 - 容器remi2_1_322f8881在端口1433上未响应HTTP ping,导致站点启动失败。请查看容器日志以进行调试。
2024-03-29T13:40:20.675Z 信息 - 停止站点remi2,因为它在启动过程中失败。

我还是个初学者,所以不知道该怎么办。我将Web App的启动时间从230秒增加到600秒,但仍然超时。

1 个回答

暂无回答

撰写回答