symfony - Symfony/PHP 数据库连接被拒绝

标签 symfony cloud-foundry swisscomdev

尝试将 Symfony 3.2/Doctrine 应用程序部署到 Swisscom PaaS。

Buildpack(PHP 7、httpd 等)已安装,Composer 正在运行并安装依赖项,但是在调用 Composer 命令后(例如 cache:clear)时,我得到一个:

[Doctrine\DBAL\Exception\ConnectionException]                              
An exception occured in driver: SQLSTATE[HY000] [2002] Connection refused

我的manifest.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

我的选项.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 环境变量的本地设置完美配合):

$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();

任何内容看起来都与服务绑定(bind)的 Web 控制台中看到的完全一样。

成功连接是否需要unix_socket

****编辑****

由于 Symfony 正在使用一些 Composer 安装后命令(在本例中,例如清除和预热缓存),这些命令已经需要一个有效的数据库连接,因此只要容器是可用的,cloudfoundry 的数据库服务就不支持此连接。尚未完全构建和部署?

我已经没有想法了。

最佳答案

对于这个问题,我们深表歉意,并感谢您的反馈。 Swisscom 修改了安全组。请参阅Application Security Groups了解更多信息。

Cloud Foundry blocks all outbound network connections from application containers by default. Administrators can override this block-by-default behavior with Application Security Groups (ASGs).

ASGs are a collection of egress rules that specify one or more individual protocols, ports, and destinations to allow network access to.

Cloud Foundry has two default sets of ASGs: default-staging and default-running. All application containers in Cloud Foundry use a base policy from one of these.

Galera 即服务 (MariaDB) 的规则仅在运行 中完成。我们还将规则添加到了staging中。

关于symfony - Symfony/PHP 数据库连接被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40930498/

相关文章:

php - JMSSerializerBundle 在 JSON 中返回 double 字符串

php - Symfony 2.0实体表单字段不保存

symfony - 未找到 Assets 路线

symfony - 失去与 Redis 服务的连接

docker - 无法从AWS私有(private)注册表部署docker镜像

cloud-foundry - 内部服务器错误被映射到 302 Found,重定向到 Swisscom CloudFoundry 上的 "/offline_pages/"

model-view-controller - Mvc前端和Mvc后端: wrong architecture?

amazon-web-services - 获取 Bluemix 实例 IP

mysql - 由于内存限制,无法通过隧道连接到 vmc mysql 服务

Swisscom Cloud 上的 Java 应用程序因 OOM 失败