LNMP架構+wordpress實現動靜分離

WordPress簡稱WP,最初是一款博客系統,后逐步演化成一款免費的CMS(內容管理系統/建站系統)。

WordPress網站的適用場景:

  • 博客

  • 企業官網

  • 作品集網站

  • 電商平臺

  • 線上教育系統

  • 論壇和社群網站

  • 甚至會員系統訂閱內容平臺……

1 環境說明

系統安裝軟件IP服務角色
centos7nginx+mysql數據庫192.168.42.28代理服務器
centos7nginx+wordpress(加載靜態資源)192.168.42.29靜態服務器
centos7nginx+php+wordpress(加載動態資源)192.168.42.30動態服務器

軟件安裝略

2 代理服務器配置

vim wordpress.conf

upstream static {server 192.168.42.29:8080;
}
?
upstream dynamic {server 192.168.42.30:80;
}
?
server {listen 80;server_name 192.168.42.28;
?location / {proxy_pass http://dynamic;proxy_set_header Host $http_host; ? # 保留原始請求的 Host 頭proxy_set_header X-Real-IP $remote_addr; ? # 傳遞客戶端的真實 IPproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ?# 添加客戶端 IP 到代理鏈proxy_set_header X-Forwarded-Proto $scheme; ? # 傳遞原始請求協議(http/https)}
?# 靜態資源:WordPress 的 uploads、themes、plugins 目錄location ~* ^.+\.(css|js|jpg|jpeg|png|gif|svg|ico|woff|woff2|ttf|eot)$ {rewrite ^/wordpress(/.*)$ $1 break; ?# 移除路徑前綴proxy_pass http://static; ?# ← WordPress根目錄expires 30d;add_header Cache-Control "public, no-transform"; # 允許所有緩存(包括 CDN),禁止代理修改內容(如壓縮圖片)proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;
?# 調試日志(生產環境可移除)access_log /var/log/nginx/static-access.log;error_log /var/log/nginx/static-error.log notice;}
}

改完重啟nginx:

systemctl restart nginx

此節點需要安裝mysql數據庫,安裝過程略。

數據庫需要創建一個wordpress庫,并創建一個wordpress用戶用來給其他節點連接數據庫,并賦予這個用戶這個庫的權限。

CREATE DATABASE wordpress; ?# 創建一個新的數據庫
CREATE USER 'wordpress'@'%' identified with mysql_native_password by 'Nebula@123'; # 創建一個新用戶
GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'%'; ?# 賦予用戶對 “wordpress” 數據庫的全部權限。
FLUSH PRIVILEGES;

3 靜態服務器配置

vim static.conf

server {listen 8080;server_name 192.168.42.29;
?# 添加wordpress路徑層location /wordpress {alias /opt/wordpress; ?# 使用alias精確匹配路徑try_files $uri $uri/ =404; # 按順序嘗試訪問文件或目錄,如果都找不到,則返回404。}
?location ~* ^.+\.(css|js|jpg|jpeg|png|gif|svg|ico|woff|woff2|ttf|eot)$ {root /opt/wordpress;}
}

改完重啟nginx服務

systemctl restart nginx

4 動態服務器配置

wordpress版本跟php版本對應關系:

WordPress 版本最低支持 PHP 版本推薦 PHP 版本
4.xPHP 5.2.4PHP 5.6 – 7.1
5.xPHP 5.6PHP 7.0 – 7.4
6.0 – 6.2PHP 5.6PHP 7.4 – 8.2
6.3 – 6.5PHP 7.0PHP 7.4 – 8.3
6.6 – 6.8+PHP 7.2PHP 7.4 及以上

wordpress這里我選擇5.x的版本,centos 7 默認的 php 版本為5.4,太多老舊,因此我們需要升級php

# 執行下面的命令升級軟件倉庫
rpm -Uvh https://mirror.webtatic.com/yum/el7/epel-release.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
?
# 執行下面的命令刪除php
yum remove php-common
?
# 安裝php 5.6版本(php56w-devel這個不是必需的)
yum install -y php56w php56w-opcache php56w-xml php56w-mcrypt php56w-gd php56w-devel php56w-mysql php56w-intl php56w-mbstring
?
# 如果是nginx ,則還需要安裝 php56w-fpm
yum install php56w-fpm -y

啟動php服務

systemctl restart php-fpm

下載wordpress

 wget https://cn.wordpress.org/wordpress-5.6.14-zh_CN.tar.gz

解壓wordpress到nginx發布目錄,并配置數據庫連接

tar -zxvf wordpress-5.6.14-zh_CN.tar.gz -C /usr/share/nginx/html/
cd /usr/share/nginx/html/wordpress
cp wp-config-sample.php wp-config.php
vim wp-config.php

編輯wp-config.php文件23-32行關于數據庫連接的相關信息,確保配置正確。

配置nginx訪問fastcgi進行php解析

vim php.conf

server {listen 80;server_name 192.168.42.30;
?location / {root ? /usr/share/nginx/html;index ?index.html index.htm index.php;}
?location ~ \.php$ {root ? ? ? ? ? /usr/share/nginx/html;fastcgi_pass ? 127.0.0.1:9000;fastcgi_index ?index.php;fastcgi_param ?SCRIPT_FILENAME  $document_root$fastcgi_script_name;include ? ? ?  fastcgi_params;}
}

重啟nginx服務

systemctl restart nginx

5 訪問測試

瀏覽器訪問“http://代理服務器IP地址/wordpress”進入安裝向導。

這里我的代理服務器為192.168.42.28,因此地址為http://192.168.42.28/wordpress

設置站點標題、管理員賬號、密碼和郵箱,并單擊“安裝 WordPress”。

參數說明
站點標題WordPress網站名稱。
用戶名WordPress管理員名稱。
密碼可以使用默認的密碼或者自定義密碼。請勿重復使用現有密碼,并確保將密碼保存在安全的位置。
您的電子郵箱地址接收通知的電子郵件地址。

安裝完成后,彈出安裝成功界面。

單擊“登錄”,或者瀏覽器訪問“http://服務器IP地址/wordpress/wp-login.php”,輸入用戶名/電子郵箱地址和密碼后單擊“登錄”,進入WordPress。

登錄成功后進入主界面,就可以愉快玩耍了。

?

6 過程中問題解決

6.1 問題現象和舊配置

原來舊的配置,在做的過程中,遇到無法加載頁面樣式,導致靜態頁面訪問都是404(瀏覽器F12打開查看有很多靜態資源404)。

# 代理服務器配置
upstream static {server 192.168.42.29:8080;
}
?
upstream dynamic {server 192.168.42.30:80;
}
?
server {listen 80;server_name 192.168.42.28;
?location / {proxy_pass http://dynamic;proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}
?# 靜態資源:WordPress 的 uploads、themes、plugins 目錄location ~* ^.+\.(css|js|jpg|jpeg|png|gif|svg|ico|woff|woff2|ttf|eot)$ {proxy_pass http://static; ?# ← WordPress根目錄expires 30d;add_header Cache-Control "public, no-transform";try_files $uri =404;proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}
}
# 靜態服務器配置為
server {listen 8080;server_name 192.168.42.29;
?location / {root /opt/wordpress;index index.php;}
?location ~* ^.+\.(css|js|jpg|jpeg|png|gif|svg|ico|woff|woff2|ttf|eot)$ {root /opt/wordpress;}
?
}

6.2 問題分析

分析可能的原因

  1. 靜態資源的路徑問題:當我們訪問http://192.168.42.28/wordpress/時,頁面會加載一些靜態資源,比如CSS文件。這些靜態資源的URL路徑可能是以/wordpress/開頭的。但是我們的靜態服務器配置中,root是/opt/wordpress,那么靜態服務器期望的路徑是/opt/wordpress下的文件。然而,當我們請求一個CSS文件時,例如http://192.168.42.28/wordpress/wp-content/themes/style.css,代理服務器會將其代理到靜態服務器的/wordpress/wp-content/themes/style.css路徑,而靜態服務器會在/opt/wordpress/wordpress/wp-content/themes/style.css路徑下尋找文件,這顯然是不正確的,因為我們的wordpress文件應該直接位于/opt/wordpress下,而不是還有一級wordpress目錄。

  2. 另外,動態服務器上,root是/usr/share/nginx/html,那么WordPress程序應該放在該目錄下。同樣,如果我們將WordPress放在/usr/share/nginx/html/wordpress目錄下,那么訪問路徑應該是http://192.168.42.28/wordpress/,這樣動態服務器需要能夠正確解析到/usr/share/nginx/html/wordpress目錄下的文件。

  3. 靜態服務器的配置中,我們設置了兩個location塊,但是都沒有處理/wordpress/路徑下的靜態文件。靜態服務器的root設置為/opt/wordpress,那么當請求/css/style.css時,它會去/opt/wordpress/css/style.css找。但是我們的請求是/wordpress/wp-content/...,所以靜態服務器需要知道文件在/opt/wordpress/wordpress/wp-content/...?這顯然不對。

總結原因:

  1. 路徑不匹配

    • 訪問URL:http://192.168.42.28/wordpress/

    • WordPress生成的靜態資源URL路徑為:/wordpress/wp-content/themes/.../style.css

    • 靜態服務器(192.168.42.29)的root目錄是/opt/wordpress,它期望的請求路徑是/wp-content/...(無/wordpress前綴)

    • 實際請求路徑包含/wordpress前綴,導致靜態服務器在/opt/wordpress/wordpress/...路徑下查找文件(路徑錯誤)

  2. 配置缺陷

    • 代理服務器的靜態location直接轉發原始URI(含/wordpress前綴)到靜態服務器

    • 靜態服務器未處理/wordpress路徑前綴

6.3 解決方案

修改靜態服務器配置

在靜態服務器的Nginx配置中添加/wordpress路徑解析:

server {listen 8080;server_name 192.168.42.29;
?# 關鍵修改:添加wordpress路徑層location /wordpress {alias /opt/wordpress; ?# 使用alias精確匹配路徑,將請求中的/wordpress映射到物理路徑/opt/wordpresstry_files $uri $uri/ =404;}
?location ~* ^.+\.(css|js|jpg|jpeg|png|gif|svg|ico|woff|woff2|ttf|eot)$ {root /opt/wordpress;}
}

修改代理服務器配置

在代理服務器的靜態location中重寫URI路徑:

location ~* ^.+\.(css|js|jpg|jpeg|png|gif|svg|ico|woff|woff2|ttf|eot)$ {# 關鍵修改:移除URI中的/wordpress前綴rewrite ^/wordpress(/.*)$ $1 break; ?# rewrite規則將/wordpress/wp-content/...重寫為/wp-content/...proxy_pass http://static;... # 其他配置保持不變
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/91040.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/91040.shtml
英文地址,請注明出處:http://en.pswp.cn/web/91040.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

智慧燈桿:不止于照明,塔能科技的城市感知網絡野心

當夜幕悄然降臨,城市里的路燈便依次亮了起來,它們可不單單照亮了行人前行的路以及車輛行駛的道路,實際上還在悄無聲息地經歷著一場變革。現如今的路燈,早已不再僅僅充當單純的照明工具這么一個角色了,而是逐漸轉變成了…

【Linux內核模塊】調試技巧

內核模塊開發最讓人頭疼的不是寫代碼,而是調試 —— 代碼編譯通過了,加載后卻要么沒反應,要么直接讓系統崩潰。這就像在黑屋子里修機器,看不見摸不著。其實內核調試有一套成熟的工具箱,掌握這些工具和技巧,…

RK3568筆記九十一:QT環境搭建

若該文為原創文章,轉載請注明原文出處。 記錄按照正點原子給的手冊搭建QT環境 參考《09【正點原子】ATK-DLRK3568_Qt開發環境搭建V1.2.pdf》 一、安裝 1、下載 https://mirrors.sau.edu.cn/qt/archive/online_installers/4.6/qt-unified-linux-x64-4.6.0-online.run 2、賦…

面試實戰,問題十六,Java面試,消息隊列,如何避免消息重復消費,怎么回答

在Java面試中,關于消息隊列如何防止消息被重復消費的問題,可以從以下幾個方面進行回答,結合系統架構設計、消息隊列機制和業務邏輯處理,確保在不同場景下實現消息的冪等性。 1. 消息隊列重復消費的根本原因 消息重復消費的根本原因…

PDF轉圖片實用指南:如何批量高效轉換?

將PDF轉換為圖片后,可以更方便地在演示文稿、網頁或電子相冊中使用這些資料,以便更好地展示信息。它 是一款支持多文件批量轉換的工具,可將多個 PDF 文檔一鍵轉換為圖片格式。雖然界面為英文,但操作簡單,不影響使用。你…

走入Linux的世界:編輯器Vim

嘿,各位技術潮人!好久不見甚是想念。生活就像一場奇妙冒險,而編程就是那把超酷的萬能鑰匙。此刻,陽光灑在鍵盤上,靈感在指尖跳躍,讓我們拋開一切束縛,給平淡日子加點料,注入滿滿的pa…

PyTorch中神經網絡的模型構建

要構建自定義模型,需完成兩個核心步驟:繼承 nn.Module 類;重載 __init__ 方法(初始化)和 forward 方法(前向計算) 神經網絡的構造 初始化方法(__init__) def __init__…

QML QtCharts坐標軸系統

QtCharts是Qt框架中強大的數據可視化模塊,它提供了豐富的圖表類型和靈活的坐標軸系統,能夠滿足各種數據展示需求。本文將全面介紹QML中QtCharts的坐標軸系統,包括數值坐標軸(ValueAxis)、對數坐標軸(LogValueAxis)、分類坐標軸(CategoryAxis)…

TI 2025全國電賽猜題

本科組可能的題目方向本科組器材更側重高頻信號處理、復雜控制系統、精密測量及多設備協同,可能涉及以下題目:四旋翼飛行器相關任務題目示例:設計 “基于四旋翼的 UV 光控自主導航系統”任務要求:利用四旋翼飛行器(最大…

Python自動化運維實戰指南

什么是自動化運維定義與背景自動化運維是指利用工具和腳本自動執行傳統上需要人工操作的IT運維任務,包括但不限于服務器配置管理、軟件部署、監控告警、日志分析等日常工作。隨著互聯網業務規模的擴大,傳統手工運維方式已無法滿足快速部署、規模化管理等…

k8s的csi對接GPFS

在 Kubernetes(k8s)集群中,通過 CSI(Container Storage Interface)對接 GPFS(General Parallel File System,現為 IBM Spectrum Scale)是實現高性能共享存儲的重要方案。GPFS 作為并…

HTB賽季8靶場 - era

nmap掃描 └─$ nmap -p- --min-rate 1000 -T4 10.129.137.201 -oA nmapfullscan Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-07-27 21:19 EDT Warning: 10.129.137.201 giving up on port because retransmission cap hit (6). …

Bug貓學習史#1:面向對象

在Java編程中,掌握幾個核心概念對深入學習至關重要:類屬性建議采用包裝類以提升靈活性;建造者模式中this關鍵字能有效簡化對象構建過程;static關鍵字涉及類的加載機制;接口默認使用public修飾符并支持默認方法實現&…

優測推出HarmonyOS全場景測試服務,解鎖分布式場景應用卓越品質!

隨著HarmonyOS NEXT“純血鴻蒙”的全面商用,生態正以前所未有的速度重構終端操作系統格局。對于APP廠商而言,應用測試需要從單一設備思維向場景化服務驗證轉變。優測云服務平臺正式推出 HarmonyOS全場景測試解決方案,針對鴻蒙系統提供功能測試…

二層環路與三層環路:原理、區別與解決方案全解析

網絡環路是網絡運維中最常見也最具破壞性的問題之一。本文將深入淺出地解析二層環路和三層環路的核心概念,通過對比分析幫助讀者全面理解這兩種環路的形成機制、危害表現及解決方案。一、環路問題概述 1.1 什么是網絡環路 網絡環路是指數據包在網絡中循環傳輸無法到…

Python爬蟲庫性能與選型實戰指南:從需求到落地的全鏈路解析

目錄 一、性能基準測試:用數據打破認知誤區 1. 靜態頁面采集:效率與資源的終極對決 2. 動態頁面渲染:速度與真實性的博弈 二、場景化選型矩陣:從需求到工具的精準映射 1. 小規模快速原型開發(≤1000頁)…

uni-app switch(開關選擇器) BUG

uni-app switch(開關選擇器) BUGBUG:uni-app中的switch的checked屬性并不能根據根據綁定的動態數據進行調整switch開關選擇器(BUG)switch開關選擇器(BUG) - 我的使用用途switch開關選擇器&#…

微服務架構中的資源調度與負載均衡實踐

更多云服務器知識,盡在hostol.com在今天這個快速發展的數字化時代,微服務架構已經成為了現代企業系統開發的主流。隨著技術的不斷進步,企業的業務需求也在不斷地變化,傳統的單體架構已經無法滿足日益復雜的應用需求。微服務架構&a…

Rust Web 全棧開發(十一):WebAssembly 嘗鮮

Rust Web 全棧開發(十一):WebAssembly 嘗鮮Rust Web 全棧開發(十一):WebAssembly 嘗鮮什么是 WebAssembly?安裝 wasm-pack 和 cargo-generate使用項目模板構建項目生成網頁安裝依賴項在 www 中使…

Thymeleaf實戰:SpringBoot用戶管理系統

Thymeleaf 示例代碼下面是完整代碼示例,幫助理解 Thymeleaf 語法和后端代碼的配合:1. 用戶實體類 (User.java)/*** 用戶實體類*/ public class User {private Long id; // 用戶IDprivate String name; // 用戶名private String email; /…