[WordPress] 更新後,新增套件/佈景頁面無法顯示
好久沒更新,哈哈哈~太懶惰了。
最近手動更新之後,Wordpress 建議我將 php 升級為 8.0+,畢竟當初是三四年前架的,大概是 5.8 版本(PHP 7.3 左右)。
仗著是 Docker 架的,資料也都 Volume 出來了,直接砍掉 Container 拉最新的版本。拉完還忘記要啟用 Apache 的 SSL,技能果然是放著就會忘記。
但完成了之後發現套件 / 佈景頁面沒辦法顯示,會出現以下錯誤訊息:
Warning: plugins_api(): 發生未預期的錯誤,應該是 WordPress.org 或這個網站伺服器的組態發生問題。假如持續發生相同錯誤,請前往技術支援論壇尋求協助。 (WordPress 網站無法建立與 WordPress.org 間的安全連線,請聯絡這個網站的伺服器管理員) in /var/www/html/wp-includes/functions.php
一臉茫然當然是先去問 AI,接下來 AI 要我執行以下指令:
curl -I https://api.wordpress.org/
之後就得到了這個錯誤:
curl: (6) getaddrinfo() thread failed to start
然後他就跟我說~哦這可能是因為你的 Container DNS 有問題哦!你要設定你的 DockerFile,還有 Docker 服務的預設組件,還有這個、還有那個~
我周旋在各個 AI 之間,迷失了方向,浪費了兩天 T^T。
最終了解到,最新版本的 WordPress Image 底層也有更新,getaddrinfo()
預設會開 thread 做 DNS 解析,但 Docker 的預設 seccomp profile 把這些「危險 syscall」限制掉,所以應該要調整的是 seccomp 的設定。
如果 WordPress 不是用 Docker 架設的話,應該也不會遇到這個問題吧。
🧠 為什麼「舊版 WordPress image」沒這個問題?
✅ 舊版 WordPress image(例如 6.1.x、6.2.x)大多數是基於:
- Debian 11(bullseye)
- glibc 2.31 或 2.33
curl
,getaddrinfo()
這些 function 在這些版本裡,還沒切換成 multithread 模式
🔧 換句話說:
舊版 image 用的是「單執行緒 DNS resolver」,不依賴被 seccomp 限制的 syscall,所以根本不會報錯。
🔥 新版 WordPress image 爆炸的原因?
從 Debian 12(bookworm) + glibc 2.36 開始:
getaddrinfo()
預設會開 thread 做 DNS 解析- 這些 thread 呼叫
clone
,futex
,set_tid_address
等 syscall - 但 Docker 的預設 seccomp profile 把這些「危險 syscall」限制掉
- 然後你就爆了:
getaddrinfo() thread failed to start