WordPress 个人博客搭建,网站制作技术分享
- 作者: 刘杰
- 来源: 技术那些事
- 阅读:248
- 发布: 2025-07-12 13:02
- 最后更新: 2025-08-23 07:55
目标
- 用
wordpress快速搭建个人博客项目,将本地积累的部分资料上传到博客系统。 - 通过 docker 部署的方式自动构建项目
- 既可以方便项目整体分布式部署,方便整个项目容器的负载均衡
- 方便项目的迁移,对个人博客系统,需要资源要少,可能根据不同的云服务情况,随时可能会再次迁移到别的云
环境部署
下载 wordpress
从官网下载 wordpress 最新版本 6.7.2
依赖镜像
由于docker hub 已经屏蔽国内的访问,所以需要通过镜像服务来访问相应的容器。相关地址已经提供:
-
mysql:8.0.39(华为镜像:swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/mysql:8.0.39) -
docker.io/library/php:8.3.8-fpm-alpine(华为镜像:swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/php:8.3.8-fpm-alpine) -
docker.io/nginx:1.26.1-alpine(华为镜像:swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nginx:1.26.1-alpine)
本地安装 wordpress 项目
将项目压缩包解压,现在本地安装此项目,然后将安装好的项目相关文件,提交到 git 代码库。
- 解压项目文件,保留一级目录
wordpress - 通过命令行进入此目录,启动
http服务,php -S localhost:8080 - 通过浏览器访问
http://localhost:8080可以进入到 wordpress 的安装页面。 - 检查相关扩展是否安装齐全,根据提示补全要求的所有扩展,之后可以进行正常安装
- 配置数据库信息,先用本地的 mysql 数据库新建一个库
blog-wordpress,创建用户/密码:username/123456(可以根据情况自己调整,不要用简单密码) - 记录下博客管理员的信息
admin/admin13579(不要用简单密码)
配置项目目录(记录配置项目中涉及的项目相关的脚本)
配置文件的目录结构如下:
- blog-wodpress
- mysql
- config
- mysql.cnf
- Dockerfile
- start.sh
- config
- nginx
- config
- cert:(此目录存储的 https 相关证书文件,需要根据自己域名去申请)
- www.liujie.xin.key
- www.liujie.xin.pem
- liujie.xin.conf
- upstream.conf
- cert:(此目录存储的 https 相关证书文件,需要根据自己域名去申请)
- Dockerfile
- start.sh
- config
- php-fpm
- config
- php.ini
- www.conf
- Dockerfile
- start.sh
- config
- script
- docker-compose.yaml
- env.sh
- init.sh
- update.sh
- wordpress
- wp-config.php
- mysql
构建镜像相关脚本
php-fpm wordpress 相关脚本
php.ini
ini
[PHP]
; 禁止 PHP 向浏览器输出错误信息,错误信息将记录到日志文件中
display_errors = Off
; 错误报告级别,仅报告生产环境需要关注的错误
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT & ~E_NOTICE
; 定义错误日志文件的路径
error_log = /var/log/php/error.log
; 最大执行时间,防止脚本长时间运行占用资源
max_execution_time = 30
; 最大输入时间,限制接收用户输入的时间
max_input_time = 60
; 最大允许的 POST 数据大小
post_max_size = 8M
; 上传文件的最大大小
upload_max_filesize = 2M
; PHP 脚本允许使用的最大内存
memory_limit = 128M
; 最大输入变量数,防止恶意用户发送大量变量导致服务器资源耗尽
max_input_vars = 1000
; 设置默认时区,确保日期和时间函数使用正确的时间
date.timezone = Asia/Shanghai
; 禁用可能存在安全风险的函数
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_multi_exec,parse_ini_file,show_source
; 禁止通过 URL 打开文件,防止远程文件包含漏洞
allow_url_fopen = Off
allow_url_include = Off
; 开启魔术引号(虽然已弃用,但某些旧代码可能依赖)
magic_quotes_gpc = Off
; 开启跨站脚本攻击保护
session.cookie_httponly = On
session.cookie_secure = On
[opcache]
; 启用 OPcache
opcache.enable = 1
; 在 CLI 模式下也启用 OPcache
opcache.enable_cli = 1
; OPcache 内存大小
opcache.memory_consumption = 128
; 存储字符串的内存大小
opcache.interned_strings_buffer = 8
; 最多缓存的文件数量
opcache.max_accelerated_files = 4000
; 检查脚本更新的时间间隔(秒)
opcache.revalidate_freq = 60
; 禁止从共享内存加载脚本
opcache.fast_shutdown = 1
[mysqli]
; 最大连接尝试次数
mysqli.max_persistent = -1
; 最大持久连接数
mysqli.allow_persistent = On
; 连接超时时间
mysqli.connect_timeout = 60
; 查询结果的缓冲区类型
mysqli.default_result_mode = MYSQLI_STORE_RESULT
; 临时上传文件的目录
upload_tmp_dir = /var/www/html/tmp
www.conf(php-fpm 进程池配置)
ini
[www]
; 监听地址和端口(容器中已经配置)
; listen = 127.0.0.1:9000
; 启动时使用的用户和组
user = www-data
group = www-data
; 进程管理方式
pm = static
pm.max_children = 10
; pm.start_servers = 5
; pm.min_spare_servers = 3
; pm.max_spare_servers = 10
; 慢日志配置
slowlog = /var/log/php-fpm/www-slow.log
request_slowlog_timeout = 3s
; 错误日志配置(注意容器中已经全局配置)
; error_log = /var/log/php-fpm/www-error.log
; 允许的最大请求数
pm.max_requests = 500
; 环境变量配置
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
Dockerfile
给本地安装完的 wordpress 项目,创建 Dockerfile 文件,由于wordpress 是php项目,需要 php-fpm 的支持才才能运行,可以考虑将 php-fpm 容器构建和 wordpress 项目写在一起。
dockerfile
# 第一阶段:构建阶段
FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/php:8.3.8-fpm-alpine AS builder
# --build-arg app_env=product 指定默认环境变量
ARG app_env=develop
ARG project_name=blog-wordpress
ARG project_config=config-all
ENV APP_ENV=${app_env}
# 设置工作目录
WORKDIR /var/www/
# 使用国内镜像源
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
# 安装 gd 库所需的依赖项以及编译工具
RUN apk add --no-cache \
freetype-dev \
libjpeg-turbo-dev \
libpng-dev \
icu-dev \
libzip-dev \
autoconf \
g++ \
make \
imagemagick \
imagemagick-dev
# 启用 mysqli 和 gd 扩展
RUN docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install mysqli gd exif zip intl
# 手动编译 imagick
RUN wget https://pecl.php.net/get/imagick-3.7.0.tgz \
&& tar -zxvf imagick-3.7.0.tgz \
&& cd imagick-3.7.0 \
&& phpize \
&& ./configure \
&& make && make install
# 卸载编译工具以减小镜像体积
RUN apk del --no-cache \
autoconf \
g++ \
make
# 复制上下文文件到工作目录
COPY ./${project_config} ./${project_config}
# 覆盖配置文件 php.ini www.conf
RUN cp -f ${project_config}/${project_name}/php-fpm/config/*.conf /usr/local/etc/php-fpm.d/ \
&& cp -f ${project_config}/${project_name}/php-fpm/config/php.ini /usr/local/etc/php/ \
&& cp ${project_config}/${project_name}/php-fpm/start.sh ./ \
&& chmod +x start.sh \
&& rm -rf ${project_config}
# 第二阶段:运行阶段
FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/php:8.3.8-fpm-alpine
# --build-arg app_env=product 指定默认环境变量
ARG app_env=develop
ARG project_name=blog-wordpress
ARG project_config=config-all
ENV APP_ENV=${app_env}
# 设置工作目录
WORKDIR /var/www/
# 使用国内镜像源
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
# 安装运行时所需的依赖
RUN apk add --no-cache \
freetype \
libjpeg-turbo \
libpng \
icu \
libzip \
imagemagick
# 从构建阶段复制编译好的扩展和配置文件
COPY --from=builder /usr/local/lib/php/extensions /usr/local/lib/php/extensions
COPY --from=builder /usr/local/etc/php-fpm.d/ /usr/local/etc/php-fpm.d/
COPY --from=builder /usr/local/etc/php/ /usr/local/etc/php/
COPY --from=builder /var/www/start.sh /var/www/start.sh
# 启用扩展
RUN docker-php-ext-enable mysqli gd exif zip intl imagick
# 暴露 fast-cgi 端口
EXPOSE 9000
相关shell脚本
创建基于 docker.io/library/php:8.3.8-fpm-alpine 镜像的自动构建脚本 :
-
env.sh:构建脚本使用的环境变量
sh#!/bin/sh # 定义颜色变量 RED='\033[31m' GREEN='\033[92m' YELLOW='\033[33m' BLUE='\033[34m' NC='\033[0m' # 恢复默认颜色 # 环境设置 APP_ENV=dev # 项目设置 PROJECT=blog-wordpress NAME_PREFIX=wordpress CONFIG=config-all # 目录设置 CONTEXT_DIR=$(pwd)/build-${NAME_PREFIX} # mysql 相关宿主机初始化,USER_ID 和 GROUP_ID 根据容器内的mysql用户情况而定,保证在容器中有权限 MYSQL_USER_ID=999 MYSQL_GROUP_ID=999 MYSQL_BASE_DIR=/data/mysql/ # IP 地址 IP=`ifconfig | grep docker0 -A1 | tail -1 | awk '{print $2}'` -
init.sh:初始化项目的环境(主要是数据库的持久存储设置)
shell#!/bin/sh source ./env.sh set -e echo -e "${BLUE}start init mysql db path.${NC}" # 创建 mysql 使用的根目录 if [ ! -d "${MYSQL_BASE_DIR}" ]; then sudo mkdir -p "${MYSQL_BASE_DIR}" echo -e "${GREEN}create mysql base dir: ${MYSQL_BASE_DIR} success!${NC}" else if [ ! -d "${MYSQL_BASE_DIR}/${PROJECT}" ]; then # 创建项目数据库目录 sudo mkdir "${MYSQL_BASE_DIR}/${PROJECT}" sudo chown ${MYSQL_USER_ID}.${MYSQL_GROUP_ID} "${MYSQL_BASE_DIR}/${PROJECT}" echo -e "${GREEN}create mysql project dir: ${MYSQL_BASE_DIR}/${PROJECT} success!${NC}" fi fi # 检测 ${MYSQL_BASE_DIR}/${PROJECT} 目录的权限是否是 ${MYSQL_USER_ID}.${MYSQL_GROUP_ID} if [ -d "${MYSQL_BASE_DIR}/${PROJECT}" ]; then # 使用 stat 命令获取目录的用户和组信息 current_owner=$(stat -c "%u" "${MYSQL_BASE_DIR}/${PROJECT}") current_group=$(stat -c "%g" "${MYSQL_BASE_DIR}/${PROJECT}") if [ "$current_owner" = "$MYSQL_USER_ID" ] && [ "$current_group" = "$MYSQL_GROUP_ID" ]; then echo -e "${GREEN}The directory ${MYSQL_BASE_DIR}/${PROJECT} has the correct owner and group.${NC}" else echo -e "${RED}The directory ${MYSQL_BASE_DIR}/${PROJECT} does not have the correct owner and group.${NC}" echo -e "${RED}Current owner: $current_owner, current group: $current_group. Expected owner: $MYSQL_USER_ID, expected group: $MYSQL_GROUP_ID.${NC}" # 如果权限不正确,可以选择重新设置权限 read -p "Do you want to set the correct owner and group? (y/n): " choice if [ "$choice" = "y" ]; then sudo chown ${MYSQL_USER_ID}.${MYSQL_GROUP_ID} "${MYSQL_BASE_DIR}/${PROJECT}" echo -e "${GREEN}The owner and group of ${MYSQL_BASE_DIR}/${PROJECT} have been set correctly.${NC}" fi fi fi # 更新代码环境 echo -e "${BLUE}start init code and config.${NC}" source ./update.sh echo -e "${BLUE}all are finished.${NC}" -
update.sh
shell#!/bin/sh source ./env.sh # 设置进程出错脚本停止,显示执行结果 set -e if [ ! -d "${CONTEXT_DIR}" ]; then mkdir -p "${CONTEXT_DIR}" echo -e "${GREEN}create context path: ${CONTEXT_DIR}${NC}" else echo -e "${YELLOW}find context path:${CONTEXT_DIR}${NC}" fi # 获取宿主机IP if [ -n ${IP} ]; then echo -e "${GREEN}宿主机IP获取成功: ${IP}${NC}" else echo -e "${RED}宿主机IP获取失败...${NC}" exit 1 fi if [ -d ${CONTEXT_DIR}/${PROJECT} ]; then git -C ${CONTEXT_DIR}/${PROJECT} checkout master git -C ${CONTEXT_DIR}/${PROJECT} pull origin master else # 拉取 wordpress 相关代码 git clone -b master git@gitee.com:[用户名称,替换为自己的]/blog-wordpress.git ${CONTEXT_DIR}/${PROJECT} fi echo -e "${GREEN}${PROJECT} update success.${NC}" if [ -d ${CONTEXT_DIR}/${CONFIG} ]; then git -C ${CONTEXT_DIR}/${CONFIG} checkout master git -C ${CONTEXT_DIR}/${CONFIG} pull origin master else # 拉取配置文件 git clone -b master git@gitee.com:[用户名称,替换为自己的]/config-all.git ${CONTEXT_DIR}/${CONFIG} fi echo -e "${GREEN}${CONFIG} update success.${NC}" -
docker-compose.yml 脚本:构建和启动容器的脚本
yaml# 定义网络 networks: my-net: name: pro_wordpress # 定义卷 volumes: volume_wordpress: driver: local driver_opts: type: 'none' o: 'bind' device: './build-wordpress/blog-wordpress/' mysql-data: driver: local driver_opts: type: 'none' o: 'bind' device: '/data/mysql/blog-wordpress/' # 替换为宿主机上实际的目录 services: # Nginx 服务 nginx: image: jbao/nginx:1.26.1-alpine # 这个名字根据需要替换为自己的容器私有库地址 build: context: ./build-wordpress/config-all/blog-wordpress/nginx dockerfile: Dockerfile container_name: wordpress_nginx entrypoint: ["./start.sh"] ports: - "80:80" # 将宿主机的 80 端口映射到容器的 80 端口 - "443:443" volumes: - volume_wordpress:/var/www/blog-wordpress networks: - my-net depends_on: - php-fpm - mysql # PHP-FPM 服务 php-fpm: image: jbao/php-fpm:8.3.8-alpine # 这个名字根据需要替换为自己的容器私有库地址 build: context: ./build-wordpress dockerfile: config-all/blog-wordpress/php-fpm/Dockerfile entrypoint: ["./start.sh"] volumes: - volume_wordpress:/var/www/blog-wordpress networks: - my-net depends_on: - mysql # MySQL 服务 mysql: image: jbao/mysql:8.0.26-alpine # 这个名字根据需要替换为自己的容器私有库地址 build: context: ./build-wordpress/config-all/blog-wordpress/mysql dockerfile: Dockerfile container_name: wordpress_mysql entrypoint: ["/bin/bash", "-c", "/var/www/start.sh"] environment: MYSQL_ROOT_PASSWORD: 这里是root密码 # 设置 MySQL root 用户密码 MYSQL_DATABASE: blog-wordpress # 创建一个名为 wordpress 的数据库 MYSQL_USER: username # 创建一个新用户 MYSQL_PASSWORD: 这里是新用户的密码 # 设置新用户的密码 security_opt: - seccomp:unconfined volumes: - mysql-data:/var/lib/mysql # 挂载 MySQL 数据卷 networks: - my-net
nginx 构建脚本
nginx 自定义虚拟主机配置 liujie.conf
ini
server {
listen 80;
server_name www.liujie.xin;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
#填写证书绑定的域名
server_name www.liujie.xin;
# 填写证书文件绝对路径
ssl_certificate cert/www.liujie.xin.pem;
# 填写证书私钥文件绝对路径
ssl_certificate_key cert/www.liujie.xin.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
# 自定义设置使用的TLS协议的类型以及加密套件(以下为配置示例,请您自行评估是否需要配置)
# TLS协议版本越高,HTTPS通信的安全性越高,但是相较于低版本TLS协议,高版本TLS协议对浏览器的兼容性较差。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
# 表示优先使用服务端加密套件。默认开启
ssl_prefer_server_ciphers on;
root /var/www/blog-wordpress;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass php_backend;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
upstream.conf
通过代理方式访问 php-fpm 容器的 9000 端口(php服务端口)
ini
# upstreams.conf
upstream php_backend {
server php-fpm:9000;
}
dockerfile 文件
dockerfile
FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nginx:1.26.1-alpine
# 设置工作目录
WORKDIR /var/www/
# 复制上下文文件到工作目录
COPY ./config ./config
COPY ./start.sh ./start.sh
RUN chmod +x start.sh
# 覆盖配置文件,清理多余配置.
RUN cp -f config/*.conf /etc/nginx/conf.d/ \
&& cp -rf config/cert /etc/nginx/cert \
&& rm -rf config
# 暴露 fast-cgi 端口
EXPOSE 80
start.sh 容器内的启动脚本
shell
#!/bin/sh
exec /docker-entrypoint.sh nginx -g "daemon off;"
mysql 构建脚本
mysql 数据库自定义配置文件
ini
[mysqld]
skip-host-cache
skip-name-resolve
user=mysql
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/run/mysqld/mysqld.sock
port=3306
basedir=/usr
datadir=/var/lib/mysql
tmpdir=/tmp
lc-messages-dir=/usr/share/mysql-8.0
explicit_defaults_for_timestamp
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
max_allowed_packet=16M
sql_mode = "ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
[client]
default-character-set=utf8mb4
socket=/var/run/mysqld/mysqld.sock
[mysql]
default-character-set=utf8mb4
dockerfile 构建脚本
dockerfile
FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/mysql:8.0.39
# 设置工作目录
WORKDIR /var/www/
# 复制上下文文件到工作目录
COPY ./config ./config
COPY ./start.sh ./start.sh
RUN chmod +x start.sh
# 覆盖配置文件,清理多余配置.
RUN cp config/mysql.cnf -f /etc/mysql/conf.d/mysql.cnf \
&& rm -rf config
# 暴露 fast-cgi 端口
EXPOSE 3306
start.sh 容器启动脚本
bash
#!/bin/bash
exec /usr/local/bin/docker-entrypoint.sh mysqld
Wordpress 配置文件
php
<?php
/**
* The base configuration for WordPress
*
* The wp-config.php creation script uses this file during the installation.
* You don't have to use the website, you can copy this file to "wp-config.php"
* and fill in the values.
*
* This file contains the following configurations:
*
* * Database settings
* * Secret keys
* * Database table prefix
* * ABSPATH
*
* @link https://developer.wordpress.org/advanced-administration/wordpress/wp-config/
*
* @package WordPress
*/
// ** Database settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'blog-wordpress' );
/** Database username */
define( 'DB_USER', '根据需要配置' );
/** Database password */
define( 'DB_PASSWORD', '自定义的密码' );
/** Database hostname */
define( 'DB_HOST', 'mysql:3306' );
/** Database charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8mb4' );
/** The database collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );
/**#@+
* Authentication unique keys and salts.
*
* Change these to different unique phrases! You can generate these using
* the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}.
*
* You can change these at any point in time to invalidate all existing cookies.
* This will force all users to have to log in again.
*
* @since 2.6.0
*/
define( 'AUTH_KEY', '!)ewag#~z~SoP?K`2.6ed0hqo Eajcqq{5!&nm<lFI~=P##+5b9plBW0D4v-8SiC' );
define( 'SECURE_AUTH_KEY', 'b`8%G:8hv*y`$goQ4gwnWf}xR^FjdbG`{bFN{iu&BFa1mjv*ydpq]PNKp-{5[zMY' );
define( 'LOGGED_IN_KEY', '+82 oV6{JXI0wZWM7wMVbZi;QTq%jz?v^mYbC$:a+H35w_i7V4k}svJd-sZ~#(%D' );
define( 'NONCE_KEY', 'Un#(BQ:,&QDXe+(@iD!.z,L;70bf[J%$HT@9,7Sg!;A)odR2V8[q$;Bg(%.hq&]~' );
define( 'AUTH_SALT', '(y1tx0Y[&,UH~0j)S]wvwiy77|3t`mW]c^|=wSjPh>oTAZVEKH!&PMmYM fSXl[8' );
define( 'SECURE_AUTH_SALT', '_ticG$7@)X>;m@&MW[`qEt*2Z8rw3@l-8@PT^b rP{~9h>yuxi@UN +Ze+p%O~Nl' );
define( 'LOGGED_IN_SALT', 'U5?nWT9;!WX=Y[B5Ck_vmroVMWJ*hdW1IOKj;F$FS%x@nB/N ;`qCkSMM%->zTWS' );
define( 'NONCE_SALT', '&#*`~[Edn.FV<HK27m}Cnx{@-7@AdtL#lJN1+t;&O}i]8/%`4cs.pgfrC1,/1c,y' );
/**#@-*/
/**
* WordPress database table prefix.
*
* You can have multiple installations in one database if you give each
* a unique prefix. Only numbers, letters, and underscores please!
*
* At the installation time, database tables are created with the specified prefix.
* Changing this value after WordPress is installed will make your site think
* it has not been installed.
*
* @link https://developer.wordpress.org/advanced-administration/wordpress/wp-config/#table-prefix
*/
$table_prefix = 'wp_';
/**
* For developers: WordPress debugging mode.
*
* Change this to true to enable the display of notices during development.
* It is strongly recommended that plugin and theme developers use WP_DEBUG
* in their development environments.
*
* For information on other constants that can be used for debugging,
* visit the documentation.
*
* @link https://developer.wordpress.org/advanced-administration/debug/debug-wordpress/
*/
define( 'WP_DEBUG', false );
/* Add any custom values between this line and the "stop editing" line. */
/* That's all, stop editing! Happy publishing. */
/** Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) ) {
define( 'ABSPATH', __DIR__ . '/' );
}
/** Sets up WordPress vars and included files. */
require_once ABSPATH . 'wp-settings.php';
项目搭建
调整环境变量配置
创建项目文件夹,比如叫:wordpress。将开始提供的构建脚本拷贝到这个文件夹内,具体如下:
-
wordpress/env.sh
-
wordpress/init.sh
-
wordpress/update.sh
-
wordpress/docker-compose.yaml
首先配置环境变量,根据需要将 env.sh 文件中的,各个变量按照自己项目的命名,进行调整(注意,这个跟我脚本有区别的时候,其他脚本中可能存在一些名称需要手动调整,自己搜索替换即可)。主要有:
-
APP_ENV:项目的类型(dev、product)
-
PROJECT:项目名称,此项目名称,后续数据目录之中均会根据此名称设置路径
-
NAME_PREFIX:项目涉及的各种名称前缀
-
CONFIG:配置文件存放的git仓库名称
-
CONTEXT_DIR:docker 构建的上下文内容根目录
-
MYSQL_USER_ID:mysql 容器中用来维护 mysql 服务的账户 ID(数字)
-
MYSQL_GROUP_ID:mysql 容器中用来维护 mysql 服务的组 ID(数字)
-
MYSQL_BASE_DIR:宿主机上创建的 mysql 的持久存储的路径(库路径),由于本项目是通过 mysql 容器挂载宿主机的数据库目录进行运行,所以如此操作。如果用户是在宿主机,或者单独的 rds 服务之类的,其实更好。因为有测试表明,在容器中挂载宿主机目录,会极大的降低挂载数据卷的 IO 效率。用户可以根据自己情况调整。
-
IP:宿主机的IP地址,这个不用配置执行时候会自动获取。
初始化环境
执行 init.sh 脚本,会自动初始化环境脚本中相关变量对应的数据,主要是数据库相关的配置。
更新项目(包括代码和配置,上线新内容)
执行 update.sh 脚本,会自动更新 docker 构建上下文中涉及的项目 git 仓库代码,和配置文件相关的 git 仓库代码。然后在此目录中执行 docker-compose 构建命令:
bash
# 构建项目中的容器镜像
docker compose build [名字是 docker-compose.yaml 中的 service 名称,如 nginx]
# 启动新镜像,没有问题的话,新镜像会运行新容器替代原容器
docker compose up -d [刚才构建的服务名称,例如 nginx]
# 进入镜像进行一些调试,或者查看
docker compose exec -it [nginx 等 service 名称] sh
Wordpress的缺点
整个项目是基于 nginx + php-fpm + mysql 开发完成。php-fpm 进程模型相对来说对资源消耗比较大,性能比较差。而且 wordpress 的代码,从专业程序员的角度来看,写的其实很一般(委婉说法),虽然从使用功能来看,看起来灵活性不差,功能也不少,但是代码结构确实很一般(再次委婉一下)。
这里我是部署在阿里的 99 / 年的独立服务器上,跑起来没问题,但需要将 php-fpm 的进程数调低,否则运行一段时间后,整个容器占用内存过大(99 虚拟主机位 2核/1G)直接就会导致系统内存过低,然后杀死占用内存过大的容器。将进程数调低,mysql 的占用内存也调低。这样下来倒是可以稳定的跑起来,对于个人的新站来说也足够用了,因为新站访问量低,对资源需求量不大。
哦,对了虽然阿里云不限流量,但是99 服务器带宽固定位 3M,如果将图片放到服务器,那基本就卡的不行。所以要想用起来还可以,还需要安装一些插件,比如七牛云,将上传的资源通过云方式存储(流量不走阿里云),这样体验会提升一个台阶。
当然如果你有更高要求,且对 wordpress 比较中意,那可以采取加配置的,只要服务器配置上去了,上边也都不是问题。