星期六, 1月 22, 2022

Linux 監控 CPU 使用率腳本

Linode 寄信提示 CPU 異常使用率,超過 90% 使用率,一次好幾小時。根據網路拼湊、修改出腳本來定期監控 CPU 使用率。原則上五分鐘監控一次,使用率超過 70% 觸發 log,log 寫在監控腳本同目錄下。

cpuuse=$(cat /proc/loadavg | awk '{print $3}'|cut -f 1 -d ".")
if [ "$cpuuse" -ge 70 ]; then
MESSAGE=$(date +%s).log
  echo "CPU current usage is: $cpuuse%" >> $MESSAGE
  echo "" >> $MESSAGE
  echo "+------------------------------------------------------------------+" >> $MESSAGE
  echo "Top 20 processes which consuming high CPU" >> $MESSAGE
  echo "+------------------------------------------------------------------+" >> $MESSAGE
  echo "$(top -bn1 | head -20)" >> $MESSAGE
  echo "" >> $MESSAGE
  echo "+------------------------------------------------------------------+" >> $MESSAGE
  echo "Top 10 Processes which consuming high CPU using the ps command" >> $MESSAGE
  echo "+------------------------------------------------------------------+" >> $MESSAGE
  echo "$(ps -eo pcpu,pid,user,args | sort -k 1 -r | head -10)" >> $MESSAGE

else
  echo "CPU usage OK"
fi

腳本存好,chmod +x 以後下 crontab

crontab -e
*/10 * * * * /bin/bash /opt/scripts/cpu-alert.sh

以目前使用者身份執行腳本一次(不一定跟 cron 同使用者!),確認腳本沒問題

crontab -l | grep -v '^#' | cut -f 6- -d ' ' | while read CMD; do eval $CMD; done
全文連結

星期四, 1月 20, 2022

QNAP docker 建置 nginx reverse proxy

問題背景:我開發的關鍵服務建置在公司內虛擬機(VM),虛擬機放實體 NAS( QNAP)。基於未知原因,公司內某些網段的電腦無法直連 VM,tracert 顯示路由到 default gateway 就掉。

Bug 還在協商溝通,暫時解不掉,只能先想辦法繞過。因關鍵服務大多利用 HTTP,所以決定用 nginx 建立 reverse proxy 解決。

整件事最大困難:QNAP 系統高度自製,很多資料找不到。很多工具沒有裝(例如 apt-get)。

本來考慮用 QNAP 軟體市集找 nginx,失敗,改用 container station 上。用 nginx container,以 docker volume 覆蓋設定檔。

然後發現 container station GUI 並不友好。例如 exposed port、volume 等參數每次建立 container 都要重新指定,非常麻煩。docker volume 還只能指定一整個目錄,無法只覆蓋目錄下的單一檔案,所以萬一 config 檔同目錄還有其他檔案就不好處理。

後來解法是 ssh,command line 用 docker 指令就好。container station 的 GUI 只是套殼,其實沒必要用。docker 指令操作結果也會反映在 container station 的介面上。File Station 看到的 Public 資料夾在 /share/Public。文字編輯可以用 Text Editor 就不必用沒調整過的 vi,還支援瀏覽器貼上!

QNAP 上 docker 操作 nginx 我用的指令如下:

docker run --rm -p 9080:9080 -p 8888:8888 -p 9090:9090 --name nginx -v ${PWD}/minimal.conf:/etc/nginx/nginx.conf:ro -d nginx


nginx.conf 設定檔長這樣
events {}

http {
client_max_body_size 0;

server {
listen 9080;
server_name <QNAP 內網 IP>:9080;
proxy_set_header Host <QNAP 內網 IP>:9080;

location / {
proxy_pass http://<VM IP>:80;
}
}

server {
listen 9090;
server_name <QNAP 內網 IP>:9090;
proxy_set_header Host <QNAP 內網 IP>:9090;

location / {
proxy_pass http://<VM IP>:808;
}
}

server {
listen 8888;
server_name <QNAP 內網 IP>:8888;

location / {
proxy_pass http://<VM IP>:8888;
}
}
}
port 9080 和 9090 分別對應不同 Laravel 服務。port 8888 給 jupyter-notebook 用。

jupyter-notebook 必須修改 NotebookApp.allow_origin 允許 cross origin API 不然修改會無法存檔。

nginx 設定 client_max_body_size 是避免用 notebook 上傳檔案的時候因檔案太大導致上傳失敗,設定 proxy_set_header Host 可避免 Laravel 的 redirection 錯誤導向到 VM IP。

Laravel app 也必須修改,包括:
.env
PROXY_URL = <QNAP 內網 IP>:port
PROXY_SCHEMA = http

app/Http/Middleware\TrustProxies.php
protected $proxies = [
    '**'
];

routes/web.php
$proxy_schema = env('PROXY_SCHEMA');
if (!empty($proxy_url)) {
    URL::forceRootUrl($proxy_url);
}
 
if (!empty($proxy_schema)) {
    URL::forceScheme($proxy_schema);
}

設定好後需重啟 Laravel
其他工具也可以透過 docker 使用。例如使用 git docker container 把 working directory 掛載進去做 commit。就可以繞過 QNAP 一堆東西都沒裝,偏偏還不好修改的問題。
全文連結

星期二, 1月 18, 2022

好站:小狐狸事務所

 連結

舊的站台書籤隨著換樣板全不見了 XDDD

閒逛發現的好站,部落格文章種類非常多,投資理財,大數據、深度學習、區塊練...都涉獵了。

重點是文章產量大且穩定,同樣是寫了 10+ 年的部落格,我就做不到持續產出。

其實寫筆記也是確保學習效果的好方法,單純看過可能很容易就忘,也可以留下自己曾經做過得紀錄,該勉勵自己了

全文連結

星期一, 1月 17, 2022

有趣的網路 bug

 幫公司做的土炮搜尋引擎和某些服務放在某虛擬機,稱 VirtA
VirtA 放在實體 NAS 上,稱為 NasA

公司內某些 PC,可以連 NasA 但連不到 VirtA,所有 port 都不通。tracert 顯示封包到 default gateway 就掉包。公司內不同網段的 PC  則完全正常,但產生連線問題的 PC 逐漸增加。

聯絡了資訊單位和科內真資訊大佬,做了各種諮詢和推論。最後被科內大老依照經驗找到問題,原來是 NasA 的實體網卡!讓虛擬機從不同網卡出去,bug 就不見了。

原本懷疑 routing 和 default gateway router 的問題,結果不是,真是活久見 XD

話說,我不是甲方嗎? 

---

結果空歡喜一場,問題還是在 route...

全文連結