数据库连接被Symfony/PHP拒绝
尝试将Symfony 3.2/Doctrine应用程序部署到Swisscom PaaS。数据库连接被Symfony/PHP拒绝
Buildpack(PHP 7的httpd等)安装,作曲家运行和安装的依赖,但调用后的命令作曲家时,像缓存:清楚,我得到一个:
[Doctrine\DBAL\Exception\ConnectionException]
An exception occured in driver: SQLSTATE[HY000] [2002] Connection refused
我清单.yml:
applications:
- services:
- dbservice
buildpack: php_buildpack
host: myapp
name: MyApp
instances: 1
memory: 640M
env:
SYMFONY_ENV: prod
PHP_INI_SCAN_DIR: .bp-config/php/conf.d
我options.json:
"WEB_SERVER": "httpd",
"COMPOSER_INSTALL_OPTIONS": ["--no-dev --optimize-autoloader --no-progress --no-interaction"],
"COMPOSER_VENDOR_DIR": "vendor",
"SYMFONY_ENV": "prod",
"WEBDIR": "web",
"PHP_MODULES": "fpm",
"PHP_VERSION": "{PHP_70_LATEST}",
"PHP_EXTENSIONS": [
"bz2",
"zlib",
"curl",
"mcrypt",
"openssl",
"mbstring",
"pdo",
"pdo_mysql"
],
"ZEND_EXTENSIONS": [
"opcache"
]
这是我读VCAP在Symfony的数据库凭证和设置参数(这是完全有VCAPSERVICES ENV的本地设置工作瓦尔):
$vcapServices = json_decode($_ENV['VCAP_SERVICES']);
$container->setParameter('database_driver', 'pdo_mysql');
$db = $vcapServices->{'mariadb'}[0]->credentials;
$container->setParameter('database_host', $db->host);
$container->setParameter('database_port', $db->port);
$container->setParameter('database_name', $db->name);
$container->setParameter('database_user', $db->username);
$container->setParameter('database_password', $db->password);
// Just for debug:
echo 'User: ';
var_dump($container->getParameter('database_user'));
echo 'Db: ';
var_dump($db);
服务正在运行,既提供的var_dump的预期值。但仍然连接被拒绝。
我在做什么错?
**** ****编辑 类似的问题似乎是在这里,但没有一个解决方案:Cloud foundry p-mysql
**** ****编辑
我调试下来的权利PDO构造函数被调用的语句。
它被称为具有下列参数:
$dsn = mysql:host=10.0.20.18;port=3306;dbname=CF_DB922DD3_CACB_4344_9948_746E585732B5;
$username = "myrealusername"; // as looked up in VCAP_SERVICES
$password = "myrealpassword"; // as looked up in VCAP_SERVICES
$options = array();
任何长相酷似它可以在服务绑定Web控制台中可以看出。
是一个unix_socket成功连接要求?
**** ****编辑
symfony作为使用一些作曲家的安装后,命令(在这种情况下,例如,清除和热身cache),它已经要求工作数据库连接,这cloudfoundry不支持数据库服务,只要容器没有完全构建和部署?
我的想法已经耗尽。
对不起,并感谢您的反馈意见。瑞士电信修改了安全组织。有关更多信息,请参见Application Security Groups。
默认情况下,Cloud Foundry会阻止来自应用程序 容器的所有出站网络连接。管理员可以覆盖此应用程序安全组(ASG)的默认行为 。
ASG是出口规则的集合,它指定一个或多个 单个协议,端口和目标,以允许网络访问 。
Cloud Foundry有两套默认的ASG:
default-staging
和default-running
。 Cloud Foundry中的所有应用程序容器都使用其中的一个 基本策略。
Galera即服务(MariaDB)的规则只在running
中完成。我们还将规则添加到staging
。
根据我的经验,Connection refused
可能意味着的事情之一:(?iptables
)
- 防火墙阻塞的端口
- 的
mysql
服务器没有监听到的非本地访问端口 -
mysql
服务器正在侦听ipv6
端口3306
而客户端尝试通过ipv4
进行连接。
首先让我们尝试通过运行基本Telnet测试,以缩小范围:
telnet 10.0.20.18 3306
这应该用的MySQL
明确提到了一些半乱码邮件问候您。如果没有,则需要回到防火墙和策略等更一般的限制。
由于您肯定服务器正在运行,因此我建议您检查一下您是否被防火墙或SELinux
阻止。但是,不知道你对的PaaS系统有多少控制。
如果您有通过SSH访问PaaS服务,您可以尝试运行tcpdump
捕获任何流量。看到这篇文章:https://serverfault.com/questions/507627/debugging-a-connection-refused-response-on-port-21
希望这给你一些提示...
万一有人有类似的问题,这是解决方案:
最后我只能用的PaaS提供商解决这个(swisscomdev)支持。
数据库连接显然在应用程序的暂存/部署过程中未提供/可能,但Symfony的缓存:在作曲程序后处理阶段,清除/预热需要完整的数据库连接。
在swisscomdev的基于cloudfoundry的平台中修复后,所有工作都按预期工作。
谢谢,最后我发现在swisscomdev的支持下,在登台期间数据库连接不可用。将在周一确认并在此处提供更新。 – LBA
所以我能够连接到任何地方的运行数据库,唯一的'缺失的链接'是应用程序升级期间从我的应用程序到数据库服务的不完整绑定。 – LBA