我正在尝试在 AWS 上部署一个 django 应用程序,其设置中有一个运行 nginx/uwsgi 的 EC2 实例和第二个安装了 MySQL 5.5 的 EC2 实例。两者都属于默认组(启用了 SSH、HTTP、HTTPS 和 MYSQL)。最终,我将拆分 DB 和应用程序/Web 服务器的组,但现在我想让应用程序正常运行。
我的 django db 设置如下:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'db',
'USER': 'db_user',
'PASSWORD': 'db_pwd',
'HOST': '<public dns of MySQL EC2 instance(tried also private ip)>',
'PORT': '3306',
}
}
每次我尝试运行 syncdb 时都会出现以下错误:
_mysql_exceptions.OperationalError:(1130,“主机‘ip-xx-xx-xx-xxx.ec2.internal’不允许连接到此 MySQL 服务器”)
请注意,当我在与 Web/应用服务器相同的 EC2 实例中设置 MySQL 时,应用程序可以运行。在该实例中,我的设置文件数据库设置如下所示:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'db',
'USER': 'db_user',
'PASSWORD': 'db_pwd',
'HOST': '',
'PORT': '',
}
}
我按照一篇文章的建议,注释掉了 /etc/mysql/my.cnf 文件中的绑定 127.0.0.1,甚至将其设置为 0.0.0.0(更改后重新启动了 MySQL),但这没有帮助。
有什么建议么?
谢谢
二进制迷宫
答案1
[从评论流中整理出这个答案。]
设置安全组时,不要为一般互联网 (0.0.0.0/0) 启用 MySQL 端口 (3306),因为这很危险。相反,只为您账户中的安全组启用端口 3306,这样只有您的实例可以连接到它。
从另一个实例上的客户端连接时,您将需要使用数据库服务器的内部 IP 地址,而不是公共 IP 地址。
“bind-address = 0.0.0.0” 让 MySQL 接受来自其他主机的连接(受安全组和 iptables 规则约束)。
授予“someuser”@“%”权限允许该用户从任何主机进行连接,但须遵守安全组的限制。