網路延遲與連線優化
要提升兩台主機間的溝通效率,首要任務是減少網路延遲。如果這兩台 VPS 位在同一個機房,請務必使用內網 IP(Private IP)進行連線,不要走公網 IP。內網傳輸不只速度快、頻寬不受限,還能省下流量費用。如果機房支援虛擬私有網路(VPC),也建議將兩者放在同一個 VPC 網段。
在 Linux 系統層面,可以調整 TCP 堆疊參數來優化連線回收速度。當 WordPress 頻繁讀取資料庫時,會產生大量短暫連線,透過修改 /etc/sysctl.conf 並開啟 net.ipv4.tcp_tw_reuse,可以讓系統更有效率地重複使用連線,避免因等待連線關閉導致的延遲。
資料庫連線技術優化
傳統的資料庫連線方式是每次請求都要重新握手,這會消耗大量時間。建議在 WordPress 主機端安裝並配置持久連線(Persistent Connections)。在 PHP 設定中啟用 mysqli.allow_persistent,或是在 WordPress 的資料庫設定中調整,讓 PHP 與 MySQL 之間維持長連線,避免反覆登入登出的開銷。
另外,如果資料庫查詢量極大,可以在兩台主機之間架設資料庫代理(Database Proxy),例如 ProxySQL。它可以處理連線池(Connection Pooling),將大量前端請求整合進少數幾個後端長連線,對提升高併發環境下的效率非常有幫助。
軟體層與快取機制
WordPress 預設每次載入頁面都會去資料庫撈資料,這對遠端資料庫來說負擔很大。建議安裝 Redis 或 Memcached 作為 Object Cache。當 WordPress 讀取過一次資料後,就直接存在主記憶體中,下次再有人訪問同一篇文章時,WordPress 會直接從記憶體拿資料,根本不需要跨過網路去問 MySQL 主機。
最後要檢查 MySQL 主機的 my.cnf 設定。確保 bind-address 綁定在內網 IP,並且檢查 max_connections 是否夠大。另外,如果在內網環境,可以關閉 MySQL 的 DNS 反向解析功能(在設定檔加入 skip-name-resolve),這能防止 MySQL 在每次連線時都去查主機名,直接提升連線反應速度。
MySQL 主機連線優化
在 MySQL 主機的設定檔(通常是 /etc/mysql/mysql.conf.d/mysqld.cnf)中,有幾個關鍵點可以調整。最重要的是關閉 DNS 反解,因為這常是導致連線延遲數秒的元兇。
Ini, TOML
[mysqld]
# 禁用 DNS 反向解析,直接用 IP 驗證,速度最快
skip-name-resolve
# 增加最大連線數,避免 WordPress 併發高時被拒絕
max_connections = 500
# 調整等待逾時,避免無效的長連線佔用資源
wait_timeout = 600
interactive_timeout = 600
修改完畢後,記得重啟 MySQL 服務。
WordPress 端的 Object Cache
與其優化連線,不如減少連線。在 WordPress 這台 VPS 安裝 Redis,並搭配 Redis Object Cache 外掛。這樣重複的資料庫查詢結果會直接存在記憶體,減少跨主機存取 MySQL 的次數。
如果你使用的是 Ubuntu,可以快速安裝:
sudo apt install redis-server php-redis
安裝後在 WordPress 後台啟用外掛,並將資料庫主機地址改為內網 IP。
WordPress 主機的重點
這台主機扮演的是發起請求的角色。它會產生大量的短暫連線去詢問資料庫,因此最重要的參數是 net.ipv4.tcp_tw_reuse = 1。
由於 PHP 處理完請求後會關閉連線,這些連線在 Linux 系統中會進入 TIME_WAIT 狀態,佔用連接埠(Port)。開啟這個參數可以讓 WordPress 主機更快速地回收這些舊連線,避免在流量高峰時因為連接埠用盡而導致連線失敗或變慢。
MySQL 主機的重點
這台主機扮演的是接收請求的角色。它的壓力來自於同時要處理非常多個來自 WordPress 的連線請求,因此最重要的參數是 net.core.somaxconn。
當瞬間湧入大量查詢時,如果 MySQL 來不及處理,這些請求會先被放在系統的監聽佇列(Listen Queue)中。將這個數值調大(例如 4096),可以防止在高負載時請求被直接丟棄(Packet Drop),確保連線穩定不中斷。
具體操作建議
請在兩台主機分別執行以下步驟:
- 編輯設定檔:
sudo nano /etc/sysctl.conf - 將剛才提到的參數貼在檔案最末端。
- 存檔離開後執行:
sudo sysctl -p
如果你之後發現資料庫主機的 CPU 負載過高,那可能就不是網路連線的問題,而是需要調整 MySQL 的 innodb_buffer_pool_size 等記憶體參數。
你想先檢查目前的網路連線狀態,看看是否有大量 TIME_WAIT 堆積嗎?
WordPress 主機的優化建議
這台主機主要是作為 Client 端頻繁發起請求。重點在於加速連線回收與擴大發送端緩衝,避免因為連接埠(Port)回收不及導致的連線延遲。
# 允許將 TIME_WAIT 狀態的連線重新用於新的 TCP 連線
net.ipv4.tcp_tw_reuse = 1
# 增加系統同時保持 TIME_WAIT 的最大數量
net.ipv4.tcp_max_tw_buckets = 50000
# 擴大本機暫時連接埠的範圍,增加可同時建立的連線數
net.ipv4.ip_local_port_range = 1024 65535
# 增加 TCP 傳輸與接收的緩衝區最大值(16MB)
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
# 增加接收封包的排隊佇列
net.core.netdev_max_backlog = 5000
# 調整虛擬記憶體交換傾向
vm.swappiness = 10
MySQL 主機的優化建議
這台主機作為 Server 端負責接收大量併發連線。重點在於擴大監聽佇列(Listen Queue)以及優化記憶體對大型資料傳輸的處理能力,防止請求在系統層級就被丟棄。
# 增加系統同時處理的監聽佇列上限,防止高併發連線溢出
net.core.somaxconn = 8192
# 增加接收封包的排隊佇列
net.core.netdev_max_backlog = 5000
# 擴大 TCP 緩衝區最大值,有利於大型查詢結果的傳輸
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
# 開啟連線重用(Server 端同樣建議開啟)
net.ipv4.tcp_tw_reuse = 1
# 增加 TCP SYN 隊列長度,容納更多等待握手的連線
net.ipv4.tcp_max_syn_backlog = 4096
# 減少快取壓力,優先使用記憶體
vm.swappiness = 10
套用與驗證步驟
將上述內容分別複製到對應主機的 /etc/sysctl.conf 檔案末尾。請確保不要重複設定相同的變數,如果有重複的請以我給的新數值為主。
套用設定請執行:
sudo sysctl -p
驗證連線狀況:
你可以執行 netstat -n | awk '/^tcp/ {print $6}' | sort | uniq -c 來檢查目前連線狀態。如果看到大量的 TIME_WAIT 且你的連線效率還是沒提升,那我們就得從 PHP-FPM 的連線池(Pool)設定下手。