PythonAnywhere Flask应用连接外部MySQL报OperationalError
问题根因
你遇到的sqlalchemy.exc.OperationalError: (2003, "Can't connect to MySQL server on 'xxx' (111)")是TCP连接被直接拒绝的典型报错,和pandas调用方式、SQLAlchemy连接池参数(比如你之前加的pool_recycle=280,这个参数只用来解决空闲连接超时断开问题,对初始连接失败无效)没有任何关系,问题出在平台网络限制、数据库侧访问配置两个层面。
排查与解决步骤
- 先确认PythonAnywhere账号出站权限
免费版PythonAnywhere默认封禁绝大多数外部公网出站访问,仅允许访问平台自带服务和少量HTTP/HTTPS白名单站点,MySQL这类非HTTP协议的外部连接在免费账号下完全无法使用,必须升级到付费套餐才能获得公网出站权限。 - 检查MySQL服务绑定配置
登录你部署MySQL的服务器,找到MySQL配置文件(通常路径为/etc/mysql/mysql.conf.d/mysqld.cnf),确认bind-address配置项没有设置为127.0.0.1,需要改为0.0.0.0或对应公网网卡IP,修改后重启MySQL服务生效,否则服务只会监听本地回环请求,公网连接会被直接拒绝。 - 配置访问白名单与权限
- 开放MySQL用户的远程访问权限:登录MySQL执行授权语句,临时测试可以允许所有来源IP访问,确认连通后再收紧为PythonAnywhere官方公布的出口IP段:
-- 替换为实际的用户名、密码、业务库名 GRANT ALL PRIVILEGES ON your_schema.* TO 'your_user'@'%' IDENTIFIED BY 'your_db_password'; FLUSH PRIVILEGES; - 放通网络防火墙规则:同时配置MySQL所在服务器的系统防火墙(iptables/ufw/firewalld)、云服务商安全组规则,开放你使用的MySQL端口(日志中显示你用的是8080,默认MySQL端口为3306),放行PythonAnywhere的出口IP段访问。
- 开放MySQL用户的远程访问权限:登录MySQL执行授权语句,临时测试可以允许所有来源IP访问,确认连通后再收紧为PythonAnywhere官方公布的出口IP段:
- 连通性前置验证
上述配置完成后,不要直接启动Web应用测试,先打开PythonAnywhere的Bash控制台,用MySQL命令行工具直接测连接:
命令行能成功登录MySQL后,你的原有pandas查询代码不需要任何修改即可正常运行。# 替换为实际的数据库IP、端口、用户名 mysql -h 34.105.08.12 -P 8080 -u your_user -p
避坑提醒
- 不要使用80、443、8080这类Web服务常用端口承载MySQL流量,PythonAnywhere会对这些端口的出站流量做HTTP协议校验,MySQL协议的请求会被直接拦截,建议使用默认3306端口或其他未被Web服务占用的端口。
- 如果配置完成后仍连接失败,检查PythonAnywhere的Web应用配置页,确认没有开启强制出站代理、流量过滤类的功能。
内容的提问来源于stack exchange,提问作者Ambient Shoggoth
相关产品推荐
相关产品推荐

