2016-12-02 4 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 окр VARS):

$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 доставить ожидаемые значения. Но все же соединение отказывается.

Что я делаю неправильно?

**** EDIT **** Аналогичная проблема, как представляется, здесь, но без решения: Cloud foundry p-mysql

**** EDIT ****

Я отлажена вниз право оператор, в котором вызывается конструктор 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(); 

Все выглядит точно так же, как это можно увидеть на веб-консоли для службы связывания.

Является unix_socket, необходимых для успешного подключения?

**** EDIT ****

Как Symfony используют некоторые послеустановочную-команду композиторов (в данном случае, например, для очистки и разогреть кэш), которые требуют уже рабочего подключения к базе данных, что это не поддерживается службами БД с помощью cloudfoundry, пока контейнер не полностью построен и развернут?

Избегайте идей.

ответ

2

Извините за вопрос и спасибо за отзыв. Swisscom модифицировал группы безопасности. См. Application Security Groups для получения дополнительной информации.

Cloud Foundry блокирует все исходящие сетевые подключения из приложения контейнеров по умолчанию. Администраторы могут переопределить это поведение по умолчанию по группам безопасности приложений (ASG).

ПГС представляют собой совокупность правил выхода, которые определяют один или несколько отдельных протоколов, портов и пунктов назначения для разрешения доступа к сети .

Cloud Foundry имеет два набора по умолчанию для ПГС: default-staging и default-running. Все контейнеры приложений в Cloud Foundry используют базовую политику из одного из них.

Правило для Galera как услуги (MariaDB) было сделано только в running. Мы добавили правило также к staging.

0

По моему опыту, Connection refused может означать одно из вещей: (? iptables)

  • Брандмауэр блокирует, не локальный доступ к порту
  • Сервер mysql даже не прислушиваясь к port
  • Сервер mysql прослушивает ipv6 порт 3306, пока клиент пытается соединиться через ipv4.

Сначала давайте попробуем сузить ее, выполнив основной тест телнета:

telnet 10.0.20.18 3306 

Это должно приветствовать вас с некоторыми наполовину искаженными сообщениями с четким упоминанием MySQL. Если это не так, вам нужно вернуться к более общим ограничениям, таким как брандмауэры и политики.

Поскольку вы уверены, что сервер работает, я предлагаю проверить, заблокирован ли вы брандмауэром или SELinux. Не знаю, сколько контроля у вас есть в системе PaaS Swisscom.

Если у вас есть SSH-доступ к службе PaaS, вы можете попробовать запустить tcpdump сделать захват любого трафика. Смотрите эту статью: https://serverfault.com/questions/507627/debugging-a-connection-refused-response-on-port-21

Надеется, что это дает вам некоторые подсказки ...

+0

спасибо, в конце концов, я узнал при поддержке swisscomdev, что во время промежуточного соединения базы данных не было доступно. подтвердит, что в понедельник и сообщите об этом здесь. – LBA

+0

, поэтому я смог подключиться к работающему db повсюду, единственная «недостающая ссылка» была неполной привязкой моего приложения к службе db во время этапа приложения. – LBA

1

Только в случае, если кто-то подобный вопрос этого решения:

В конце концов, я мог бы решить только это с поставщиком PaaS (swisscomdev).

Очевидно, что соединение с базой данных не было предоставлено/возможно во время размещения/развертывания нашего приложения, но кеш Symfony: clear/warmup потребовалось полное соединение с базой данных во время фазы обработки композитора.

После исправления на платформе swisscomdev на базе облачных вычислений все работало, как ожидалось.

Смежные вопросы