作者 主題: PHP to 遠端MYSQL  (閱讀 16524 次)

0 會員 與 1 訪客 正在閱讀本文。

weider

  • 憂鬱的高中生
  • ***
  • 文章數: 91
  • 阿彌陀佛!
    • 檢視個人資料
    • 獄卒的世界
PHP to 遠端MYSQL
« 於: 2009-02-04 10:59 »
SERVER's OS:RHEL5和CENTOS5.2
MYSQL:mysql-5.0.22.el5和mysql-5.0.45-7.el5 RPM安裝
CLIENT套件:
libdbi-dbd-mysql-0.8.1a-1.2.2
rsyslog-mysql-2.0.0-11.el5
mysql-5.0.45-7.el5
mysql-connector-odbc-3.51.12-2.2
php-mysql-5.1.6-20.el5
mod_auth_mysql-3.0.0-3.1
SERVER端有用IPTABLES,和SELINUX
並且是以RHEL5為環境~

我遇到一個問題,不知道算不算詭異~
因為之前的環境都是PHP對本機的MYSQL做連線,沒有對遠端的MYSQL連線過,想說應該不難才對,頂多在mysql_connect這個函數裡的主機參數做更改就好了~
誰知道問題出現了!
先是mysql_error告訴我不能連線MYSQL主機~
很好!我上GOOGLE拜了一下,看到說MYSQL預設是不允許遠端連線的,於是我先去建了一個只允許CLIENT端IP連線的帳號(abc@172.16.1.100)~
再RELOAD該頁面,呵!mysql_error告訴我另一個訊息:Can't connect to MySQL server on '172.16.1.110'
很好!看來OK了!只是接下來不管怎麼改設定,總是這樣的訊息~~

再上GOOGLE去繼續拜~看到人家寫了三種情形導致PHP不能連線遠端MYSQL:
1.my.cnf有個設定值bind-address=127.0.0.1
我看了我的my.cnf
嗯!沒這個設定值,我試著自己加了bind-address=172.16.1.100
RELOAD該頁面之後,依然是那個該死的訊息~
2.my.cnf有個設定值skip-networking(我記得是這樣子的)
我再看一下我的my.cnf
嗯!一樣沒有,所以應該不是這個設定值的關係~
3.SELINUX
我把SELINUX關掉,重新開機,再RELOAD,一樣是那個該死的訊息~~

更懸疑的是,在以上的設定之下,我從172.16.1.100在文字模式底下,用頁面裡的帳號密碼去連線172.16.1.110的MYSQL
都能連線,且use資料庫名稱也能使用該資料庫,show tables之後也能看到該資料庫的資料表~

好!那時的SERVER環境是用VMWARE弄的,也許是因為VMWARE有不可告人的原因導致這樣的情形~
我用另一台機器,環境是CENTOS5.2,資料庫和資料表都匯進去了,帳號密碼也建好了~

用文字模式連線CENTOS5.2那台主機,沒問題!use資料庫名稱和show tables也都可以看到資料~
結果...
一樣是那個該死的訊息~~

我真的不知道問題出現在哪裡!?所以請各位大大給我一些想法~
感激不盡~
班長說:有一個壞消息跟一個好消息
壞消息是今天要做出三千個沙包,
好消息是這裡沙很多~

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
回覆: PHP to 遠端MYSQL
« 回覆 #1 於: 2009-02-04 11:07 »
一定要這樣連嗎??  ::)

若是我的話...
我會連線到 mysql 那台或是近端的 php
再由近端的 php 去存取 mysql
再將結果丟回給遠端

除了可免去樓主說的那些問題
安全上也比較不會有問題..
« 上次編輯: 2009-02-04 11:21 由 yamaka »

weider

  • 憂鬱的高中生
  • ***
  • 文章數: 91
  • 阿彌陀佛!
    • 檢視個人資料
    • 獄卒的世界
回覆: PHP to 遠端MYSQL
« 回覆 #2 於: 2009-02-04 11:35 »
感謝yamaka大大的回覆~
小弟對連線遠端的MYSQL所知有限,所以當有這樣子的架構時,第一個想到的做法就是這樣的~
所以在安全性上我只開放某台主機的連線而已~
您的意思是在MYSQL主機上寫一個PHP頁面,來幫遠端的PHP向本機的MYSQL要資料是嗎?
班長說:有一個壞消息跟一個好消息
壞消息是今天要做出三千個沙包,
好消息是這裡沙很多~

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
回覆: PHP to 遠端MYSQL
« 回覆 #3 於: 2009-02-04 11:43 »
嗯嗯, 就是這樣~~

這麼做就不需要另外處理遠端連 mysql 的問題

weider

  • 憂鬱的高中生
  • ***
  • 文章數: 91
  • 阿彌陀佛!
    • 檢視個人資料
    • 獄卒的世界
回覆: PHP to 遠端MYSQL
« 回覆 #4 於: 2009-02-04 11:50 »
再次感謝yamaka大大的回覆~
但是由於MYSQL主機上還有設定虛擬主機~
如果要增加一個本機代處理的頁面,勢必要增加一個虛擬主機來放本機代處理的頁面~
而增加一個虛擬主機就又必須增加一個DNS記錄~
牽扯的部份有點廣,所以可能沒辦法用這樣一個方式來達成這個需求~
所以可能還是希望能由PHP來直接連線遠端的MYSQL比較方便~

不知道是否能為我解惑?
感激不盡~~
班長說:有一個壞消息跟一個好消息
壞消息是今天要做出三千個沙包,
好消息是這裡沙很多~

weider

  • 憂鬱的高中生
  • ***
  • 文章數: 91
  • 阿彌陀佛!
    • 檢視個人資料
    • 獄卒的世界
回覆: PHP to 遠端MYSQL
« 回覆 #5 於: 2009-02-04 12:34 »
我補貼一下我mysql_connect函數裡的用法~
 $link = mysql_pconnect('172.16.1.110:3306', 'test', 'test123^^') or die("您的帳號密碼可能不正確,請確認後再連!");
即使我帳號改成test@172.16.1.100也是一樣出現那個該死的訊息~~
班長說:有一個壞消息跟一個好消息
壞消息是今天要做出三千個沙包,
好消息是這裡沙很多~

micmic3

  • 俺是博士!
  • *****
  • 文章數: 1692
    • 檢視個人資料
回覆: PHP to 遠端MYSQL
« 回覆 #6 於: 2009-02-04 13:13 »
很好!我上GOOGLE拜了一下,看到說MYSQL預設是不允許遠端連線的,於是我先去建了一個只允許CLIENT端IP連線的帳號(abc@172.16.1.100)~
--
我補貼一下我mysql_connect函數裡的用法~
 $link = mysql_pconnect('172.16.1.110:3306', 'test', 'test123^^') or die("您的帳號密碼可能不正確,請確認後再連!");
即使我帳號改成test@172.16.1.100也是一樣出現那個該死的訊息~~
你誤會了
你要開的帳號不是abc@172.16.1.100
http://www.sy3es.tnc.edu.tw/teaching/php_mysql/mysql.htm

hikohan

  • 俺是博士!
  • *****
  • 文章數: 1288
    • 檢視個人資料
回覆: PHP to 遠端MYSQL
« 回覆 #7 於: 2009-02-04 13:25 »
實在是看不太懂樓主的表達方式。

當問題發生時,老是想不行、不行、為什麼不行,還不如去想怎麼讓它行吧。

1. 防火牆有開啟嗎?遠端登入敲敲門。

telnet foo.a.b.c 3306

如果上面出現MySQL版本,再去想第二步。


2. MySQL裡面有開啟誰誰誰連進去的權限嗎?試著建立一個不限制來源的帳號,
在localhost用終端登入看看。

如果可以進入選擇DB,你再想下一步。

3. Linux上,用基本的mysqlConnect連線,寫個PHP,看看錯誤訊息,
win32有MyODBC提供遠端登入建立DSN。
lifeIsFunWithPHP.

weider

  • 憂鬱的高中生
  • ***
  • 文章數: 91
  • 阿彌陀佛!
    • 檢視個人資料
    • 獄卒的世界
回覆: PHP to 遠端MYSQL
« 回覆 #8 於: 2009-02-04 13:37 »
先感謝micmic3大大的回覆
您可能誤會囉!
我是在遠端MYSQL開test允許從172.16.1.100來連線
當然我會用test@172.16.1.100這樣的帳號格式來嘗試登入~
也是看網路上的資料...


再感謝hikohan大大的回覆
您的第一個問題,我想我應該有寫得很清楚我的測試過程~
如果您不吝賜教,可以麻煩再將我的測試過程再看一下~
您的第二個問題一樣,也是在我測試的過程中都排除掉了~
您的第三個問題也一樣,我有說是mysql_error所告訴我的錯誤訊息,相信這背後的意義代表什麼~您應該會了解才是~
還是感謝您的回覆~

我想我還不是那種不會自己測試之後就隨便上來亂PO問題的人~
也許我在這裡的貢獻不多,但是除非必要,我也是盡量不要麻煩別人幫我~
畢竟,這裡的人並不是有義務幫忙我的~~

再次感謝以上兩位大大的回覆!!
班長說:有一個壞消息跟一個好消息
壞消息是今天要做出三千個沙包,
好消息是這裡沙很多~

hikohan

  • 俺是博士!
  • *****
  • 文章數: 1288
    • 檢視個人資料
回覆: PHP to 遠端MYSQL
« 回覆 #9 於: 2009-02-04 14:13 »
確定有在command prompt測試過嗎?可以嗎?不知道是眼花還是沒專心,
到現在還是沒看見。如果基本的防火牆tcp沒開,一切都是白搭。
有用過odbc或ap去建立遠端連線嗎?

如果架構VM的MySQL要提供DB遠端連線,實體的網路與VM之間關係,那又是
另外的問題,VM不熟,建議改實體主機會比較清楚。

在web主機上,用phpmyadmin出現的錯誤訊息是什麼?

討論區應該是討論與交換吧,至於尾巴的祝禱你留著吧。

..
..
您的第一個問題,我想我應該有寫得很清楚我的測試過程~
如果您不吝賜教,可以麻煩再將我的測試過程再看一下~
您的第二個問題一樣,也是在我測試的過程中都排除掉了~
您的第三個問題也一樣,我有說是mysql_error所告訴我的錯誤訊息,相信這背後的意義代表什麼~您應該會了解才是~
還是感謝您的回覆~
..
..
lifeIsFunWithPHP.

weider

  • 憂鬱的高中生
  • ***
  • 文章數: 91
  • 阿彌陀佛!
    • 檢視個人資料
    • 獄卒的世界
回覆: PHP to 遠端MYSQL
« 回覆 #10 於: 2009-02-04 14:20 »
感謝hikohan大大的回覆~
引用
更懸疑的是,在以上的設定之下,我從172.16.1.100在文字模式底下,用頁面裡的帳號密碼去連線172.16.1.110的MYSQL
都能連線,且use資料庫名稱也能使用該資料庫,show tables之後也能看到該資料庫的資料表~
我想可能是我以上的表達不夠清楚吧!
我以上內容的意思是我有在172.16.1.100下指令:mysql -u test -h 172.16.1.110 -p
然後輸入PHP頁面裡的密碼,這樣的情形下是沒問題的~
所以應該表示不是防火牆和SELINUX的問題吧!
班長說:有一個壞消息跟一個好消息
壞消息是今天要做出三千個沙包,
好消息是這裡沙很多~

hikohan

  • 俺是博士!
  • *****
  • 文章數: 1288
    • 檢視個人資料
回覆: PHP to 遠端MYSQL
« 回覆 #11 於: 2009-02-04 14:36 »
大哥,你腦袋打結囉。

引用
1. 防火牆有開啟嗎?遠端登入敲敲門。

telnet foo.a.b.c 3306

如果上面出現MySQL版本,再去想第二步。

寫白點好了,

引用
..
更懸疑的是,在以上的設定之下,我從172.16.1.100在文字模式底下,用頁面裡的帳號密碼去連線172.16.1.110的MYSQL
..

難不成是1.100用ssh進入1.110的prompt shell?
lifeIsFunWithPHP.

hikohan

  • 俺是博士!
  • *****
  • 文章數: 1288
    • 檢視個人資料
回覆: PHP to 遠端MYSQL
« 回覆 #12 於: 2009-02-04 15:08 »
講那麼多,還是自己跑一趟火星比較快。

打開vm的ceos5.2,ip是52.88,我在10.55(win)用telnet開,的確是不行。

檢查火牆,嗯,沒開。

接著,在52.88裡面下mysql -u root -p進去。

代碼: [選擇]
[root@ceos ~]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.0.45 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> GRANT ALL PRIVILEGES ON *.* TO 'foo'@'' IDENTIFIED BY 'BLAHBLAH' WITH GRANT OPTION;
FLUSH PRIVILEGES;Query OK, 0 rows affected (0.05 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)

mysql> exit
Bye

接著,在10.55上面用telnet敲門

telnet 192.168.52.88 3306

怪怪,出現囉。

代碼: [選擇]
4
 5.0.45Hb5"F|_H,*5k=/ph;+e>D

遺失與主機的連線。


確定VM的tcp敞開大門歡迎,好!

最後用mysql manager遠端管理看看,也是一次ok。

留在火星參考看看囉,記得從火星回來囉。
lifeIsFunWithPHP.

weider

  • 憂鬱的高中生
  • ***
  • 文章數: 91
  • 阿彌陀佛!
    • 檢視個人資料
    • 獄卒的世界
回覆: PHP to 遠端MYSQL
« 回覆 #13 於: 2009-02-04 15:51 »
好了!
答案出來了~
是SELINUX的問題~
因為我個人比較機車一點,堅持服務要在SELINUX開啟的狀態下運作,所以我SERVER端和CLIENT端的SELINUX有開~
而我最初測試是只有把SERVER端的SELINUX關掉,而不是把CLIENT端的SELINUX關掉~
導致誤判..
後來把CLIENT端的SELINUX關掉後是可以運作了,但是我不希望SELINUX是關掉的,所以就去試SELINUX的設定值~
最後試出來httpd_can_network_connect_db <==這個設定值關掉就好了~
也就是setsebool -P httpd_can_network_connect_db 1
然後再重新開啟APACHE就好了~~
班長說:有一個壞消息跟一個好消息
壞消息是今天要做出三千個沙包,
好消息是這裡沙很多~

weider

  • 憂鬱的高中生
  • ***
  • 文章數: 91
  • 阿彌陀佛!
    • 檢視個人資料
    • 獄卒的世界
回覆: PHP to 遠端MYSQL
« 回覆 #14 於: 2009-02-04 19:03 »
我不太搞得懂樓上這位大大,一直發表一些貶損人的言論,是代表什麼意思?
明明我的測試過程已經寫得很清楚從遠端用文字命令是能夠連線,也能抓到資料庫裡的資料~
還拚命地要我確認是不是防火牆的問題~
我只是差在沒說我在172.16.1.100用mysql -u test -h 172.16.1.110 -p來連線是沒問題的~

之所以不想回應只是希望就此打住,結果好像不是這樣的~是罵上癮了嗎?

我是說我個人對主機的安全會去要求,所以我會設防火牆和開SELINUX...
我應該沒有說SELINUX機車...
反而我是希望分享一下SELINUX對這種情形的管控是在於什麼設定~
樓上這位大大不知可否適可而止?
小弟應該跟你沒仇吧!

YAMAKA大大的回應和micmic3大大的回應似乎就沒有這麼強烈,
不知道您是為什麼要這樣子呢?
如果覺得回應這個主題是浪費您的時間,應該不會有人勉強您回應~
如果要回應,請回應得更有建設性一點,不需要用那麼強烈的言論~
因為那不代表您會比較強~~
班長說:有一個壞消息跟一個好消息
壞消息是今天要做出三千個沙包,
好消息是這裡沙很多~

slime

  • 俺是博士!
  • *****
  • 文章數: 1692
    • 檢視個人資料
回覆: PHP to 遠端MYSQL
« 回覆 #15 於: 2009-02-06 14:16 »
slime 解除鎖定, 原因: 已將內容與主題無關的部份先移到刪除存證區, 請各位網友對技術問題討論.
冷笑話: 我的 IP 是 127.0.0.1

ektron

  • 鑽研的研究生
  • *****
  • 文章數: 502
    • 檢視個人資料
回覆: PHP to 遠端MYSQL
« 回覆 #16 於: 2009-02-12 23:08 »
講那麼多,還是自己跑一趟火星比較快。

打開vm的ceos5.2,ip是52.88,我在10.55(win)用telnet開,的確是不行。

檢查火牆,嗯,沒開。

接著,在52.88裡面下mysql -u root -p進去。

代碼: [選擇]
[root@ceos ~]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.0.45 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> GRANT ALL PRIVILEGES ON *.* TO 'foo'@'' IDENTIFIED BY 'BLAHBLAH' WITH GRANT OPTION;
FLUSH PRIVILEGES;Query OK, 0 rows affected (0.05 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)

mysql> exit
Bye

接著,在10.55上面用telnet敲門

telnet 192.168.52.88 3306

怪怪,出現囉。

代碼: [選擇]
4
 5.0.45Hb5"F|_H,*5k=/ph;+e>D

遺失與主機的連線。


確定VM的tcp敞開大門歡迎,好!

最後用mysql manager遠端管理看看,也是一次ok。

留在火星參考看看囉,記得從火星回來囉。

請教前輩如果執行mysql -u root -p 卻出現下列的錯誤訊息
-->ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

這是代表什麼狀況呢?
謝謝

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
回覆: PHP to 遠端MYSQL
« 回覆 #17 於: 2009-02-13 00:01 »
請教前輩如果執行mysql -u root -p 卻出現下列的錯誤訊息
-->ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

這是代表什麼狀況呢?
謝謝

有拜過估狗大神了嗎!?  ::)
用錯誤訊息去搜尋就找到一堆解法..
不然就直接參考這裡吧
http://www.neo.com.tw/archives/92

fizzytsai

  • 可愛的小學生
  • *
  • 文章數: 1
    • 檢視個人資料
回覆: PHP to 遠端MYSQL
« 回覆 #18 於: 2009-11-11 23:17 »
好了!
答案出來了~
是SELINUX的問題~
因為我個人比較機車一點,堅持服務要在SELINUX開啟的狀態下運作,所以我SERVER端和CLIENT端的SELINUX有開~
而我最初測試是只有把SERVER端的SELINUX關掉,而不是把CLIENT端的SELINUX關掉~
導致誤判..
後來把CLIENT端的SELINUX關掉後是可以運作了,但是我不希望SELINUX是關掉的,所以就去試SELINUX的設定值~
最後試出來httpd_can_network_connect_db <==這個設定值關掉就好了~
也就是setsebool -P httpd_can_network_connect_db 1
然後再重新開啟APACHE就好了~~

我的系統是Fedora,架好Apache+PHP+MySQL後,要透過PHP連到遠端的MySQL,就一直有問題。
這解決了我的疑惑,真是個鳥問題,花了兩天在找這個原因。