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