前言
当前博客是以 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