常見(jiàn)問(wèn)題
端口占用
出現(xiàn)類(lèi)似 WARNING swSocket_bind(:483): bind(0.0.0.0:9501) failed, Error: Address already in use[98]
如下錯(cuò)誤,可判定為端口被占用。
可以通過(guò) lsof
命令來(lái)查詢端口占用
> lsof -i:9501
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
php 57 root 3u IPv4 1744902 0t0 TCP *:9501 (LISTEN)
可以根據(jù)返回的 pid
使用 kill
命令來(lái)關(guān)閉占用端口的相關(guān)進(jìn)程
> kill -9 57
也可以通過(guò)修改 easyswoole
的監(jiān)聽(tīng)端口的方式啟動(dòng) easyswoole
的服務(wù),修改文件在dev.php(線上環(huán)境則應(yīng)在produce.php)中
<?php
return [
'SERVER_NAME' => "EasySwoole",
'MAIN_SERVER' => [
'LISTEN_ADDRESS' => '0.0.0.0',
'PORT' => 9501, // 此處修改 easyswoole 監(jiān)聽(tīng)端口號(hào)
...
],
'TEMP_DIR' => null,
'LOG_DIR' => null
];
然后重新啟動(dòng)服務(wù),即可成功啟動(dòng)服務(wù)。
Socket 監(jiān)聽(tīng)失敗
- 判斷是否為端口占用所導(dǎo)致的監(jiān)聽(tīng)失敗,這里還是采用
lsof
命令來(lái)查看端口
> lsof -i:9501
-
1024
以下端口需要root
權(quán)限監(jiān)聽(tīng),所以這里要特別注意
外網(wǎng)無(wú)法訪問(wèn)
注意:當(dāng)服務(wù)成功啟動(dòng)后,如果外網(wǎng)無(wú)法訪問(wèn),可以使用 telnet
客戶端查看對(duì)應(yīng)的端口是否開(kāi)放成功,前提是首先環(huán)境得有 telnet
客戶端 (具體如何安裝 telnet
客戶端請(qǐng)用戶自行百度谷歌查詢),檢查端口開(kāi)放命令如下:telnet 公網(wǎng)ip/內(nèi)網(wǎng)ip 端口號(hào)
,例如:telnet 192.168.0.1 9501
。端口開(kāi)放成功,則會(huì)立刻跳轉(zhuǎn),不成功,則會(huì)有對(duì)應(yīng)的提示。用戶可根據(jù)對(duì)應(yīng)的提示進(jìn)行判斷。
-
檢查服務(wù)監(jiān)聽(tīng)端口是否為
0.0.0.0
-
檢查防火墻是否對(duì)外開(kāi)放
> netstat -anp
// 如果相關(guān)端口被防火墻攔截,需要放開(kāi)
> firewall-cmd --zone=public --add-port=9501/tcp --permanent
如果為阿里云、騰訊云等云服務(wù)器,請(qǐng)檢查服務(wù)器安全組是否放行對(duì)應(yīng)端口。同樣可以使用上述注意事項(xiàng)的 telnet
客戶端自行檢查。
以上 shell
命令適用于 centos 7
,其它 linux
發(fā)行版請(qǐng)自行查找相關(guān)命令。
請(qǐng)求數(shù)據(jù)時(shí) DNS 報(bào)錯(cuò)
- 原因:有時(shí)會(huì)發(fā)現(xiàn)在使用
Swoole
的MySQL、HttpClient、Redis
等客戶端發(fā)送請(qǐng)求時(shí),出現(xiàn)了DNS
錯(cuò)誤,類(lèi)似于DNS Lookup resolve failed...
錯(cuò)誤,這是由于Swoole
底層對(duì)一些DNS
不是很友好。 - 解決方法:建議使用阿里云公共
DNS
,具體如何配置阿里云公共DNS
,請(qǐng)看 https://www.alidns.com/knowledge?type=SETTING_DOCS#user_linux