前言
用途:WordPress 網站可以快速部署和管理一個高效且靈活的個人、商業或自媒體應用網站。
在數位時代,建立個人品牌和線上影響力已成為不可或缺的能力,WordPress 作為全球最受歡迎的內容管理系統,不僅提供了直觀的介面和強大的功能,更具備高度的客製化彈性。本教學將帶領您使用樹莓派 5 搭配 Docker 容器化技術,建立一個專業的 WordPress 自媒體應用網站。
透過 Nginx 處理網頁請求、MySQL 管理資料庫、Redis 提供快取加速,以及各種優質外掛和主題的整合,打造一個高效能且安全的網站平台,從基礎環境建置到進階功能優化,協助您實現個人或企業的網站建置需求。
WordPress 相關名詞解釋
在這個數位時代,擁有一個屬於自己的網站已經不再是科技專家的專利。無論是記錄生活點滴的部落格、展示作品的個人頁面,還是推廣業務的專業網站,WordPress 都是一個理想的選擇。作為全球最受歡迎的網站建置工具之一,WordPress 提供了高度靈活的架構,讓初學者能夠輕鬆上手,同時也滿足進階使用者的需求。
Docker 是什麼?
Docker 是一個開源的容器化平台,用於開發、執行和部署應用程式。它讓開發者能夠將應用程式及其所需的所有環境(如程式碼、工具和設定)打包到一個標準化的單位,稱為容器(Container)。
Docker Compose 是什麼?
Docker Compose 是一個用於定義和執行多容器 Docker 應用程式的工具。它允許開發者通過一個簡單的設定檔案(通常是 docker-compose.yml)來描述應用程式的服務、網路和卷,並使用一條命令管理這些服務的啟動和執行。
Docker 環境建置
請參閱下列教學說明:
🔗 Raspberry Pi 5(樹莓派 5)- Ubuntu Server 24.04 Docker 環境安裝
Nginx 是什麼?
Nginx 是一款高效、輕量級、以事件驅動為基礎的Web 伺服器和反向代理伺服器,也可用作負載平衡器、HTTP 快取及郵件代理等用途。因其高性能和低資源消耗而廣受歡迎,特別適合處理大量同時連線和高流量的應用。
WordPress 是什麼?
WordPress 是一個以 PHP 和 MySQL 為基礎的開放原始碼內容管理系統(CMS),廣泛用於建立和管理各類型的網站,包括部落格、企業網站、電子商務平台等。
MySQL 是什麼?
MySQL 是一個開源的關聯式資料庫管理系統(RDBMS),常用於儲存和管理結構化資料,它採用SQL(結構化查詢語言)來操作資料,是網站開發中最受歡迎的資料庫之一。
WordPress 網站架設流程
- 申請域名、設定 DNS
目的:為網站建立一個容易記住且具辨識性的網址,讓使用者可以透過域名快速瀏覽網站,而不需要記住伺服器的 IP 位址。
請參閱下列教學說明:
🔗 自建免費「動態DNS (DDNS)」ChangeIP – 教學
🔗 自建免費域名(US.KG)、託管和實做 Cloudflare DDNS – 教學
🔗 Cloudflare 付費網域購買、託管和透過 API 實做 DDNS – 教學 - 啟用 SSL 憑證 HTTPS 與 CDN 服務
目的:加密網站與訪客之間的資料傳輸,提高安全性,保護敏感資訊,並提升搜尋引擎排名及使用者信任度。
請參閱下列教學說明:
🔗 Cloudflare 免費啟用 SSL 憑證 HTTPS 與 CDN 服務 – 教學 - 建置虛擬主機
目的:提供網站儲存空間和執行環境,用於存放網站的程式碼、資料庫及相關資源,並確保網站能被訪客正常瀏覽。
請參閱下列教學說明:
🔗 Raspberry Pi 5(樹莓派 5)M.2鋁合金外殼 – 開箱
🔗 Raspberry Pi 5(樹莓派 5)- 安裝 Ubuntu Server 24.04 LTS (64-bit)
🔗 Raspberry Pi 5(樹莓派 5)- Ubuntu Server 24.04 基礎環境設定
🔗 Raspberry Pi 5(樹莓派 5)- Ubuntu Server 24.04 Docker 環境安裝 - 建置 WordPress 網站
請參閱本文章下個章節的內容說明。 - 網站安全保護機制
目的:增強網站的安全性防護,透過 Cloudflare 防火牆功能限制只允許特定 IP 位址存取 WordPress 後台,防止未授權的登入嘗試。
請參閱下列教學說明:
🔗 Cloudflare 防火牆保護機制:限制 IP 存取 WordPress 後台 – 教學
建置 WordPress 網站
- 建立與切換到專用目錄
mkdir www && cd www
- 資料夾結構
www/ # 網站目錄 │ ├── .env # 環境變數檔(儲存私密資料) │ ├── docker-compose.yml # Docker Compose 設定檔 │ ├── nginx/ # Nginx 設定目錄 │ ├── nginx.conf # Nginx 主要設定檔 │ ├── conf/ # Nginx 虛擬主機目錄 │ │ └── default.conf # Nginx 虛擬主機設定檔 │ │ │ ├── html/ # 靜態資源目錄 │ │ ├── index.html # 預設靜態網頁 │ │ └── assets/ # 其他資源 (CSS, JS, 圖片等) │ │ │ ├── logs/ # Nginx 日誌目錄 │ │ ├── access.log # 存取日誌 │ │ └── error.log # 錯誤日誌 │ │ │ └── ssl/ # SSL 憑證目錄 │ ├── server.pem # Cloudflare 原點憑證 │ └── server.key # Cloudflare 私密金鑰 │ ├── wordpress/ # WordPress 資料目錄 │ ├── wp-content/ # WordPress 靜態內容 (外掛、主題、上傳檔案) │ ├── wp-config.php # WordPress 設定檔 │ └── ... # 其他 WordPress 核心檔案 │ ├── php/ # PHP 資料目錄 │ └── php.ini # 自訂 php.ini │ ├── rdeis/ # Redis 資料目錄 (快取加速) │ └── data/ # Redis 快取資料目錄 │ └── mysql/ # MySQL 資料目錄 ├── my.cnf # MySQL 主要設定檔 ├── data/ # MySQL 資料庫檔案 └── ... # 其他資料庫檔案
- 建立 .env(環境變數檔)儲存私密資料
# WordPress 環境變數設定 WORDPRESS_DB_NAME=wordpress # 資料庫名稱 WORDPRESS_DB_USER=wpuser # 資料庫使用者名稱 WORDPRESS_DB_PASSWORD=Pass01 # 資料庫使用者密碼 # MySQL 環境變數設定 MYSQL_ROOT_PASSWORD=Pass02 # 設定 MySQL root 使用者的密碼 MYSQL_DATABASE=wordpress # 資料庫名稱 MYSQL_USER=wpusr # 資料庫使用者名稱 MYSQL_PASSWORD=Pass01 # 資料庫使用者密碼
- 建立 docker-compose.yml
services: # 定義 Docker 容器服務設定 nginx: # 定義 Nginx 服務,用於反向代理和靜態資源的處理 image: arm64v8/nginx:alpine # 使用 ARM64 架構 Nginx 的精簡版 alpine 映像 container_name: nginx # 容器名稱為 nginx ports: # 定義容器對外開放的端口設定 - "80:80" # 將本機的 80 埠對應到容器內的 80 埠 (HTTP) - "443:443" # 將本機的 443 埠對應到容器內的 443 埠 (HTTPS) volumes: # 定義容器本機資料的掛載設定 # 將本機的 conf 資料夾掛載到容器內的虛擬主機設定目錄 - ./nginx/conf:/etc/nginx/conf.d # 將本機的 nginx.conf 檔案掛載到容器內 - ./nginx/nginx.conf:/etc/nginx/nginx.conf # 將本機的 html 資料夾掛載到容器內的靜態資源目錄 - ./nginx/html:/usr/share/nginx/html # 將本機的 logs 資料夾掛載到容器內的日誌目錄 - ./nginx/logs:/var/log/nginx # 將本機的 ssl 資料夾掛載到容器內的 SSL 憑證目錄 - ./nginx/ssl:/etc/nginx/ssl # 將本機的 cache 資料夾掛載到容器內的快取目錄 - ./nginx/cache:/var/cache/nginx deploy: resources: limits: memory: 512M # 預留最多記憶體 reservations: memory: 256M # 預留最少記憶體 restart: always # 容器異常關閉後自動重啟 wordpress: # 定義 WordPress 服務,用於網站內容管理 image: wordpress:latest # 使用最新版本的 WordPress 映像 container_name: wordpress # 容器名稱為 wordpress environment: # 定義容器內的環境變數 WORDPRESS_DB_HOST: mysql:3306 # 指定資料庫主機為 mysql 並使用 3306 埠 # 使用 .env 中的環境變數 WORDPRESS_DB_NAME: ${WORDPRESS_DB_NAME} # 資料庫名稱 WORDPRESS_DB_USER: ${WORDPRESS_DB_USER} # 資料庫使用者名稱 WORDPRESS_DB_PASSWORD: ${WORDPRESS_DB_PASSWORD} # 資料庫使用者密碼 WORDPRESS_REDIS_HOST: redis # 指定 Redis 主機名稱 volumes: # 定義容器本機資料的掛載設定 # 將本機的 wordpress 資料夾掛載到容器內的 WordPress 主目錄 - ./wordpress:/var/www/html - ./php/php.ini:/usr/local/etc/php/conf.d/custom.ini # 掛載自訂 php.ini depends_on: # 定義啟動順序 - mysql # 確保在啟動時,MySQL 容器已啟動 - redis # 確保 Redis 容器已啟動 deploy: resources: limits: memory: 1.5G # 預留最多記憶體 reservations: memory: 1G # 預留最少記憶體 restart: always # 容器異常關閉後自動重啟 mysql: # 定義 MySQL 服務,作為 WordPress 的資料庫 image: arm64v8/mysql:8.0 # 使用 ARM64 架構 MySQL 8.0 映像 container_name: mysql # 容器名稱為 mysql ports: # 定義容器對外開放的端口設定 - "3306:3306" # 將本機的 3306 埠對應到容器內的 3306 埠 environment: # 定義容器內的環境變數 # 使用 .env 中的環境變數 MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} # 設定 MySQL root 使用者的密碼 MYSQL_DATABASE: ${MYSQL_DATABASE} # 資料庫名稱 MYSQL_USER: ${MYSQL_USER} # 資料庫使用者名稱 MYSQL_PASSWORD: ${MYSQL_PASSWORD} # 資料庫使用者密碼 volumes: # 定義容器本機資料的掛載設定 # 將本機的 mysql 資料夾掛載到容器內的 MySQL 資料目錄 - ./mysql:/var/lib/mysql # 將本機的 my.cnf 設定檔掛載到容器內 - ./mysql/my.cnf:/etc/mysql/my.cnf deploy: resources: limits: memory: 2G # 預留最多記憶體 reservations: memory: 1G # 預留最少記憶體 restart: always # 容器異常關閉後自動重啟 redis: # 定義 Redis 服務,用於快取加速 image: arm64v8/redis:alpine # 使用 ARM64 架構 Redis 的精簡版 alpine 映像 container_name: redis # 容器名稱為 redis command: redis-server --appendonly yes # 啟用持久化(AOF 模式) ports: - "6379:6379" # 將本機的 6379 埠對應到容器內的 6379 埠 volumes: - ./redis/data:/data # Redis 資料目錄,用於儲存持久化資料 deploy: resources: limits: memory: 256M # 預留最多記憶體 reservations: memory: 128M # 預留最少記憶體 restart: always # 容器異常關閉後自動重啟
- 建立 my.cnf(路徑:./mysql)
[mysqld] skip-host-cache skip-name-resolve datadir=/var/lib/mysql socket=/var/run/mysqld/mysqld.sock secure-file-priv=/var/lib/mysql-files user=mysql pid-file=/var/run/mysqld/mysqld.pid innodb_buffer_pool_size = 3G # 設定 InnoDB Buffer Pool 大小 max_connections = 1000 # 設定最大連接數 [client] socket=/var/run/mysqld/mysqld.sock !includedir /etc/mysql/conf.d/
- 建立 php.ini(路徑:./php)
; 設定單個上傳檔案的最大容量 upload_max_filesize = 128M ; 設定單次 POST 請求的資料大小上限(應包含上傳的檔案及其他 POST 資料) post_max_size = 128M ; 設定 PHP 腳本執行的最大記憶體 memory_limit = 1024M ; 設定 PHP 腳本執行的最大時間(避免長時間執行腳本導致超時) max_execution_time = 300 ; 設定 PHP 腳本輸入的處理時間 max_input_time = 300
- 建立 nginx.conf(路徑:./nginx)
user nginx; worker_processes auto; # 定義使用的工作進程數量 error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid; events { worker_connections 1024; # 每個工作進程的最大連接數 } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; }
- 建立 default.conf (路徑:./nginx/conf)
# 處理 HTTP 請求的設定 server { listen 80; # 監聽 HTTP 請求的埠號 80 server_name 您的域名 www.您的域名; # 指定伺服器處理的域名 return 301 https://您的域名$request_uri; # 將 HTTP 請求重導向到 HTTPS } # 處理 HTTPS 請求的設定 server { listen 443 ssl; # 監聽 HTTPS 請求的埠號 443,啟用 SSL 支援 server_name 您的域名 www.您的域名; # 指定伺服器處理的域名 client_max_body_size 128M; # 設定檔案上傳最大容量 # Cloudflare 憑證設定 ssl_certificate /etc/nginx/ssl/server.pem; # 設定 Cloudflare 原點憑證 ssl_certificate_key /etc/nginx/ssl/server.key; # 設定 Cloudflare 私密金鑰 # SSL/TLS 設定 ssl_protocols TLSv1.2 TLSv1.3; # 僅支援安全的 TLS 版本 # 使用高強度加密套件,禁用不安全的算法 ssl_ciphers HIGH:!aNULL:!MD5:!PSK:!DSS:!RC4; # 提高安全性設定 ssl_prefer_server_ciphers on; # 使用伺服器的加密套件,確保安全性 # 使用共享緩存來提升 SSL 握手效率,緩存時間為 30 分鐘 ssl_session_cache shared:SSL:30m; # 設定 SSL 握手會話的過期時間為 30 分鐘 ssl_session_timeout 30m; # 強制瀏覽器僅使用 HTTPS,HSTS 有效期為 1 年,包括子域名 add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; # 將 www子域名重導向到主域名 if ($host = www.您的域名) { return 301 https://您的域名$request_uri; } # WordPress 代理設定 location / { # 將以 / 開頭的請求代理到名為 wordpress 容器的 80 埠 proxy_pass http://wordpress:80; # 傳遞請求的 Host 標頭 proxy_set_header Host $host; # 傳遞真實客戶端 IP proxy_set_header X-Real-IP $remote_addr; # 傳遞 X-Forwarded-For 標頭(記錄多個代理 IP) proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 傳遞請求的協議(HTTP 或 HTTPS) proxy_set_header X-Forwarded-Proto $scheme; } # 防止存取敏感文件 location ~ /\.(ht|git|svn) { deny all; # 禁止存取以 .ht .git .svn 開頭的檔案,保護敏感資訊 } }
若您已經在 Cloudflare 上啟用了「一律使用 HTTPS」(Always Use HTTPS)﹑「自動改寫 HTTPS」(Automatic HTTPS Rewrites),可以簡化 Nginx 的設定,避免重複功能。
請參閱下列教學說明:
🔗 Cloudflare 免費啟用 SSL 憑證 HTTPS 與 CDN 服務 – 教學刪除的項目說明
- 刪除 HTTP 轉 HTTPS 的規則
由於 Cloudflare 的 Always Use HTTPS 已經自動處理 HTTP 到 HTTPS 的重導向,這段規則變得多餘# 主域名的 HTTP 重導向已由 Cloudflare 處理(Always Use HTTPS),因此刪除相關設定 # 處理 HTTP 請求的設定 # server { # listen 80; # 監聽 HTTP 請求的埠號 80 # server_name 您的域名 www.您的域名; # 指定伺服器處理的域名 # return 301 https://您的域名$request_uri; # 將 HTTP 請求重導向到 HTTPS # }
- 刪除 www 子域名到主域名的重導向
Cloudflare 的 Always Use HTTPS 和 Automatic HTTPS Rewrites 會自動將 www 子域名重導向到主域名,Nginx 中的規則不再需要# www 子域名重導向主域名已由 Cloudflare 處理 #(Always Use HTTPS﹑Automatic HTTPS Rewrites),因此刪除相關規則 # 將 www子域名重導向到主域名 # if ($host = www.您的域名) { # return 301 https://您的域名$request_uri; # }
優化後的好處
- 減少重複設定:Nginx 和 Cloudflare 功能不再重疊,避免衝突。
- 提高效能:Nginx 無需執行多餘的重導向規則,減少處理負擔。
- 簡化管理:將 HTTPS 和子域名重導向統一交由 Cloudflare 管理,降低維護成本。
- 刪除 HTTP 轉 HTTPS 的規則
- 啟動服務
在 docker-compose.yml 檔案所在目錄,執行指令docker-compose up -d
停止服務 在 docker-compose.yml 檔案所在目錄,執行指令
docker-compose stop
重啟服務 在 docker-compose.yml 檔案所在目錄,執行指令
docker-compose restart
- 存取服務
使用瀏覽器輸入 http://您的域名 或 https://您的域名 開始建置您的 WordPress 網站 - 下拉到底下點選「繁體中文」後再點選「繼續」
- 輸入「網站標題」、「使用者名稱」、「密碼」及「電子郵件地址」,再點選「安裝 WordPress」
- 點選「登入」
- 輸入「使用者名稱」和「密碼」,再點選「登入」,就會進入 WordPress 後台
- 設定永久連結
後台點選「設定」→「永久連結」,建議將「永久連結結構」修改成「文章名稱」,再點選「儲存設定」
安裝佈景主題(免費版推薦)
- 安裝佈景主題(Astra)
後台點選「外觀」→「佈景主題」→「安裝佈景主題」
使用「Astra 主題」優點
- 快速且輕量級:載入速度快,對網站效能有幫助。
- 高度可客製:提供豐富的設計選項和自訂功能,適合各種網站需求。
- 內建範本庫與設計工具支援:提供多種範本與建置工具,方便快速建立網站。
- SEO 優化:對網站的 SEO 優化有利,提升搜尋引擎排名。
- 響應式設計:在各種設備上都能夠良好顯示。
- 多語言與 RTL 支援:支援多語言功能,適合國際化需求。
- 相容性高與擴展性強:與許多其他外掛相容,擴展功能強大。
- 免費與付費版本選擇:提供免費版本和付費版本可選擇,適合不同的預算。
- 安裝子主題(Astra Child)
點選上面的網頁連結,再點選底下的「Generate」(生成) 下載子主題 astra-child.zip(334KB)
使用「Astra 子主題」優點
- 保護自訂內容:避免父主題更新時覆蓋你的修改。
- 更容易維護:自訂樣式和功能分開管理,方便除錯和調整。
- 安全與穩定:父主題更新解決漏洞,自訂內容不受影響。
- 彈性客製化:輕鬆新增樣式、功能或修改模板檔案。
簡單說,使用子主題能讓你安全地客製化網站,並保持升級時的靈活性!
- 後台點選「外觀」→「佈景主題」→「安裝佈景主題」
- 點選「上傳佈景主題」
- 點選「選擇檔案」,瀏覽「astra-child.zip」,再點選「立即安裝」
- 佈景主題完成安裝後點選「啟用」
- 然後會有兩個 Astra 佈景主題(Astra Child、Astra),只能選擇一個主題,可以看到 Astra 子主題已經正常啟用
安裝外掛(免費版推薦)
WordPress 外掛是用來擴展網站功能的小工具,無需編寫程式碼即可使用,用途包括:
- 網站優化:SEO、速度提升、安全防護。
- 功能擴展:電商、會員系統、多語言支持。
- 內容管理:表單、流量分析、文章樣式編輯。
- 設計強化:頁面建構器、圖片壓縮。
- 社群互動:分享按鈕、即時聊天。
外掛方便又強大,但應避免安裝過多並定期更新以保持效能和安全性。
- Akismet Anti-spam
- Easy Table of Contents
- Elementor
- PrettyLinks
- Rank Math SEO
- Site Kit by Google
- Starter Templates
- UpdraftPlus
- W3 Total Cache
- WP-Optimize
- Login Lockdown
- Redis Object Cache
在 WordPress 的 wp-config.php 檔案中手動加入 Redis 的設定,這樣外掛就會連線到正確的主機,步驟如下:- 編輯 wp-config.php 在 WordPress 主目錄中,找到 wp-config.php 檔案並開啟。
- 新增 Redis 設定 在檔案的底部(/* That’s all, stop editing! Happy publishing. */ 前)新增以下內容:
// Redis 設定 define('WP_REDIS_HOST', 'redis'); // Redis 容器名稱 define('WP_REDIS_PORT', 6379); // Redis 預設埠 define('WP_REDIS_PASSWORD', 'your_redis_password'); // 如果設定了密碼,填入此處
- 重新啟用 Redis 外掛
- 前往 WordPress 管理後台,停用並重新啟用 Redis Object Cache 外掛。
- 測試連線,確認可以連線並「啟用物件快取」。
- 前往 WordPress 管理後台,停用並重新啟用 Redis Object Cache 外掛。
- 編輯 wp-config.php 在 WordPress 主目錄中,找到 wp-config.php 檔案並開啟。
- Yoast Duplicate Post
結語
透過本文的完整教學,可以在樹莓派 5 上建立一個專業的 WordPress 網站環境,從 Docker 容器化部署、Nginx 伺服器設定,到資料庫優化和快取加速,每個環節都經過精心規劃,特別是透過精選的外掛組合,如 SEO 優化工具、安全防護機制、效能加速方案等,為網站提供了全方位的功能支援。
採用 Astra 主題及其子主題的設計,更確保了網站的可維護性和擴展性,這套解決方案不僅適合個人部落格、自媒體應用,也能滿足企業網站的需求,讓您在數位時代中展現專業的形象,創造獨特的線上價值。