2015-09-08 81 views
0

問題: 不能從阿帕奇通過SSH訪問遠程MySQL無法從阿帕奇通過SSH訪問遠程MySQL

我的目標是使用Apache和Tomcat通過SSH隧道安全地從應用服務器訪問數據庫。 APP服務器(Linux)運行apache httpd,tomcat。 DB服務器(Linux)正在運行mysql服務器(端口3306)。 在兩臺服務器上爲用戶設置SSH:sshUser。數據庫上的MySQL已啓動。

SSH連接: 在APP服務器上,我運行以下sshUser。 (sshUser是APP和數據庫服務器的登錄用戶)

ssh -p 22 -f -N -L 3307:localhost:3306 [email protected]_ip_address 

然後我在APP服務器上啓動httpd和tomcat。

測試用例: 1. APP服務器(httpd的)(本地主機:3307)>(3306)數據庫服務器(MySQL的)失敗: APP服務器上,在Apache中,我運行test.php的是下面的PHP代碼

<?php 
$db_host = "localhost:3307"; 
$db_name = "dbname"; 
$db_user = "dbuser"; 
$db_pass = "dbpassword"; 
GLOBAL $errors; 
GLOBAL $successes; 
$errors = array(); 
$successes = array(); 
$mysqli = new mysqli($db_host, $db_user, $db_pass, $db_name); 
GLOBAL $mysqli; 
if(mysqli_connect_errno()) { 
    echo "Conn Error = " . mysqli_connect_error(); exit(); 
}else{ 
    echo "Pass"; exit(); 
} 
?> 

錯誤消息: 警告:mysqli的:: mysqli的():(HY000/2005):未知MySQL服務器主機的 'localhost:3307'(1)在/$site_path/test.php在第10行,康涅狄格州錯誤=未知MySQL服務器主機'localhost:3307'(1) (使用joomla和wordpress也失敗了)

  1. APP服務器(Tomcat)的(本地主機:3307)>(3306)DB服務器(MySQL的)是良好的:

  2. 窗戶8(httpd的)(本地主機:3307)>(3307)APP服務器(3307)>( 3306)數據庫服務器(MySQL)很好: 在windows 8客戶端上,putty目標是APP服務器,SSH隧道設置轉發端口3307(源端口)localhost:3307(目的地)。 如果我在Windows 8.1上從我的apache服務器運行相同的test.php,它沒有問題。 Joomla也有效。 (配置是如下)

  3. 窗戶8(Tomcat)的(本地主機:3307)>(3307)APP服務器(3307)>(3306)DB服務器(MySQL的)是良好的:

配置細節: APP服務器上: Tomcat的是「雄貓」用戶 的httpd是由「阿帕奇」用戶 mysqld正在由「根」 SSH是由「sshUser」開始 sshd的是「根」開始開始開始開始

/etc/passwd(在APP服務器和數據庫服務器上相同) apache:x:48:48:Apache:/ var/www:/ sbin/nologin tomcat:x:501:501 ::/home/tomcat:/sbin/nologin

+1

這個問題可能是最適合http://serverfault.com –

+0

$ DB_HOST =「本地主機:3307」工作在Windows8中,不在Linux中。由於joomla沒有端口參數,我更改爲默認端口。新問題:我有一個運行在APP服務器上的Mysql。我將其更改爲3309.然後ssh -f -N -L 3306:localhost:3306 sshUser @ DB_IP。但joomla總是在本地訪問Mysql,這是3309. https://dev.mysql.com/doc/refman/5.0/en/connecting.html「對於連接到本地主機,使用Unix套接字文件的MySQL,即使一個 - 端口被賦予一個端口號。「我更改爲,ssh -p 22 -f -N -L 3306:127.0.0.1:3306 sshUser @ DB_IP_address。在PHP中,更改$ db_host =「127.0.0.1」使其工作。 – pjy

+0

我不能自己改變這個問題。但這與編程有關。該代碼需要解決joomla和mysql功能非常微妙。 (在我以前的評論中描述) – pjy

回答

0

您必須添加端口號作爲參數傳遞給構造器

$db_host="localhost"; 
$db_port=3307; 
..... 
new mysqli (....,$db_port); 
.... 
+0

謝謝。這就對了。原始格式「localhost:3307」實際上適用於Windows 8,但不適用於Linux。現在我的問題是在joomla,它沒有提供一個單獨的參數的端口。我想我需要提出另一個問題。 – pjy

1

localhost:3307不是有效的主機名。

http://php.net/manual/en/mysqli.construct.php

mysqli::__construct ([ string $host = ini_get("mysqli.default_host") 
[, string $username = ini_get("mysqli.default_user") [, string $passwd 
= ini_get("mysqli.default_pw") [, string $dbname = "" [, int $port = ini_get("mysqli.default_port") [, string $socket = 
ini_get("mysqli.default_socket") ]]]]]])

(...)

主機

可以是主機名或IP地址。 (...)

(...)

端口

指定要嘗試連接到MySQL服務器的端口號。

+0

謝謝。這就對了。原始格式「localhost:3307」實際上適用於Windows 8,但不適用於Linux。現在我的問題是在joomla,它沒有提供一個單獨的參數的端口。我想我需要提出另一個問題。 – pjy