WordPress 个人博客搭建,网站制作技术分享

目标

  • 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 代码库。

  1. 解压项目文件,保留一级目录 wordpress
  2. 通过命令行进入此目录,启动 http 服务,php -S localhost:8080
  3. 通过浏览器访问 http://localhost:8080 可以进入到 wordpress 的安装页面。
  4. 检查相关扩展是否安装齐全,根据提示补全要求的所有扩展,之后可以进行正常安装
  5. 配置数据库信息,先用本地的 mysql 数据库新建一个库 blog-wordpress,创建用户/密码: username/123456(可以根据情况自己调整,不要用简单密码)
  6. 记录下博客管理员的信息 admin/admin13579(不要用简单密码)

配置项目目录(记录配置项目中涉及的项目相关的脚本)

配置文件的目录结构如下:

  • blog-wodpress
    • mysql
      • config
        • mysql.cnf
      • Dockerfile
      • start.sh
    • nginx
      • config
        • cert:(此目录存储的 https 相关证书文件,需要根据自己域名去申请)
          • www.liujie.xin.key
          • www.liujie.xin.pem
        • liujie.xin.conf
        • upstream.conf
      • Dockerfile
      • start.sh
    • php-fpm
      • config
        • php.ini
        • www.conf
      • Dockerfile
      • start.sh
    • script
      • docker-compose.yaml
      • env.sh
      • init.sh
      • update.sh
    • wordpress
      • wp-config.php

构建镜像相关脚本

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 比较中意,那可以采取加配置的,只要服务器配置上去了,上边也都不是问题。