最近要從某個雲端主機搬移整個網站到 GCP 上的 Compute Engine 虛擬主機上,作業系統是 Windows Server 2022 Datacenter。我們安裝了跟原主機一樣的 Apache2.4+php7 的環境、將程式碼整個複製到新主機上,然後把程式碼中有固定寫到舊主機 IP 的部份都改成新的 IP。新、舊主機都有 public IP address 與 private IP address,我們對應著做修改。然而,我們有個部份用到 websocket,在初始化時會給 public IP address,在舊主機上沒問題,但在新主機上改成新的位址後,卻出現錯誤訊息如下圖:
其中程式碼很單純如下:
ws1.php(35.xxx.xxx.xxx 實際填入新主機的 public IP address)
<?php
include_once("Websocket.php");
new Websocket("35.xxx.xxx.xxx","8080");
?>
Websocket.php(反白處即為報錯的第 17 行)
因為已經測試過透過網際網路可正常瀏覽網站,所以確定 public IP address 是有效的。也反覆確認過 new Websocket 的時候沒有輸入錯誤,原本以為理所當然的事情卻在 GCP 這邊遇到困難,且完全不清楚要從何處處理,是 PHP 程式要修改還是 GCP 環境有什麼地方要調整的?有注意到一個地方,就是雖然這台虛擬主機有 public IP address 可以連線,但是如果用 ipconfig -all 去查看,卻只能看到 private IP address,這點跟舊主機不同(舊主機可以查到內外兩個IP):
我也不懂為何 GCP 的網路架構是這樣,我們比較著重於軟體開發,對於網路架構這些專業技術不熟。
目前完全沒有頭緒如何解決:
尚請各位先進不吝協助與指教,非常感謝!!
這樣寫就可以了:
new Websocket("換成你 Windows 的 Private IP","8080");
(或者, 你沒有把握寫對 IP 的話, 直接綁 0.0.0.0 也可以)
你的 Windows 裡面根本沒有 Public IP, 所以 PHP 怎麼可能綁得到他?
GCP 的 Public IP 都是放在外圍的 NAT, Gateway, Load Balancer...這些網路元件上面, VM 本身裡面是不可能有 Public IP 的.
至於你外面可以連到, 那是因為他們進來的第一關就是遇到前面講的那幾個東西 (並不是直接連到 VM) 的 Public IP; 再由它們將封包轉送給只有 Private IP 的 VM 去使用, 這是 Layer 3 的運作, 你感覺不到它們的存在....
成功了!感謝 raytracy 大神!除了讓原本的功能可以正常運作外,更重要的是您的解說讓我們多少了解到底發生了什麼事。對於 NAT 等等些網路技術我只是「聽過」的程度,技術上怎麼運作其實完全不懂。但您的因果關係說明得很清楚,讓我們更了解為何改成 private IP address 就可以運作。
若我們自己亂 try 或許也會發現打 private IP address 也會跑,但是在不理解因果關係的情況下,心裡永遠會不踏實、毛毛的....懷疑將來可能在別的環節系統會出問題!在看完解說後,我們可以放心改成您所建議的作法。
再次感謝大神指導!
補充一下,GCP 也是可以帶自己的 IP 上去的
嗯,在申裝主機時好像有看到 obarisk 您說的自帶 IP 選項,不過那個就沒去研究了,也很難想像我去哪裡可以取得一個自己的 IP 放到 GCP 上面使用。此外,自帶 IP 或許也是設定在外圍那些網路元件上而不是 VM 內,若是如此我原本提問問提仍會發生。還是說自帶 IP 可以像在設定一般電腦那樣,在 VM 中的 TCP/IP 裡面設定固定 IP?
TWNIC 可以申請公司自己的 IP, 目前每次申請核發 /23:
https://ipapply.twnic.tw/
GCP 自帶 IP 的前置作業說明 (BYOIP):
https://cloud.google.com/vpc/docs/bring-your-own-ip
真是長見識了,我一直以來都以為給我 IP 的一定是拉線來家裡的 ISP,或是雲端租服務時配給的。原來,還真的可以單獨申請持有 IP。感謝 raytracy 大神提供的資訊。
是所有服務all in one的意思嗎?類似單人開發機的部屬方式?
如果都在裝在同一台上面 0.0.0.0 -> 127.0.0.1或者localhost也可以吧?
嗯,不是大系統,確實是都裝在一台上。老實說 websocket 的知識沒有學清楚,原本出發點是想說使用者透過網際網路連線過來,所以自然是給public IP address,原來給的 ip 還可以是 127.0.0.1或者localhost......感謝herrowei135大大提醒!