2016-12-02 105 views
2

尝试将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不支持数据库服务,只要容器没有完全构建和部署?

我的想法已经耗尽。

回答

2

对不起,并感谢您的反馈意见。瑞士电信修改了安全组织。有关更多信息,请参见Application Security Groups

默认情况下,Cloud Foundry会阻止来自应用程序 容器的所有出站网络连接。管理员可以覆盖此应用程序安全组(ASG)的默认行为 。

ASG是出口规则的集合,它指定一个或多个 单个协议,端口和目标,以允许网络访问 。

Cloud Foundry有两套默认的ASG:default-stagingdefault-running。 Cloud Foundry中的所有应用程序容器都使用其中的一个 基本策略。

Galera即服务(MariaDB)的规则只在running中完成。我们还将规则添加到staging

0

根据我的经验,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

希望这给你一些提示...

+0

谢谢,最后我发现在swisscomdev的支持下,在登台期间数据库连接不可用。将在周一确认并在此处提供更新。 – LBA

+0

所以我能够连接到任何地方的运行数据库,唯一的'缺失的链接'是应用程序升级期间从我的应用程序到数据库服务的不完整绑定。 – LBA

1

万一有人有类似的问题,这是解决方案:

最后我只能用的PaaS提供商解决这个(swisscomdev)支持。

数据库连接显然在应用程序的暂存/部署过程中未提供/可能,但Symfony的缓存:在作曲程序后处理阶段,清除/预热需要完整的数据库连接。

在swisscomdev的基于cloudfoundry的平台中修复后,所有工作都按预期工作。