You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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服务生效,否则服务只会监听本地回环请求,公网连接会被直接拒绝。
  • 配置访问白名单与权限
    1. 开放MySQL用户的远程访问权限:登录MySQL执行授权语句,临时测试可以允许所有来源IP访问,确认连通后再收紧为PythonAnywhere官方公布的出口IP段:
      -- 替换为实际的用户名、密码、业务库名
      GRANT ALL PRIVILEGES ON your_schema.* TO 'your_user'@'%' IDENTIFIED BY 'your_db_password';
      FLUSH PRIVILEGES;
      
    2. 放通网络防火墙规则:同时配置MySQL所在服务器的系统防火墙(iptables/ufw/firewalld)、云服务商安全组规则,开放你使用的MySQL端口(日志中显示你用的是8080,默认MySQL端口为3306),放行PythonAnywhere的出口IP段访问。
  • 连通性前置验证
    上述配置完成后,不要直接启动Web应用测试,先打开PythonAnywhere的Bash控制台,用MySQL命令行工具直接测连接:
    # 替换为实际的数据库IP、端口、用户名
    mysql -h 34.105.08.12 -P 8080 -u your_user -p
    
    命令行能成功登录MySQL后,你的原有pandas查询代码不需要任何修改即可正常运行。
避坑提醒
  • 不要使用80、443、8080这类Web服务常用端口承载MySQL流量,PythonAnywhere会对这些端口的出站流量做HTTP协议校验,MySQL协议的请求会被直接拦截,建议使用默认3306端口或其他未被Web服务占用的端口。
  • 如果配置完成后仍连接失败,检查PythonAnywhere的Web应用配置页,确认没有开启强制出站代理、流量过滤类的功能。

内容的提问来源于stack exchange,提问作者Ambient Shoggoth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 10:51:21