在Heroku托管的Laravel项目中配置Proximo静态IP实现Python脚本的MySQL外部数据库连接
解决Heroku + Proximo静态IP下Python脚本连接MySQL的问题
嘿,我来帮你搞定这个配置!你已经安装了Proximo插件,现在只需要调整两个地方就能让Python脚本通过静态IP连接外部数据库,下面分两种方案说明:
方案一:用Proximo命令包装Python调用(最简单)
Proximo插件自带了一个proximo命令,它会自动让后续命令的出站流量走Proximo的静态IP,完全不用修改Python代码,只需要调整Laravel控制器里的调用命令:
修改Laravel控制器代码
// 给python命令加上proximo前缀,自动走静态IP代理 $dataString = shell_exec("proximo python3 storage/app/path/to/python_script.py"); $data = JsonHelper::loadFromString($dataString);
修正Python脚本的小问题
注意你的Python脚本里mycursor.toList()是错误的——mysql.connector的游标没有这个方法,换成fetchall()就行。如果想让输出的JSON带列名(更易读),还可以把结果转成字典列表:
import mysql.connector import json import os # 用绝对路径避免路径问题 path = os.path.dirname(os.path.abspath(__file__)) def getData(): with open(os.path.join(path, 'query.txt'), 'r') as f: queryString = f.read() mydb = mysql.connector.connect( host="<database host>", user="<user>", password="<password>", database='<database name>' ) mycursor = mydb.cursor() mycursor.execute(queryString) # 替换toList()为fetchall()获取所有结果 rows = mycursor.fetchall() # 可选:转成带列名的字典,让JSON结构更清晰 columns = [col[0] for col in mycursor.description] result = [dict(zip(columns, row)) for row in rows] return result if __name__ == '__main__': result = getData() print(json.dumps(result, ensure_ascii=False, indent=4))
这样修改后,proximo命令会自动处理流量代理,让你的Python脚本的数据库连接从Proximo的静态IP发出,只要这个IP在数据库的白名单里,就能正常连接了。
方案二:在Python脚本中手动配置Proximo代理
如果你不想用proximo命令包装,也可以直接在Python脚本里读取Proximo的环境变量,手动配置MySQL连接的代理:
修改Python脚本的连接部分
import mysql.connector import json import os path = os.path.dirname(os.path.abspath(__file__)) def getData(): # 读取Heroku自动配置的Proximo环境变量 proximo_host = os.getenv('PROXIMO_HOST', 'proxy.proximo.io') proximo_port = int(os.getenv('PROXIMO_PORT', 1080)) proximo_user = os.getenv('PROXIMO_USERNAME') proximo_pass = os.getenv('PROXIMO_PASSWORD') with open(os.path.join(path, 'query.txt'), 'r') as f: queryString = f.read() mydb = mysql.connector.connect( host="<database host>", # 依然填真实的数据库主机 user="<user>", password="<password>", database='<database name>', # 配置Proximo代理参数 proxy={ 'host': proximo_host, 'port': proximo_port, 'username': proximo_user, 'password': proximo_pass }, connection_timeout=30 # 增加超时时间避免连接失败 ) mycursor = mydb.cursor() mycursor.execute(queryString) rows = mycursor.fetchall() columns = [col[0] for col in mycursor.description] result = [dict(zip(columns, row)) for row in rows] return result if __name__ == '__main__': result = getData() print(json.dumps(result, ensure_ascii=False, indent=4))
验证环境变量
在Heroku控制台运行heroku config,确认能看到PROXIMO_HOST、PROXIMO_PORT、PROXIMO_USERNAME、PROXIMO_PASSWORD这些变量,如果没有的话,重新安装Proximo插件或者运行heroku addons:create proximo:development(根据你的套餐调整)。
测试步骤
- 把修改后的代码推送到Heroku
- 在Heroku控制台运行
heroku run bash,手动执行proximo python3 storage/app/path/to/python_script.py,检查是否能正常输出JSON结果 - 如果遇到连接超时,先确认Proximo的静态IP已经加入数据库的白名单,再核对数据库的主机、用户名、密码是否正确
内容的提问来源于stack exchange,提问作者budare
相关产品推荐
相关产品推荐

