2016-12-02 125 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的平臺中修復後,所有工作都按預期工作。