WordPress6.7.2 新版搭建教程

  • 环境要求

    php8+  mysql5.7+
  • 目录结构

    • 示例版本:6.7.2
    wordpress
    ├── config
    │   ├── nginx
    │   │   ├── nginx.conf
    │   │   └── vhost
    │   │       └── blog.hukanfa.com.conf
    │   ├── php
    │   │   ├── php-fpm.conf
    │   │   ├── php.ini
    │   │   └── www.conf
    │   └── scripts
    │       └── starserver.sh
    ├── docker-compose.yaml
    ├── Dockerfile
    ├── html  # wordpress压缩包原始内容
    └── package
      ├── nginx-1.24.0.tar.gz
      └── wordpress-6.7.2-zh_CN.tar.gz
    • 以上目录模板下载地址
    # 百度网盘链接
    https://pan.baidu.com/s/1Yq5zOo7N538QSyJoWve40g?pwd=9k4g
    --来自百度网盘超级会员v8的分享
    # 附wordpress下载地址
    <blockquote class="wp-embedded-content" data-secret="6iMiHe0W3I"><a href="https://cn.wordpress.org/download/releases/">发行版本归档</a></blockquote><iframe class="wp-embedded-content" sandbox="allow-scripts" security="restricted" style="position: absolute; visibility: hidden;" title="《 发行版本归档 》—China 简体中文" src="https://cn.wordpress.org/download/releases/embed/#?secret=d164NxUCwt#?secret=6iMiHe0W3I" data-secret="6iMiHe0W3I" width="500" height="282" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>

33.1 前置准备

33.1.1 资源包及用户

  • 操作如下

    • 下载安装包
    mkdir package
    # 截止202504最新版本
    wget https://cn.wordpress.org/wordpress-6.7.2-zh_CN.tar.gz -P package
    # 解压到上级目录
    tar -zxvf package/wordpress-6.7.2-zh_CN.tar.gz -C ./
    mv wordpress html
    
    # nginx
    wget http://nginx.org/download/nginx-1.24.0.tar.gz -P package
    • 创建用户并指定用户ID
    useradd -u 1001 www
    # 查看用户ID 
    id www

33.1.2 Php 相关配置

  • 操作如下

    • config/php/php-fpm.conf
    ; ============================================
    ;              全局配置
    ; ============================================
    [global]
    ; 进程管理
    pid = /var/run/php-fpm/php-fpm.pid
    error_log = /var/www/logs/fpm_error.log
    log_level = warning  ; 生产环境建议warning级别
    emergency_restart_threshold = 10
    emergency_restart_interval = 1m
    process_control_timeout = 10s
    
    ; 系统资源限制
    rlimit_files = 65535  ; 文件描述符限制(适应高并发)
    rlimit_core = 0       ; 禁用core dump(安全)
    
    ; 进程转储(调试用,生产环境可关闭)
    ; process.dumpable = no
    
    ; ============================================
    ;              进程池配置 (www)
    ; ============================================
    [www]
    
    ; 用户和组
    user = www
    group = www
    listen.owner = www
    listen.group = www
    
    ; 监听方式(Unix Socket性能优于TCP
    listen = 9000
    ;listen = /var/run/php-fpm/php-fpm.sock
    listen.mode = 0660
    listen.backlog = 65535  ; 等待队列长度(预防突发流量)
    
    ; 进程管理策略
    pm = dynamic
    pm.max_children = 10    ; 计算公式: (可用内存 - 系统预留) / 单进程内存
    pm.start_servers = 4    ; 启动时进程数 = (max_spare + min_spare)/2
    pm.min_spare_servers = 4
    pm.max_spare_servers = 8
    pm.process_idle_timeout = 120s
    pm.max_requests = 500   ; 防止内存泄漏
    
    ; 资源控制
    request_terminate_timeout = 120s  ; 长请求超时时间
    request_slowlog_timeout = 60s     ; 慢日志阈值
    slowlog = /var/www/logs/fpm_slow.log
    
    ; 输出缓冲
    catch_workers_output = yes        ; 捕获worker输出
    php_flag[display_errors] = off    ; 生产环境关闭错误显示
    php_admin_value[error_log] = /var/www/logs/php_error.log
    php_admin_value[log_errors] = on
    
    ; 安全限制
    security.limit_extensions = .php  ; 仅允许执行php文件
    php_admin_value[open_basedir] = "/var/www/html:/tmp"  ; 目录访问限制
    
    ; ============================================
    ;              性能调优参数
    ; ============================================
    ; OPcache 加速
    
    ; 会话配置
    php_admin_value[session.save_handler] = files
    php_admin_value[session.save_path] = "/var/lib/php/session"
    php_admin_value[session.gc_maxlifetime] = 1440
    
    ; 文件上传
    php_admin_value[upload_max_filesize] = 64M
    php_admin_value[post_max_size] = 65M
    • config/php/php.ini
    ; ===========================================
    ;            PHP 核心生产配置
    ; ===========================================
    
    [PHP]
    ; 安全与基础性能
    expose_php = Off                   ; 隐藏PHP版本信息(安全要求)
    disable_functions = exec,passthru,shell_exec,system,proc_open,popen  ; 禁用危险函数
    memory_limit = 256M                ; WordPress建议≥128M,大型站点可设为512M
    max_execution_time = 120           ; 后台操作/导入需更长时间(默认30秒)
    max_input_time = 90                ; 请求解析最大时间(秒)
    max_input_vars = 3000              ; 避免复杂表单(如菜单设置)提交失败
    
    ; 文件上传配置
    upload_max_filesize = 64M          ; 媒体上传限制(需≥实际需求)
    post_max_size = 65M                ; 必须略大于upload_max_filesize
    file_uploads = On                  ; 确保文件上传功能开启
    
    ; 错误处理
    display_errors = Off               ; 生产环境禁止显示错误
    log_errors = On                    ; 启用错误日志
    error_log = /var/www/logs/php_error.log ; 集中记录错误
    log_errors = On
    error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED  ; 忽略提示和弃用警告
    
    ; 会话配置
    session.gc_maxlifetime = 1440      ; 会话有效期(秒)
    session.cookie_secure = 1          ; 仅HTTPS传输Cookie(需SSL)
    session.cookie_httponly = 1        ; 防止JS访问Cookie
    
    ; ===========================================
    ;              OPcache 加速配置
    ; ===========================================
    
    [opcache]
    opcache.enable = 1                 ; 必须启用加速
    opcache.memory_consumption = 256   ; 分配内存(MB),建议128-256
    opcache.interned_strings_buffer = 16 ; 字符串缓存大小(减少内存碎片)
    opcache.max_accelerated_files = 20000 ; 缓存文件数(WordPress核心+插件约2000+)
    opcache.fast_shutdown = 1          ; 快速关闭机制
    opcache.enable_cli = 0             ; CLI模式禁用缓存
    opcache.save_comments = 0          ; 不保存注释(节省内存)
    opcache.validate_timestamps = 0    ; 生产环境禁用自动检查(需手动清除缓存)
    
    ; ===========================================
    ;            文件系统与路径优化
    ; ===========================================
    
    [Session]
    session.save_path = "/var/lib/php/session"  ; 会话文件存储路径
    
    [Realpath]
    realpath_cache_size = 4096K        ; 文件路径缓存(默认16K,WordPress需增大)
    realpath_cache_ttl = 600           ; 缓存有效期(秒)
    • config/php/www.conf
    ; ===========================================
    ;          PHP-FPM 进程池配置 (生产环境)
    ; ===========================================
    [global]
    error_log = /var/www/logs/fpm_error.log
    log_level = warning
    
    [www]
    ; 基础配置
    user = www                         ; 专用低权限用户
    group = www
    listen = 9000
    ;listen = /var/run/php-fpm/php-fpm.sock  ; Unix Socket性能优于TCP
    listen.owner = www                 ; Socket文件所有者
    listen.group = www
    listen.mode = 0660                 ; Socket权限设置
    listen.backlog = 65536             ; 等待队列长度(预防突发流量)
    
    ; 进程管理(动态模式)
    pm = dynamic                       ; 适应流量波动
    pm.max_children = 10               ; 最大子进程数(根据内存计算)
    pm.start_servers = 4               ; 启动时进程数 = (max_spare + min_spare)/2
    pm.min_spare_servers = 4           ; 空闲时最小进程数
    pm.max_spare_servers = 8           ; 空闲时最大进程数
    pm.process_idle_timeout = 120s      ; 空闲进程超时回收
    pm.max_requests = 500              ; 每个进程处理请求后重启(防内存泄漏)
    
    ; 资源控制
    request_terminate_timeout = 120s    ; 单请求超时时间
    rlimit_files = 65536               ; 文件描述符限制(高并发需要)
    rlimit_core = 0                    ; 禁用core dump(安全)
    
    ; 慢日志记录
    access.log = /var/www/logs/fpm_access.log
    slowlog = /var/www/logs/fpm_slow.log
    request_slowlog_timeout = 60s      ; 记录超过15秒的请求
    catch_workers_output = yes
    ; 环境变量
    env[HOSTNAME] = $HOSTNAME
    env[PATH] = /usr/local/bin:/usr/bin:/bin
    env[TMP] = /tmp
    env[TMPDIR] = /tmp
    env[TEMP] = /tmp
    
    ; 安全限制
    security.limit_extensions = .php    ; 仅允许执行.php文件
    php_admin_value[doc_root] = /var/www/html  ; 限制文件访问范围
    php_admin_value[open_basedir] = "/var/www/html:/tmp"  ; 目录访问限制

33.1.3 Nginx相关配置

  • 操作如下

    • config/nginx/nginx.conf
    user  www;
    worker_processes  auto;
    
    events {
      worker_connections  1024;
    }
    
    http {
      include       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 /dev/stdout main;
      error_log /dev/stderr warn;
    
      sendfile        on;
      tcp_nopush      on;
      keepalive_timeout  65;
    
      # 隐藏 Nginx 版本号
      server_tokens off;
    
      # Gzip压缩配置
      gzip  on;
      gzip_min_length 1k;
      gzip_buffers 4 16k;
      gzip_comp_level 2;
      gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
      gzip_vary on;
      gzip_disable "MSIE [1-6].";
    
      # 会话保持相关配置
      proxy_connect_timeout 90;
      proxy_send_timeout 90;
      proxy_read_timeout 90;
      proxy_buffer_size 4k;
      proxy_buffers 4 32k;
      proxy_busy_buffers_size 64k;
      proxy_temp_file_write_size 64k;
    
      server {
          listen       80;
          server_name  localhost;
    
          location / {
              root   html;
              index  index.html index.htm;
          }
    
          error_page   500 502 503 504  /50x.html;
          location = /50x.html {
              root   html;
          }
      }
    
      include vhost/*.conf;
    }
    • config/nginx/vhost/blog.hukanfa.com
    server {
      listen 80;
      server_name blog.hukanfa.com;
    
      location / {
          root /var/www/html;
          index index.php;
      }
    
      location /.well-known/acme-challenge/ {
          alias /var/www/challenges/;
          try_files $uri = 404;
      }
    
      location ~ .*.php?$ {
          fastcgi_pass 127.0.0.1:9000;
          fastcgi_index index.php;
          fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name;
          include fastcgi_params;
      }
    
      location ~* .(css|js|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
          root /var/www/html;
          expires 7d;
          access_log off;
          add_header Cache-Control "public";
          try_files $uri =404;
      }
    
    }

31.1.4 启动脚本

  • 操作如下

    • config/scripts/startserver.sh
    #!/bin/bash
    
    # 1. 输出版本信息
    echo "========================================"
    echo "• PHP-FPM 版本: $(php-fpm -v | head -n 1)"
    echo "• Nginx 版本: $(/usr/local/nginx/sbin/nginx -v 2>&1)"
    echo "========================================"
    echo ""
    
    # 2. 启动 PHP-FPM(后台模式)
    echo "正在启动 PHP-FPM..."
    /usr/sbin/php-fpm -D
    if [ $? -ne 0 ]; then
      echo "【错误】PHP-FPM 启动失败!" >&2
      exit 1
    else
      echo "✓ PHP-FPM 启动成功"
    fi
    
    # 3. 启动 Nginx(前台模式,日志直接输出到控制台)
    echo "正在启动 Nginx(日志输出到控制台)..."
    exec /usr/local/nginx/sbin/nginx -g "daemon off;"
    • 注意:启动脚本中,会将nginx访问日志输出到容器控制台,需要nginx主配置文件有以下配置
    # /usr/local/nginx/config/nginx.conf
    http {
    ...
      access_log /dev/stdout main;
      error_log /dev/stderr warn;
    }

33.2 创建镜像

  • 操作步骤如下

    • Dockerfile
    # 第一阶段:仅编译 Nginx
    FROM rockylinux:9.3 as nginx-builder
    
    # 安装编译工具
    RUN dnf -y install epel-release 
      && dnf -y install gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel make
    
    # 解压并编译 Nginx
    ADD package/nginx-1.24.0.tar.gz /usr/local
    RUN cd /usr/local/nginx-1.24.0 
      && ./configure --prefix=/usr/local/nginx 
          --with-http_sub_module 
          --with-http_gzip_static_module 
      && make 
      && make install
    
    COPY config/nginx/* /usr/local/nginx/
    
    # 第二阶段:最终镜像
    FROM rockylinux:9.3
    
    # 创建 www 用户(仅在此阶段执行)
    RUN groupadd www && useradd -u 1001 -g www www
    
    # 安装 PHP 及相关扩展
    RUN dnf -y install epel-release 
      && dnf -y install 
          wget telnet vim net-tools procps-ng iputils
          php-fpm php-cli php-opcache php-pear lz4 lz4-devel php-pecl-redis
          php-mysqlnd php-pdo php-json php-xml php-curl php-gd php-mbstring php-zip php-pecl-igbinary
      && echo "extension=igbinary.so" > /etc/php-fpm.d/igbinary.ini 
      && dnf clean all
    
    # 从 nginx-builder 复制编译好的 Nginx
    COPY --from=nginx-builder /usr/local/nginx /usr/local/nginx
    
    # 配置 PHP-FPM
    COPY config/php/php-fpm.conf config/php/php.ini /etc/
    COPY config/php/www.conf /etc/php-fpm.d/
    
    # 安装 WordPress
    ADD package/wordpress-6.7.2-zh_CN.tar.gz /tmp
    
    RUN mkdir -p /var/www/{logs,html,scripts} 
      && mv /tmp/wordpress/* /var/www/html 
      && chown -R www:www /var/www 
      && rm -rf /tmp/wordpress* 
      && mkdir -p /run/php-fpm 
      && chown -R www:www /run/php-fpm
    
    COPY config/scripts/startserver.sh /var/www/scripts
    
    RUN chmod +x /var/www/scripts/startserver.sh
    
    WORKDIR /var/www/html
    
    EXPOSE 80 9000
    
    # 启动 PHP-FPM 和 Nginx
    CMD ["/bin/sh", "/var/www/scripts/startserver.sh"]
    • 创建镜像命令
    docker build -t registry.cn-guangzhou.aliyuncs.com/hukanfa/wordpress:6.7.2 .

33.3 创建容器

  • 操作如下

    • 先创建数据库
    CREATE DATABASE IF NOT EXISTS wordpress DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
    CREATE USER 'wordpress'@'%' IDENTIFIED BY 'n1*****VmSa';
    GRANT ALL ON wordpress.* TO 'wordpress'@'%';
    flush privileges;
    • docker-compose.yaml内容如下
    services:
    wordpress:
      image: registry.cn-guangzhou.aliyuncs.com/hukanfa/wordpress:6.7.2
      user: "root"
      restart: unless-stopped
      extra_hosts:
        - "major.nei.hukanfa.com:10.0.12.10"
      volumes:
        - ./html:/var/www/html
        - ./config/php/php.ini:/etc/php.ini
        - ./config/php/www.conf:/etc/php-fpm.d/www.conf
        - ./config/php/php-fpm.conf:/etc/php-fpm.conf
        - ./config/nginx/nginx.conf:/usr/local/nginx/conf/nginx.conf
        - ./config/nginx/vhost:/usr/local/nginx/conf/vhost
      ports:
        - "9001:9000"
        - "8088:80"
      healthcheck:
        test: ["CMD-SHELL", "timeout 5 bash -c 'cat < /dev/null > /dev/tcp/127.0.0.1/9000' || exit 1"]
        interval: 30s
        timeout: 5s
        retries: 3
      networks:
        wd_net:
          ipv4_address: 172.168.0.2
    
    networks:
    wd_net:
      driver: bridge
      ipam:
        config:
          - subnet: 172.168.0.0/24
    • 创建容器
    docker-compose up -d

33.4 基础配置

  • 操作如下

    • 宿主机nginx配置
    # /usr/local/nginx/vhost/blog.hukanfa.com.conf
    server {
    listen 80;
    server_name blog.hukanfa.com hukanfa.com www.hukanfa.com;
    rewrite ^(.*)$ https://$host$1 permanent;
    }
    
    server {
    listen 443 ssl;
    server_name blog.hukanfa.com hukanfa.com www.hukanfa.com;
    ssl_certificate ../certs/hukanfa.com.crt;
    ssl_certificate_key ../certs/hukanfa.com.key;
    access_log logs/blog_access.log main;
    error_log  logs/blog_error.log;
    # 添加安全头解决混合内容问题
    add_header Content-Security-Policy "upgrade-insecure-requests";
    
    location / {
      proxy_pass http://172.168.0.2;
      proxy_set_header Host $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;
    }
    
    # 处理静态文件 - 直接传递给后端
    location ~* .(css|js|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
      proxy_pass http://172.168.0.2;
      proxy_set_header Host $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;
    
      # 禁用缓存,确保从后端获取最新版本
      proxy_no_cache 1;
      proxy_cache_bypass 1;
    }
    }
    • 访问域名blog.hukanfa.com,将进行一些初始化配置
    • 填写数据库信息
    • 点击下一步
    • 最后填写站点信息
    • 完成登陆

33.5 缓存配置

  • 说明
    • 发现 WordPress 很 ,是因为 WordPress 本身的 PHP 运行机制导致的,每篇文章都要去数据库读取
    • 了支持各种功能,现在已经非常臃肿,每次请求都要加载很多东西。

33.5.1 Object Cache Pro 插件

  • 操作如下

    • 提前安装 Redis
    # 主机 密码 端口信息如下
    major.nei.hukanfa.com  26*****joNF   6389
    • html/wp-config.php 更新配置
    # 行首添加 Object Cache Pro 配置,这里需要具体token信息,可联系博主获取,或者到官网购买正式版本
    # Redis相关信息请替换
    // Object Cache Pro configuration
    define('WP_REDIS_CONFIG', [
    'token' => '******',
    'password' => '26*****joNF', // for Redis service - strongly recommended
    'host' => 'major.nei.hukanfa.com',
    'port' => 6389,
    'database' => 11, // change for each site
    'maxttl' => 3600, // Seconds (1 hour)
    'network_flush' => 'site', // site or all or global
    'timeout' => 2.5,
    'read_timeout' => 2.5,
    'retry_interval' => 10,
    'retries' => 3,
    'backoff' => 'smart',
    'compression' => 'lz4', // `zstd` compresses smaller, `lz4` compresses faster
    'serializer' => 'igbinary',
    'async_flush' => true,
    'split_alloptions' => true,
    'client' => 'phpredis',
    'prefetch' => true,
    'strict' => true,
    'debug' => false,
    'save_commands' => false,
    'updates' => false,
    'prefix' => 'wordpress', // to change
    'non_persistent_groups' => [
    'wc_session_id',
    '*-queries', // wildcard are supported
    // '_transient*',
    ],
    'non_prefetchable_groups' => [
    'wc_session_id',
    '*-queries', // wildcard are supported
    // '_transient*',
    ],
    ]);
    define('WP_REDIS_DISABLED', false);
    // END Object Cache Pro configuration
    • 配置插件
    # 使用插件需具备的环境
    PhpRedis v4.0 或以上版本,PHP 版本 >= 7.2,安装 igbinary 和 lz4,在 Dockerfile 中上述环境已经具备
    # 下载插件,请联系博主获取或谷歌搜索
    # 将插件解压到以下目录,后重启容器
    $ ls -l html/wp-content/plugins/
    object-cache-pro
    • 页面启用插件
    • 设置 -> Object Cache 中查看Dashboard

33.4 安装主题

  • 操作如下

    • 主题开发者博客链接
    https://nicen.cn/1552.html#h21
    • 主题风格如下图,功能还是比较全面
  • 主题下载

    • 开发者在其博客中已经开源了该主题源代码,可直接到以下路径下载主题
    # Github
    https://github.com/friend-nicen/theme-document
    # Gitee
    https://gitee.com/friend-nicen/theme-document
    # 百度网盘下载链接
    https://pan.baidu.com/s/10OchPJaGhNLaWxGoSfHEnA?pwd=1111 
    • 主题下载后上传到以下路径,并解压
    # 解压路径 
    /data/wordpress/html/wp-content/themes
    • 重启容器
  • 启用主题

    • 登陆wordpress管理后台,路径:外观 -- 主题 。选择document主题并启用
    • 查看主题启用后的初步效果,点击下面两处任一地方

    • 该主题的更多用法会在后续专题详细讲解

33.5 安装插件

  • 说明
    • 如果wordpress是一栋毛坯房,那插件就是那些家具了。通过安装合适的插件,能够让wordpress功能更加强大
    • 本节以markdown编辑插件wp-editormd为例,下面将介绍该插件的安装过程

33.5.1 WP Editor.md

:此插件不推荐安装,因为已经停止维护,不兼容新版本 wordpress 了

  • 插件安装方式一

    • 通过下载插件包,上传到服务器插件目录并解压授权
    # 官网下载
    <blockquote class="wp-embedded-content" data-secret="O19QCHexgY"><a href="https://wordpress.org/plugins/wp-editormd/">WP Editor.md &#8211; The Perfect WordPress Markdown Editor</a></blockquote><iframe class="wp-embedded-content" sandbox="allow-scripts" security="restricted" style="position: absolute; visibility: hidden;" title="&#8220;WP Editor.md &#8211; The Perfect WordPress Markdown Editor&#8221; &#8212; Plugin Directory" src="https://wordpress.org/plugins/wp-editormd/embed/#?secret=dzHpIxPzcE#?secret=O19QCHexgY" data-secret="O19QCHexgY" width="500" height="282" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
    # 百度网盘,10.2.1 版本 完全兼容wordpress 6.1.4
    https://pan.baidu.com/s/1W6Mi8wacQftp1RpTiddXjg?pwd=1111 
    
    # 上传并解压到 html/wp-content/plugins
    index.php  wp-editormd
    • 随后在界面启用插件

33.5.2 Markup Markdown (推荐)

  • 说明

  • 这是一款支持markdown格式的编辑器插件,且持续更新。

    • 目前该插件已支持 wordpress 最新版本 6.7.2
  • 操作如下

    • 可直接在wordpress插件管理界面搜索安装