家裡的 Orange 光纖是 Livebox 5,光纖 1G/600M,公網 IPv4 是動態的,但這一年幾乎沒變過。我在裡面跑一台小主機當 Nginx 反代,後面掛了兩三個自用服務,憑證用 certbot 的 webroot 模式續。上個月續期開始失敗,Let’s Encrypt 回 404,但網站本身從外面訪問一切正常。
先說我做了什麼。第一步是手動跑一次續期,把日誌全打開:
sudo certbot renew --dry-run -v
錯誤很乾淨:http-01 challenge 請求 /.well-known/acme-challenge/xxx 拿到 404。我先確認 webroot 路徑和 Nginx 的 root 對得上,再看 Nginx 的 access log,發現 LE 的請求根本沒進來。問題不在 Nginx 配置,在它前面。
Orange 的 Livebox 有個「防火牆」頁面,我原本只開了 443 轉發到小主機,80 沒開。以前能續是因為那條 80 轉發還在,某次改端口時被我順手刪了。補回去之後 dry-run 就過了。但真正麻煩的是後面:續期成功之後,Nginx 還在使用舊憑證,因為我沒 reload。
所以我在續期後加了一個 deploy hook:
sudo certbot renew --deploy-hook "systemctl reload nginx"
寫進 systemd timer 或 crontab 都行,我用的是 certbot 自帶的 timer,改 /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh 更省事:
#!/bin/sh
systemctl reload nginx
記得 chmod +x。
為什麼這樣做:webroot 模式的好處是不用停 Nginx,代價是 80 端口必須真的能從外面進來。Orange 這邊 80 沒有被運營商封,但 Livebox 的轉發規則是獨立的,刪了就是刪了,不會有提示。另外 reload 和 restart 的差別在於 reload 不會斷連線,對自用服務夠了。
哪裡會失效:如果你把 80 轉發到別的地方,或者用 Livebox 的 DMZ,規則會互相蓋掉,得先確認流量到底落在哪台。我踩過一次,DMZ 開著的時候手動加的 80 轉發其實沒生效,日誌裡什麼都看不到。還有動態 IPv4 如果真變了,DNS 那邊要跟著更新,不然 LE 一樣連不進來。這點我還沒自動化,目前是靠 DDNS 客戶端,不確定它更新夠不夠快。
你們在 Orange 或 SFR 這種光纖後面跑 webroot 續期時,是怎麼確認 80 端口真的通的?我現在只能靠 dry-run,感覺有點被動。
0 条评论
还没有评论,写下第一条。