DILA-edu / cbeta-api

CBETA API Developer Group
21 stars 5 forks source link

CBETA API 無回應 #41

Closed MrMYHuang closed 8 months ago

MrMYHuang commented 1 year ago

您好:

近期較頻繁的遇到兩次 CBETA API 無回應的問題,會導致 cbetaonline.dila.edu.tw 無法開啟經文之類的問題。前一次是過了幾 10 分鐘,突然就好了。 也用 ping 檢查 cbdata.dila.edu.tw,無回應。請參考以下測試:

myh@Rogers-MBA ~ % date
Thu Dec 15 23:23:16 CST 2022
myh@Rogers-MBA ~ % ping cbdata.dila.edu.tw
PING sakya.dila.edu.tw (140.131.255.137): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2
^C
--- sakya.dila.edu.tw ping statistics ---
4 packets transmitted, 0 packets received, 100.0% packet loss

阿彌陀佛

MrMYHuang commented 1 year ago

目前 (11:36 pm) CBETA API server 又突然回復正常了。

(另外 server 應該沒有開放 ping 測試,所以現在測 ping 也是收不到回應)

RayCHOU commented 1 year ago

抱歉這兩天支援國際會議,我再找時間查看看。

MrMYHuang commented 1 year ago

抱歉這兩天支援國際會議,我再找時間查看看。

謝謝您。

RayCHOU commented 1 year ago

@MrMYHuang 我對 Server 不太熟,以下檢查請指教。

  1. server 沒有擋 ping, 我在校內可以 ping 得到, 大概是學校防火牆擋的。

  2. 查 Apache error log, 在 23:09 到 23:39 之間,相關的只有這個:

[ N 2022-12-15 23:09:37.7956 147920/T4 age/Cor/CoreMain.cpp:1146 ]: Checking whether to disconnect long-running connections for process 162000, application cbdata_stable
[ N 2022-12-15 23:09:37.7971 147920/T4 age/Cor/CoreMain.cpp:1146 ]: Checking whether to disconnect long-running connections for process 207373, application cbdata_stable

這類訊息在當天 log 裡有11個,時間從 2022-12-15 00:35 開始就有了,也幾乎每天都有,我目前不知道怎麼解決它們,也不知道它們是否是造成 API 無回應的原因。

  1. 查 Ruby on Rails 的 log

3.1

F, [2022-12-15T20:42:25.032077 #148105] FATAL -- :   
ActionController::RoutingError (No route matches [GET] "/include/dialog/select_images_post.php")

類似的訊息在當天的 log 裡出現8次,似乎是有人在利用這個漏洞 試著攻擊本站。
這應該在 RoutingError 就被擋掉了,不會造成危害才對。

3.2

在 23:30 附近有多個(當天共108個) 如下 download html 參數錯誤造成的檔案不存在:

F, [2022-12-15T23:30:37.558597 #148105] FATAL -- :   
ActionController::MissingFile (Cannot read file /var/www/cbapi4/releases/20221213014053/data/download/html/T0220C_001):

這會出現如下錯誤訊息:

We're sorry, but something went wrong.
If you are the application owner check the logs for more information.

這個我可以修改程式,加檢查,回應 not found 的 JSON 資料。
如果您使用的就是 這個下載 HTML 的 API, 那很可能就是這個原因。 但是這也應該不會造成整個 API 都無回應。

以上是我目前能想到的檢查,抱歉還沒能查出原因並修正。

MrMYHuang commented 1 year ago

@RayCHOU 您好,阿彌陀佛。

我不是專門的 server 管理者,僅能以我所知幫忙。

這應該在 RoutingError 就被擋掉了,不會造成危害才對。

我也認為是這樣。

如果您使用的就是 這個下載 HTML 的 API, 那很可能就是這個原因。

我的 app 沒有使用此 API。

我認為最可能的問題是這個:

[ N 2022-12-15 23:09:37.7956 147920/T4 age/Cor/CoreMain.cpp:1146 ]: Checking whether to disconnect long-running connections for process 162000, application cbdata_stable [ N 2022-12-15 23:09:37.7971 147920/T4 age/Cor/CoreMain.cpp:1146 ]: Checking whether to disconnect long-running connections for process 207373, application cbdata_stable

找了相關資料,有人也有類似問題: https://github.com/phusion/passenger/issues/1865 我認為應該是 cbdata_stable 收到某 request 後,一直無 response,導致後續的 requests 在排隊。如果短期查不出 cbdata_stable 無回應的問題,可以加上"逾時 (timeout) 重啟 (restart)" cbdata_stable app 的機制暫時解決,待日後補上更多 log 查清原因。

我對 ruby 不熟,但有查到 Nginx + Passenger 有提供重啟 app 的功能: https://www.phusionpassenger.com/library/admin/nginx/restart_app.html#application-restart-methods cbdata_stable 可以新增一健康檢查 API, 如 /health,可以簡單回一個 http 200 或作更複雜的檢查。 只要用任何程式語言再寫另一支自動檢查程式,定時 call cbdata_stable /health,若 timeout,就重啟 cbdata_stable。另外除了重啟,建議也加上 (E-mail?) 通知功能,才能在問題發生時得知,進一步查清問題。

RayCHOU commented 1 year ago

阿彌陀佛,感謝 @MrMYHuang,您的建議很好。
目前打算這麼做:

  1. 另寫個小程式,10 分鐘 檢查一次 正式版某個網址,有沒有正常 response,如果 timeout,就 restart application. (email 通知功能,我再來看好不好做)
  2. 先在開發版加個 /health,預定明年 Q1 加到正式版。
  3. 先在開發版加 log,每個 request 進來都記錄,完成也記錄,再來檢查是哪裡沒有完成 response。這也是預定明年 Q1 加到正式版。
  4. 10分鐘 檢查的小程式,明年 Q1 開始改檢查 /health.
MrMYHuang commented 1 year ago
  1. 另寫個小程式,10 分鐘 檢查一次 正式版某個網址,有沒有正常 response,如果 timeout,就 restart application. (email 通知功能,我再來看好不好做)

"E-mail 通知"的部分若有程式套件,滿容易做的。例如 nodejs 有 nodemailer 套件,可以用 Gmail SMTP 寄信。也可以考慮用 AWS SES 寄信。

RayCHOU commented 1 year ago

"E-mail 通知"的部分若有程式套件,滿容易做的。例如 nodejs 有 nodemailer 套件,可以用 Gmail SMTP 寄信。也可以考慮用 AWS SES 寄信。

感謝提供資訊,我再來試看看。

RayCHOU commented 1 year ago

2022-12-23 17:40 起 每隔十鐘檢查正式版首頁回傳 200, 目前為止都正常。

RayCHOU commented 1 year ago

開發版已提供 Health check: https://cbdata.dila.edu.tw/dev/health 預定農曆年後 正式版 Q1 上線時提供。 (目前只是簡單回應 HTTP 200, 沒真的做什麼檢查)