WordPress相关

14次阅读
没有评论

前言

当前博客是以 docker 容器技术搭建,镜像为:wordpress:6.8.2-php8.3-fpm,主题是 wordpress-theme-puock,使用 Nginx 代理静态资源到七牛云。在搭建过程中踩了几个坑点,备忘下,后面调整的时候可以查看。

容器搭建

在搭建过程中还是遇到了几个坑:

1、因为服务器使用的是 Nginx 的 web 服务,所以在使用镜像的时候就要使用 PHP-FPM 系列的镜像,不要用 apache 版本的,因为还要额外配置,比较麻烦。

2、不要使用 -apline 的轻量版本的镜像,因为在连接 MYsql 数据库的时候会连不上,

3、在环境配置设置的时候可以参考如下:

wp-config.php
<?php
/**
 * WordPress 基础配置文件
 */

// 数据库设置 - 使用环境变量
define('DB_NAME', getenv('WORDPRESS_DB_NAME') );
define('DB_USER', getenv('WORDPRESS_DB_USER') );
define('DB_PASSWORD', getenv('WORDPRESS_DB_PASSWORD') );
define('DB_HOST', getenv('WORDPRESS_DB_HOST') );
define('DB_CHARSET', 'utf8mb4');
define('DB_COLLATE', '');

// 安全密钥(生产环境请更换为随机字符串)define('WP_HOME', 'https://domain.com');
define('WP_SITEURL', 'https://domain.com');
// 设置 CDN URL
define('CDN_HOST', 'cdn.domain.com');
define('AUTH_KEY', 'z&@xBIRoj`YeEY.V:.b-^_;Vv{yh?-C~W,U>pre[e?iLx~w S1tE|#8{H.6Y<vw[');
define('SECURE_AUTH_KEY', 'lO{Ap5APuq0QyEhG^CnXK+6NKU-/&|C2w7c>`d),fu4(^fCXlQ<gB_|#O?w+Jq *');
define('LOGGED_IN_KEY', 'g<b>LC2w^Wj>L8YJHy`QiSse1<t{i,tF))Y19G?#C`N+biZd&o4|luhhC58G14Ej' );
define('NONCE_KEY', 'FioVozwi P.}2?xBJm#?8HU(-Y~Xi4!(GF()12gi#X]ie$^i/;>;(k6>Dvm*#=');
define('AUTH_SALT', '4V?|Q~THA{su/cP%H9KW%BHJ.ZwK^@mGN2F..rad;4}C3{w2HijxCVCRur(Sn-Vv');
define('SECURE_AUTH_SALT', 't0xmawJ|o1=g1P f;bH1}F/iv3PITt?)S|YT,d8+aT*O1rv8k6`P025[$L+!2Nvp' );
define('LOGGED_IN_SALT', 'afUNjDJ4?vcsgS>Ea][*!>|e#yV~z- eR hV}>Q]Q.FS+,r%a^>HH[_F@B/f%ipc' );
define('NONCE_SALT', '_ib(;V,yr%+58O3~`4uwsba|8_(-N-+FaUc1Hog=lnEIK_7OG-!x]zLjPyz3+!;8' );

// 强制使用 HTTPS
define('FORCE_SSL_ADMIN', true);
$_SERVER['HTTPS'] = 'on';

// 大文件上传支持
define('WP_MEMORY_LIMIT', '128M');

# 定义数据库表前缀
$table_prefix = 'wp_';

// 调试模式(生产环境设为 false)define('WP_DEBUG', true);

/** 提升性能:关闭定时任务改用服务器 Cron */
define('DISABLE_WP_CRON', true);  
// 通过服务器 cron 触发:wget -q -O - https://your-domain.com/wp-cron.php?doing_wp_cron >/dev/null

if (! defined( 'ABSPATH') ) {define( 'ABSPATH', __DIR__ . '/');
}

require_once ABSPATH . 'wp-settings.php';

# Dockerfile
# FROM wordpress:fpm 
# FROM wordpress:6.3-php8.0-fpm 
FROM wordpress:6.8.2-php8.3-fpm

# 安装所需依赖 alpine 包管理器不能使用 apt-get

RUN apt-get update && apt-get install -y \
    less \
    nano \
    && rm -rf /var/lib/apt/lists/*

# 安装性能扩展
RUN docker-php-ext-install opcache && \
    docker-php-ext-enable opcache    
# # 安装所需依赖 (使用 Alpine 的 apk 包管理器)
# RUN apk update && apk add --no-cache \
#     less \
#     nano \
#     && rm -rf /var/cache/apk/*

# 设置工作目录
WORKDIR /var/www/html

# 复制主题文件 (这一步也可以在 docker-compose.yml 中通过 volumes 实现)
# COPY . /var/www/html/wp-content/themes/puock/

# 设置权限
RUN chown -R www-data:www-data /var/www/html
RUN chmod -R 755 /var/www/html
RUN chmod -R 777 /var/www/html/wp-content

DockerCompose
services:
  wordpress:
    image: w-press:${TAG:-0.25.8.10.6}
    build: .
    container_name: wp-app
    environment:
      WORDPRESS_DB_HOST: host.docker.internal  # 对于 Linux 可能需要改为宿主机 IP
      WORDPRESS_DB_USER: xxxx # 替换为你的 MySQL 用户名
      WORDPRESS_DB_PASSWORD: xxxx# 替换为你的 MySQL 密码
      WORDPRESS_DB_NAME: xxxx   # 替换为你的数据库名
      PHP_FPM_LISTEN: 0.0.0.0:9000
    volumes:
      - wordpress_data:/var/www/html # 使用命名卷
      - ./custom-php.ini:/usr/local/etc/php/conf.d/uploads.ini  # 挂载自定义 PHP 配置
      - ./custom-php-fpm.conf:/usr/local/etc/php-fpm.conf
      - ./wp-config.php:/var/www/html/wp-config.php
    restart: always
    extra_hosts:
      # windows 通过 ipconfig 查看 以太网适配器 vEthernet (WSL (Hyper-V firewall)) 的 ip4 地址
      - "host.docker.internal: 172.17.0.1"  # 手动映射  

    networks:
      - wordpress_network
      - my-network

volumes:
  wordpress_data:

networks:
  my-network:
    external: true    
  wordpress_network:
    driver: bridge
nginx 配置

server {
    listen 80;
    server_name www.word.huixiangwuyou.com word.huixiangwuyou.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name www.domain.com;

    # SSL 证书配置
    ssl_certificate /etc/nginx/ssl_cert/xxx.pem;
    ssl_certificate_key /etc/nginx/ssl_cert/xxx.key;
    
    # SSL 安全配置
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
    ssl_prefer_server_ciphers on;
    ssl_stapling on;
    ssl_stapling_verify on;
    
    # 安全头
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";
    add_header X-XSS-Protection "1; mode=block";
    
    # 根目录设置
    root /var/www/html;
    index index.php index.html index.htm;
    try_files $uri $uri/ /index.php?$args;
    rewrite /wp-admin$ $scheme://$host$uri/ permanent;
    client_max_body_size 128m;

    # 使用 国内 和 阿里云 的公共 DNS
    resolver 117.187.210.210 111.45.28.78 114.114.114.114 223.5.5.5 valid=30s;  
      # 设置 DNS 解析超时和重试
    resolver_timeout 5s;
    # CDN 代理映射配置
    set $cdn_host "cdn.domain.com";
    # 静态文件处理
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
        # 保留原始查询参数
        set $args $args;
        
        # 构造 CDN URL
        set $cdn_url "https://$cdn_host$uri";
        
        # 添加缓存控制头
        add_header X-CDN-Proxy "enabled";
        add_header Cache-Control "public, max-age=31536000, immutable";
        add_header Access-Control-Allow-Origin "*";
        add_header Content-Security-Policy "default-src'self'https: data:'unsafe-inline''unsafe-eval'";
        add_header X-Content-Type-Options "nosniff";
        add_header X-Frame-Options "SAMEORIGIN";
        add_header X-XSS-Protection "1; mode=block";
        
        # 代理到 CDN
        proxy_pass $cdn_url;
        
        # 代理设置
        proxy_http_version 1.1;
        proxy_set_header Host $cdn_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_cache wp_cdn_cache;
        proxy_cache_valid 200 301 302 300d;
        proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
        proxy_cache_lock on;
        proxy_cache_key "$scheme$request_method$host$request_uri";
        
        # 忽略 CDN 端的缓存控制头(使用 Nginx 的缓存策略)proxy_ignore_headers Expires Cache-Control Set-Cookie;
    }
    
    # WordPress 固定链接规则
    location / {try_files $uri $uri/ /index.php?$args;}
    
    # PHP 处理
    location ~ \.php$ {fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass wordpress:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param HTTPS on;
    }
    
    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }
    
    location = /xmlrpc.php {
        deny all;
        access_log off;
        log_not_found off;
        return 444;
    }
}

服务创建

docker compose up -d 搭建好容器服务后,在浏览器的:http://localhost:9000(在 docker-compose.yml 配置 port 暴露端口), 若是已经设置了域名可以直接访问域名。MySQL 数据库和账户密码在 docker-compose.yml 已经设置好了,服务初始化就设置超级管理员账户密码就可以了

主题

在选择主题的时候可以在管理界面的外观 - 主题设置,也可以在 wordpress 主题库搜索,未在主题库的可以将主题下载然后上传主题到服务,上传好启用服务就可以了。

修改主题

若是主题的设置和配置不符合需求,可以在管理界面的外观 - 主题编辑下设置(切记要切换当前主题,否则修改当前主题无效)。右侧选择需要修改的主题,会展示主题的各种配置,修改后更新文件,然后切换回主题就可以看到修改的效果

对于当前主题有什么不懂的地方可以查看 [AI 文档](https://deepwiki.com/Licoy/wordpress-theme-puock)

修改上传配置

在 docker-compose.yml 上挂卷一个 custom-upload.ini 文件

; 提升上传限制至 50M(需满足:memory_limit > post_max_size > upload_max_filesize)file_uploads = On
memory_limit = 128M
upload_max_filesize = 50M
post_max_size = 50M
max_execution_time = 300
max_input_time = 600

CDN 优化

刚开始的时候直接在插件上查找使用 CDN-Enabler,但是在使用的时候遇到一个坑,就是取消使用 CDN 代理的时候服务的静态资源无法访问了。对 PHP 的开发调整一窍不通,调整了很久都没搞定,后来就直接用 Nginx 直接代理 CDN 静态资源链接了。

在使用 Nginx 代理 CDN 资源 URL 的时候要求添加 DNS 解析器,DNS 解析地址获取方式

docker exec -it nginxs bash

# 安装 dig 工具
apt update && apt install -y dnsutils

# 测试解析 返回解析地址
dig cdn.domain.com +short

# 然后在 nginx 的配置上添加解析即可
# ..... 代码
# 使用 国内 和 阿里云 的公共 DNS
resolver 117.187.210.210 111.45.28.78 114.114.114.114 223.5.5.5 valid=30s;  
# 设置 DNS 解析超时和重试
resolver_timeout 5s;
# CDN 代理映射配置
set $cdn_host "cdn.domain.com";
#...... 代码 

有个坑点:新的插件和主题调整,都要放到 CDN 上,否则访问 404

常用插件

  • WooCommerce:基于 WordPress,高度自由,支持商品订单。
  • Elementor:支持高度自定义的编辑器
  • wordpress-seo:基于 WordPress 的灵活 SEO 设置
  • WP Rollback: 是关于一个版本回滚的插件,负责将主题、插件的版本回滚

https://word.huixiangwuyou.com/wp-content/uploads/2025/08/404logo.png

正文完
 1
评论(没有评论)
验证码