我有一个在 Alma Linux 上运行的 apache 服务器。我有 Flask 代码设置来接受来自远程连接的 API 调用。所以我的 API 调用命中了 Flask,然后它连接到 MySQL 数据库。
当我尝试在服务器内部本地运行此数据库连接代码时,它工作正常。但是当我尝试通过远程 API 调用来访问 Flask 应用程序时,我得到了
Database error: 2003 (HY000): Can't connect to MySQL server on 'localhost:3306' (13)
这很奇怪,因为我可以在服务器内部本地连接到数据库。
我还写了一个虚拟端点。
@app.route('/')
def test_endpoint():
return 'Hello World'
此端点通过远程 API 调用工作。
我的连接数据库的代码
import mysql.connector
from flask import Flask
app = Flask(__name__)
df_config = {connection parameters}
@app.route('/db_test', methods=['GET','POST'])
def db_test():
try:
conn = mysql.connector.connect(**db_config)
return Statement
except Error as e:
return jsonify({'success': False, 'message': f"Database error: {e}. Contact the researcher"}), 500
我检查了 MySQL 正在端口 3306 上运行,并且我拥有必要的数据库权限。我还尝试在 MySQL 配置文件中注释“bind-address = 127.0.0.1”。
请帮我解决问题。
评论太长,但因此我们也不会成为完整的答案,因为我认为您没有可以通过编程更改来解决的编程问题。
问题中的错误消息是由 mysql client 尝试使用套接字连接连接到 mysql 服务器产生的。当连接失败时,除了一般错误消息之外,它还会返回套接字错误号 (13)。
套接字错误13代表“权限被拒绝”。这意味着 mysql client 没有使用网络连接的权限。 Mysql 客户端是 Flask / Python 的一部分,但 Flask 是由您的 Web 服务器 apache 运行的。
您有两个选择:
由于 mysql 服务器与 apache 托管在同一台计算机上,因此使用 sock 文件连接而不是使用套接字。这里有几个如何做到这一点的例子。
您需要授予 apache Web 服务器或运行 apache 的用户帐户使用套接字连接的权利。 SO 的 Serverfault 姐妹网站可以帮助您。