[WordPress] 實體主機 Server 版本系統的 IPv6 網路問題

本篇文章更新時間:2025/04/21
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣新台幣 贊助支持。


最近買了個新玩具,Intel 第 12 代 CPU N200 的小電腦,終於實現真掛機的夢想(?)。

早期買的 PI 儘管也是好玩,但就是無法長時間待機提供服務,時不時的碰到 SD 卡損毀整台系統要重新安裝,這就讓我放棄了。

這台主機安裝 Ubuntu server 24.04 版本都沒什麼問題,測試跑一些服務也都順,就唯獨跑我最熟悉的 WordPress 會碰到 cURL 連線超時的問題。

一測之下,才發現原來卡在 DNS 查詢後 cURL 在 IPv6 那段多繞了些路,導致碰到 WordPress 預設的 5 秒請求超時設定。

使用這程式碼片段可以打開限制:
add_filter('http_request_timeout', function($timeout) {
return 15; // 秒數延長
});

這問題還真的是有點小難找,因為主機端的 DNS Server 也早就指向 1.1.1.1,使用 dig 查詢也超快,完全不會察覺是查詢當下的問題。

結論就是 cURL 透過 DNS 機制查詢到的網路服務位置中,有包含 IPv6 的地址,但我的網路並沒有 IPv6 的服務,所以就繞路了。

測試方法:

curl -4 https://example.com
curl -6 https://example.com

#!/bin/bash

curl  -v -w @- -o /dev/null -s "$@" <<'EOF'
    time_namelookup:  %{time_namelookup}\n
       time_connect:  %{time_connect}\n
    time_appconnect:  %{time_appconnect}\n
   time_pretransfer:  %{time_pretransfer}\n
      time_redirect:  %{time_redirect}\n
 time_starttransfer:  %{time_starttransfer}\n
                    ----------\n
         time_total:  %{time_total}\n
EOF

上方 Bash 的用途是量測 cURL 請求中各階段所花費時間,可以知道在哪個階段就花太多時間。

這個問題還不是單純把系統的 IPv6 支援關閉就好,還要順便透過 Unbound DNS 快取服務來最佳化一番。

停用主機的 IPv6 網路服務

#!/bin/bash
sudo bash -c 'cat <> /etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
EOF'
sysctl -p /etc/sysctl.conf

跑一次上面的 bash 就完成。

安裝與設定 Unbound 的 DNS 快取服務

安裝方法:

apt update && apt install unbound -y

設定本機 DNS 查詢先透過這套服務

vi /etc/systemd/resolved.conf

將其中 DNS= 欄位解註解,並填上 127.0.0.1 值後儲存並離開。

指令: systemctl restart systemd-resolved 重啟使生效設定。

編輯 Unbound 設定檔案,加入下面設定:

server:
    interface: 127.0.0.1
    access-control: 127.0.0.0/8 allow
    do-ip6: no
    verbosity: 1
    cache-max-ttl: 86400
    cache-min-ttl: 300
    msg-cache-size: 64m
    rrset-cache-size: 128m
    num-threads: 4 #按照主機核心數設定

remote-control:
    control-enable: no
    control-interface: 127.0.0.1
    control-interface: /run/unbound.ctl

forward-zone:
    name: "."
    forward-addr: 1.1.1.1
    forward-addr: 8.8.8.8

檢查設定沒錯誤後就使用 systemctl restart unbound 重新啟動,完成!關鍵就是只綁 IPv4 介面與關閉 IPv6 的綁定。

預設把 IPv6 關閉會導致這服務出錯開不起來,所以延伸的設定也有必要。

Unbound 服務常用指令:

sudo unbound-checkconf #檢查設定檔是否正確
sudo systemctl reset-failed unbound #重置錯誤重啟次數
sudo systemctl start unbound #啟動服務

後記

如此把這問題解決後,速度得到大幅提升啊!WordPress 也真的不是這麼單純的本機環境應用程式了,有很多也要對外的請求在背後執行,要是一個沒注意,網站變慢找不到原因可能是很常見的事吧!

而這次也算是體會到常用雲端別人打理好的環境也會讓自己意外的掉進坑裡,學一課XD


Share:

作者: Chun

資訊愛好人士。主張「人人都該為了偷懶而進步」。期許自己成為斜槓到變進度條 100% 的年輕人。[///////////____36%_________]

發佈留言

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


文章
Filter
Mastodon