Deploy WordPress on ACK
ConfigMap
apiVersion: v1
data:
wp-config.php: |
<?php
if (!function_exists('getenv_docker')) {
function getenv_docker($env, $default) {
if ($fileEnv = getenv($env . '_FILE')) {
return rtrim(file_get_contents($fileEnv), "\r\n");
}
else if (($val = getenv($env)) !== false) {
return $val;
}
else {
return $default;
}
}
}
// ** Database settings - You can get this info from your web host ** //
define( 'DB_NAME', getenv_docker('WORDPRESS_DB_NAME', 'ace-prod-wordpress') );
define( 'DB_USER', getenv_docker('WORDPRESS_DB_USER', 'ace_prod_wordpress') );
define( 'DB_PASSWORD', getenv_docker('WORDPRESS_DB_PASSWORD', 'example password') );
define( 'DB_HOST', getenv_docker('WORDPRESS_DB_HOST', 'mysql') );
define( 'DB_CHARSET', getenv_docker('WORDPRESS_DB_CHARSET', 'utf8mb4') );
define( 'DB_COLLATE', getenv_docker('WORDPRESS_DB_COLLATE', '') );
// add Redis Config
define( 'WP_REDIS_HOST', getenv_docker('WORDPRESS_REDIS_HOST', '127.0.0.1') );
define( 'WP_REDIS_PORT', getenv_docker('WORDPRESS_REDIS_PORT', 6379) );
define( 'WP_REDIS_PREFIX', getenv_docker('WORDPRESS_REDIS_PREFIX', 'my-moms-site') );
define( 'WP_REDIS_DATABASE', getenv_docker('WORDPRESS_REDIS_DATABASE', 0) ); // 0-15
define( 'WP_REDIS_PASSWORD', getenv_docker('WORDPRESS_REDIS_PASSWORD', '') );
define( 'WP_REDIS_TIMEOUT', getenv_docker('WORDPRESS_REDIS_TIMEOUT', 1) );
define( 'WP_REDIS_READ_TIMEOUT', getenv_docker('WORDPRESS_REDIS_READ_TIMEOUT', 1) );
define( 'AUTH_KEY', getenv_docker('WORDPRESS_AUTH_KEY', '99abd1e9ffdd9cc126605bcdf6639a3caa8c0b27') );
define( 'SECURE_AUTH_KEY', getenv_docker('WORDPRESS_SECURE_AUTH_KEY', 'f222517f366c8c42226b4f76f5b067f2503bc955') );
define( 'LOGGED_IN_KEY', getenv_docker('WORDPRESS_LOGGED_IN_KEY', '6196f322c499139d1df4d83c579601bc414e0a91') );
define( 'NONCE_KEY', getenv_docker('WORDPRESS_NONCE_KEY', 'a5ef87362a979a62d7ec68b6196c3bab2a1255ec') );
define( 'AUTH_SALT', getenv_docker('WORDPRESS_AUTH_SALT', '1ddc6c8a9c62ba56c2273fee355659c05ef7e865') );
define( 'SECURE_AUTH_SALT', getenv_docker('WORDPRESS_SECURE_AUTH_SALT', '4d3fdc62605c320ba88bc2c063565aeeb30b13c7') );
define( 'LOGGED_IN_SALT', getenv_docker('WORDPRESS_LOGGED_IN_SALT', 'a61ec326f3b07c1fb5519566faf3cef3f07b14c0') );
define( 'NONCE_SALT', getenv_docker('WORDPRESS_NONCE_SALT', '5dc5449d278131e72660f3b2419d4fea56473174') );
$table_prefix = getenv_docker('WORDPRESS_TABLE_PREFIX', 'wp_');
define( 'WP_DEBUG', !!getenv_docker('WORDPRESS_DEBUG', '') );
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false) {
$_SERVER['HTTPS'] = 'on';
}
if ($configExtra = getenv_docker('WORDPRESS_CONFIG_EXTRA', '')) {
eval($configExtra);
}
/* That's all, stop editing! Happy publishing. */
/** Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) ) {
define( 'ABSPATH', __DIR__ . '/' );
}
define( 'AUTOMATIC_UPDATER_DISABLED', true );
require_once ABSPATH . 'wp-settings.php';
kind: ConfigMap
metadata:
name: ace-prod-wp-config
namespace: ace
Secret
apiVersion: v1
data:
WORDPRESS_DB_HOST: XXX
WORDPRESS_DB_PASSWORD: XXX
WORDPRESS_REDIS_HOST: XXX
WORDPRESS_REDIS_PASSWORD: XXX
kind: Secret
metadata:
name: ace-prod-sc-wordpress
namespace: ace
type: Opaque
UnitedDeployment
apiVersion: apps.kruise.io/v1alpha1
kind: UnitedDeployment
metadata:
name: ace-prod-ud-wordpress
spec:
replicas: 1
selector:
matchLabels:
env: prod
project: ace
app: ace-prod-wordpress
template:
deploymentTemplate:
metadata:
labels:
app: ace-prod-wordpress
env: prod
project: ace
name: ace-prod-wordpress
spec:
selector:
matchLabels:
app: ace-prod-wordpress
env: prod
project: ace
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
labels:
app: ace-prod-wordpress
env: prod
project: ace
spec:
containers:
- env:
- name: WORDPRESS_DB_HOST
valueFrom:
secretKeyRef:
key: WORDPRESS_DB_HOST
name: ace-prod-sc-wordpress
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
key: WORDPRESS_DB_PASSWORD
name: ace-prod-sc-wordpress
- name: WORDPRESS_REDIS_HOST
valueFrom:
secretKeyRef:
key: WORDPRESS_REDIS_HOST
name: ace-prod-sc-wordpress
- name: WORDPRESS_REDIS_PASSWORD
valueFrom:
secretKeyRef:
key: WORDPRESS_REDIS_PASSWORD
name: ace-prod-sc-wordpress
- name: aliyun_logs_ace-prod-wordpress
value: stdout
image: crpi-35tjd6nv3bx5haji.cn-shanghai.personal.cr.aliyuncs.com/rocdove/wordpress:6.9.4
imagePullPolicy: IfNotPresent
name: ace-prod-wordpress
ports:
- containerPort: 80
name: app-tcp-80
protocol: TCP
resources:
limits:
cpu: "1"
ephemeral-storage: 20Gi
memory: 2Gi
requests:
cpu: 250m
ephemeral-storage: 10Gi
memory: 512Mi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /etc/localtime
name: volume-localtime
- mountPath: /var/www/html/wp-content
name: volume-ace-prod-wordpress
- mountPath: /var/www/html/wp-config.php
name: volume-wp-config
subPath: wp-config.php
volumes:
- hostPath:
path: /etc/localtime
type: ""
name: volume-localtime
- name: volume-ace-prod-wordpress
persistentVolumeClaim:
claimName: ace-prod-pvc-wordpress
- configMap:
defaultMode: 420
name: ace-prod-wp-config
name: volume-wp-config
topology:
subsets:
- name: subset-a
nodeSelectorTerm:
matchExpressions:
- key: alibabacloud.com/nodepool-id
operator: In
values:
- npxxx # 需要替换为节点池A的ID。
maxReplicas: 2
minReplicas: 1
- name: subset-b
nodeSelectorTerm:
matchExpressions:
- key: alibabacloud.com/nodepool-id
operator: In
values:
- npxxx # 需要替换为节点池B的ID。
maxReplicas: 2
minReplicas: 0
- name: subset-c
nodeSelectorTerm:
matchExpressions:
- key: type
operator: In
values:
- virtual-kubelet
tolerations:
- key: virtual-kubelet.io/provider
operator: Exists
minReplicas: 0
HorizontalPodAutoscaler
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: ace-prod-hpa-wordpress
namespace: ace
spec:
minReplicas: 1
maxReplicas: 5
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 20
scaleTargetRef:
apiVersion: apps.kruise.io/v1alpha1
kind: UnitedDeployment
name: ace-prod-ud-wordpress
Base Tools
# redis
FLUSHALL;
# 消耗CPU
openssl speed &
# Install dig and ab
sudo dnf install bind-utils httpd-tools
dig <域名> [txt]
ab -t <测试时长> -s <访问超时时间> -c <并发量> <url>
On ECS
部署
WordPress 6.9 目录树结构说明
/var/www/html/
├── wp-admin/ # WordPress 管理后台核心文件
├── wp-content/ # 用户内容目录
│ ├── plugins/ # 插件目录
│ │ └── redis-cache/ # Redis 缓存插件
│ ├── themes/ # 主题目录
│ ├── uploads/ # 上传文件目录
│ └── object-cache.php # Redis 对象缓存文件
├── wp-includes/ # WordPress 核心包含文件
├── wp-config.php # WordPress 配置文件(数据库、Redis 等)
├── wp-settings.php # WordPress 设置入口
├── index.php # WordPress 前端入口
└── .htaccess # Apache 重写规则
WordPress 目录结构分类
静态目录(运行过程中不变化)
/wp-admin- WordPress 管理界面文件/wp-includes- WordPress 核心库和函数文件/wp-content/plugins- 插件目录(插件文件本身不变)/wp-content/themes- 主题目录(主题文件本身不变)
动态目录(用户使用过程中数据更新)
/wp-content/uploads- 用户上传的媒体文件(图片、视频等)/wp-content/backup- 备份数据(如果存在)- 数据库目录 - 存储所有文章、评论、用户等数据
说明
- 静态目录主要包含 WordPress 系统代码和主题/插件程序文件
- 动态目录会因用户操作(发布文章、上传图片、评论等)而产生新数据
这些文件夹和文件结构
function log_prefix() {
echo "[$(date +'%Y-%m-%d %H:%M:%S')]"
}
sudo su - ecs-user
# install php
sudo dnf install -y httpd php php-mysqlnd php-gd php-ldap php-odbc php-pear php-xml php-xmlrpc
# install wordpress
echo "$(log_prefix) installing wordpress..."
wget https://cn.wordpress.org/wordpress-6.9-zh_CN.tar.gz -O wordpress-6.9-zh_CN.tar.gz
tar -zxf wordpress-6.9-zh_CN.tar.gz
## config wordpress
echo "$(log_prefix) config wordpress..."
sudo cat << 'EOF' > wordpress/wp-config.php
<?php
if (!function_exists('getenv_docker')) {
function getenv_docker($env, $default) {
if ($fileEnv = getenv($env . '_FILE')) {
return rtrim(file_get_contents($fileEnv), "\r\n");
}
else if (($val = getenv($env)) !== false) {
return $val;
}
else {
return $default;
}
}
}
// ** Database settings - You can get this info from your web host ** //
define( 'DB_NAME', getenv_docker('WORDPRESS_DB_NAME', 'ace-prod-wordpress') );
define( 'DB_USER', getenv_docker('WORDPRESS_DB_USER', 'ace_prod_wordpress') );
define( 'DB_PASSWORD', getenv_docker('WORDPRESS_DB_PASSWORD', 'example password') );
define( 'DB_HOST', getenv_docker('WORDPRESS_DB_HOST', 'mysql') );
define( 'DB_CHARSET', getenv_docker('WORDPRESS_DB_CHARSET', 'utf8mb4') );
define( 'DB_COLLATE', getenv_docker('WORDPRESS_DB_COLLATE', '') );
// add Redis Config
define( 'WP_REDIS_HOST', getenv_docker('WORDPRESS_REDIS_HOST', '127.0.0.1') );
define( 'WP_REDIS_PORT', getenv_docker('WORDPRESS_REDIS_PORT', 6379) );
define( 'WP_REDIS_PREFIX', getenv_docker('WORDPRESS_REDIS_PREFIX', 'my-moms-site') );
define( 'WP_REDIS_DATABASE', getenv_docker('WORDPRESS_REDIS_DATABASE', 0) ); // 0-15
define( 'WP_REDIS_PASSWORD', getenv_docker('WORDPRESS_REDIS_PASSWORD', '') );
define( 'WP_REDIS_TIMEOUT', getenv_docker('WORDPRESS_REDIS_TIMEOUT', 1) );
define( 'WP_REDIS_READ_TIMEOUT', getenv_docker('WORDPRESS_REDIS_READ_TIMEOUT', 1) );
define( 'AUTH_KEY', getenv_docker('WORDPRESS_AUTH_KEY', '99abd1e9ffdd9cc126605bcdf6639a3caa8c0b27') );
define( 'SECURE_AUTH_KEY', getenv_docker('WORDPRESS_SECURE_AUTH_KEY', 'f222517f366c8c42226b4f76f5b067f2503bc955') );
define( 'LOGGED_IN_KEY', getenv_docker('WORDPRESS_LOGGED_IN_KEY', '6196f322c499139d1df4d83c579601bc414e0a91') );
define( 'NONCE_KEY', getenv_docker('WORDPRESS_NONCE_KEY', 'a5ef87362a979a62d7ec68b6196c3bab2a1255ec') );
define( 'AUTH_SALT', getenv_docker('WORDPRESS_AUTH_SALT', '1ddc6c8a9c62ba56c2273fee355659c05ef7e865') );
define( 'SECURE_AUTH_SALT', getenv_docker('WORDPRESS_SECURE_AUTH_SALT', '4d3fdc62605c320ba88bc2c063565aeeb30b13c7') );
define( 'LOGGED_IN_SALT', getenv_docker('WORDPRESS_LOGGED_IN_SALT', 'a61ec326f3b07c1fb5519566faf3cef3f07b14c0') );
define( 'NONCE_SALT', getenv_docker('WORDPRESS_NONCE_SALT', '5dc5449d278131e72660f3b2419d4fea56473174') );
$table_prefix = getenv_docker('WORDPRESS_TABLE_PREFIX', 'wp_');
define( 'WP_DEBUG', !!getenv_docker('WORDPRESS_DEBUG', '') );
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false) {
$_SERVER['HTTPS'] = 'on';
}
if ($configExtra = getenv_docker('WORDPRESS_CONFIG_EXTRA', '')) {
eval($configExtra);
}
/* That's all, stop editing! Happy publishing. */
/** Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) ) {
define( 'ABSPATH', __DIR__ . '/' );
}
define( 'AUTOMATIC_UPDATER_DISABLED', true );
require_once ABSPATH . 'wp-settings.php';
EOF
sudo cp -arf wordpress/* /var/www/html/
# install plugin redis-cache
echo "$(log_prefix) installing plugin redis-cache..."
wget https://github.com/rhubarbgroup/redis-cache/archive/refs/tags/2.6.5.tar.gz -O redis-cache.2.6.5.tar.gz
tar -zxf redis-cache.2.6.5.tar.gz
sudo cp -arf redis-cache-2.6.5 /var/www/html/wp-content/plugins/redis-cache
sudo cp /var/www/html/wp-content/plugins/redis-cache/includes/object-cache.php /var/www/html/wp-content/
# start httpd
echo "$(log_prefix) starting httpd..."
sudo systemctl restart httpd
sudo systemctl enable httpd
echo "$(log_prefix) done"