无法通过SSH从apache访问远程MySQL


Cannot access remote MySQL from apache through SSH

问题:无法通过SSH 从apache访问远程MySQL

我的目标是通过ssh隧道使用apache和tomcat从APP服务器安全地访问DB。APP服务器(Linux(正在运行apachehttpd,tomcat。DB服务器(Linux(正在运行mysql服务器(端口3306(。在两台服务器上都为user:shUser设置了SSH。数据库上的MySQL已启动。

SSH连接:在APP服务器上,我以sshUser的身份运行了以下内容。(sshUser是APP和DB服务器的登录用户(

ssh -p 22 -f -N -L 3307:localhost:3306 sshUser@DB_ip_address

然后我在APP服务器上启动了httpd和tomcat。

测试用例:1.APP服务器(httpd((localhost:3307(>(3306(DB服务器(MySQL(失败:在应用程序服务器上,在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(:第10行/$site_path/test.php中的未知MySQL服务器主机"localhost:3307"(1(,Conn错误=未知MySQL服务器宿主"localhost:3307'(1((使用joomla和wordpress也失败(

  1. APP服务器(tomcat((localhost:3307(>(3306(DB服务器(MySQL(不错:

  2. windows 8(httpd((localhost:3307(>(3307(APP服务器(3307在windows 8客户端上,putty目的地是APP服务器,SSH隧道集转发端口3307(源端口(localhost:3307(目的地(。如果我在windows8.1的apache服务器上运行相同的test.php,它就没有问题。Joomla也工作。(配置如下(

  3. windows8(tomcat((localhost:3307(>(3307(APP服务器(3307

配置详细信息:在APP服务器上:Tomcat由"Tomcat"用户启动httpd由"apache"用户启动mysqld由"root"启动ssh由"sshUser"启动sshd由"根"启动

在/etc/passwd中(在APP服务器和DB服务器上相同(apache:x:48:apache:/var/www:/sbin/nologintomcat:x:501::/home/tomcat:/sbin/nologin

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"([,stringe$passwd=ini_get("mysqli.default_pw"([,string$dbname="[,int$port=ini_get[("mysqli.default_port"(],string$socket=ini_get("mysqli.default_socket"(]]]]]](

(…(

主机

可以是主机名或IP地址。(…(

(…(

端口

指定尝试连接到MySQL服务器的端口号。

您必须添加端口号作为构造函数的参数

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