[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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *