背景:使用 netty-socketio 搭配前端的socket.io.js 做實時的系統通知。
netty-socketio的host屬性填寫localhost或本地ip都沒問題在本地測試運行正常。部署到阿里雲服務器上時,心想此時的host屬性值應爲該公網ip,這樣配置完後啓動就報錯了。。。
Caused by: java.net.BindException: Cannot assign requested address: bind
意思就是說配置的ip綁定失敗,心想這按理說是沒事的,應該是阿里雲做了什麼設置。
解決辦法:
host屬性值變成阿里雲的內網ip,前端訪問時依舊使用外網ip,或是nginx反向代理也可以。
ps:內網ip怎麼獲得?
1、若你能登錄進雲服務器的Linux系統的話,使用 ifconfig 指令就可以獲取。
2、若你能登錄阿里雲的雲服務器後臺管理的話,在 “實例” 裏面看到的私網ip就是了。
一個題外話:
以前用nginx做反向代理時,做了個這樣的配置:
location ~ /api/ {
proxy_pass http://114.215.144.30:9001; #114.215.144.30 爲公網ip
}
我當時覺得被代理的ip+端口,應該也能被直接訪問到,爲此還專門對外開放了9001,才能訪問通了。但是這樣nginx就起不到了保護被代理的服務器,隱藏真實ip和端口的作用了。但當時時間比較緊,就沒再管這個事。這次遇到了上面這個問題,思考了一下爲什麼內網ip就可以,又聯想了一下這個問題,頓時恍然大悟。反向思考一下,覺得這個反向代理時也可以使用內網ip,若成功了話,也不用在額外開放這個被代理的端口了,這樣纔是正確的反向代理。於是我試了一下,真的可以。