2024-05-29

[Certbot] ImportError: cannot import name 'appengine' from 'urllib3.contrib' ...

*Certbot 是一個由 Let's Encrypt 的組織維護的一個用來申請加密憑證的工具

之前公司網站的 https 憑證是透過 Certbot 的來輔助申請使用的,公司網站的系統是 Ubuntu 18.04 LTS ,在安裝好 Certbot 後,它會在 /etc/cron.d 中增加一個 certbot 的排程,定期是每天的「0 */12 * * *」會執行 renew 檢測操作

憑證一般申請後的有效期是三個月,但一般應該是可以提前幾天就讓你 renew 展延

而最近我會發現異常是因為在五月初收到來自 Let's Encrypt Expir 寄過來告知還有 xx 天就要過期了,要記得去 renew ,當時我就覺得怪怪的,因為公司這個憑證已經運行有幾年了,我還是第一次收到通知信,不過當時我還有別的事在忙,想說因為有排程會去自動 renew 也就沒有多想

直到前幾天我又收到同一封告知即將要過期的信,我才認真的去檢查

一開始先查看是不是 /etc/cron.d/certbot 是不是被刪或裡面的排程設定被動過了,但檢查後覺得是正常的,再來就是去檢查排程執行時所記錄的 syslog ,在查看「grep -i "certbot" /var/log/syslog」後發現,certbot 的排程執行時有異常,大至的訊息如下

systemd[1]: Starting Certbot
certbot[...]: Traceback (most recent call last):
certbot[...]:  File "/usr/lib/python3/dist-packages/requests_toolbelt/_compat.py"....
...
...
...
certbot[...]: ImportError: cannot import name 'appengine' from 'urllib3.contrib' ...
systemd[1]: certbot.service: Main process exited, code=exited, status=1/FAILURE
systemd[1]: certbot.service: Failed with result 'exit-code'.
systemd[1]: Failed to start Certbot

在 google 之後,大部份的建議都是將 python library 中的 urllib3 給移除就可以了,然後執行「sudo pip uninstall urllib3」,再輸入 y 確定要移除
*用 sudo 是因為 certbot 是以 root 身份執行的,所以 urllib3 的套件是安裝在 root 的 python library 之下

然後再手動讓 certbot 跑 renew 就沒有出現上述的異常訊息,而且憑證也更新了
*手動 renew 指定「sudo certbot -q renew」

2024-05-25

[MQTT] 1 - 試著來架設 MQTT - RabbitMQ

*先說個前言,其實在下個人覺得,直接用 docker 來創建可以方便許多

前言2: 啥是 MQTT?是 Message Queuing Telemetry Transport 的縮寫,叫做「訊息隊列遙測傳輸」的意思,但這是啥東東,其實詳細的說明在下也不是很會講,但在下粗略的理解,就是訊息即時相關傳送、接收的意思,透過在指定的 Topic(主題) 進行發布(Publish)訊息,而有關聯的終端可以訂閱(Subscribe)想要接收訊息的 Topic 來取得發布的訊息,而 MQTT 就是為了這個操作而設計出來的協定。

前言3: MQTT 除了可以透過 MQTT 的協定來傳送資料,它另一種傳送的方式是 WebSockets,所以對於網頁前端來說,技術上也是比較友善,上手門檻不會太高;也因為是可以 over WebSockets 的關係,所以 MQTT 的技術是可以開發成即時通訊的架構,而且還有 keep alive 的特性

前言4: Topic 是以 UTF-8 編碼為主的字串,所以...Topic name 是可以使用中文的,大小寫是敏感的,可以被用在 Topic name 的符號中,雖空白是可以用但不建議,「/」是可以用的,但它似乎是有一些定義的用法

前言5: Topic 的訂閱是可以使用 topic filter 的方式來達成一次訂閱多個 Topic 的操作,filter 有點類似 regexp 的方式,但不完全一樣,詳細還是要網路上找一下

目前以網路上能找到比較主流且相關資料比較多的 MQTT Service 平台大至上有三個
  • Kafak
  • RocketMQ
  • RabbitMQ
在下主要是先拿 RabbitMQ 來用,至於為什麼先用它,主要有幾個思維
  • 在下在用的環境主要都是 client-server 的架構,所以選 RabbitMQ
  • 在下並沒有需要高吞吐量的,所以選 RabbitMQ
  • 以前在寫 JAVA 時有吃過 JAVA 吃爆記憶體的虧,所以不會太想選 RocketMQ(註: 這只是在下個人偏見,我知道現在 JAVA 越來越優化這部份,但就是我個人偏見)
  • 之後應該也會來玩 Kafak,所以現在先玩 RabbitMQ

接下來來講講怎麼架設 RabbitMQ(以在 Ubuntu 為例)