教程:在 Kubernetes 集群上部署 WordPress 网站
WordPress 是专为每个人设计的开源软件,强调创建网站、博客或应用程序的可访问性、性能、安全性和易用性。WordPress 是一个基于 PHP 的内容管理系统(CMS),使用 MySQL 作为数据存储,目前很多网站、电商独立站、个人博客都采用了WordPress。不过,当用户访问量变多的时候,单一服务器很容易出现可用性问题。所以为了补足这一点,就需要建立集群。
本教程面向不熟悉 Kubernetes 的入门级用户。在本教程中,你将使用 Helm 在 Kubernetes 集群上安装 WordPress,创建高可用性网站。除了利用 Kubernetes 固有的可扩展性和高可用性之外,这种设置还能通过 Helm 提供简化的升级和回滚工作流,从而确保 WordPress 的安全。
我们还将配置 NitroPack,这是一个用于代码精简、缓存、CDN 和懒加载的插件。
我们将使用外部 MySQL 服务器来抽象数据库组件,因为它可以是单独集群或托管服务的一部分,可以提高可用性。
完成本教程所述步骤后,你就可以在 Kubernetes 管理的容器化集群环境中安装功能齐全的 WordPress,并建立一个更加高可用且安全的网站了。
WordPress 设置图
目录
- 概述
- WordPress 设置图
- 先决条件
- 建立受 DigitalOcean 管理的 Kubernetes 集群(DOKS)
- 安装和配置 OpenEBS 动态 NFS Provisioner
- 配置 WordPress MySQL 托管数据库
- 配置 Redis 数据库
- 配置 Redis 托管数据库
- 配置 Redis Helm 图
- 安装 WordPress
- 部署 Helm 图
- 确保流量的安全使用 Let's Encrypt 证书
- 安装 Nginx 入口控制器
- 为 Nginx 配置 DNS 入口控制器
- 安装证书管理器
- 为 WordPress 配置生产就绪的 TLS 证书
- 启用 WordPress 监控指标
- 配置 WordPress 插件
- 提高 WordPress 性能
- 配置 NitroPack 插件
- 升级 WordPress
- 结论
前提条件
要完成本教程,你需要:
- Helm,用于管理 WordPress、Nginx Ingress Controller 和 Cert-Manager 的发布和升级。
- Doctl CLI,用于管理 DigitalOcean 资源。
- Kubectl CLI,用于与 Kubernetes API 交互。
- 基本的 Kubernetes 知识。
- 配置一个域名(如 GoDaddy、Cloudflare 等)在你的账户中。
在此之前,你也可以阅读往期文章了解如何在 DigitalOcean 的 Droplet 云主机上一键安装 WordPress。
建立 DigitalOcean Kubernetes 托管集群(DOKS)
在开始教程步骤之前,你需要有一个 DigitalOcean 托管的 Kubernetes 集群(DOKS)。如果你已经配置了一个,可以跳到下一节 - 配置 WordPress MySQL 托管数据库。
你可以使用以下命令创建新的 DOKS 集群:
doctl k8s cluster create <YOUR_CLUSTER_NAME> \--auto-upgrade=false \--maintenance-window "saturday=21:00" \--node-pool "name=basicnp;size=s-4vcpu-8gb-amd;count=3;tag=cluster2;label=type=basic;auto-scale=true;min-nodes=2;max-nodes=4" \--region nyc1
注意:我们建议使用至少有 2 个工作节点的 DOKS 集群,以减少节点故障时对应用程序的影响。本教程中的示例使用了 3 个工作节点,每个节点 4 CPU/8GB(48 美元/月),自动扩展器最大配置为 2 至 4 个节点。选择不同的节点类型,你可以从 doctl compute 中查看更多选项。
请访问 How to Set Up a DigitalOcean Managed Kubernetes Cluster (DOKS) 获取更多详情。
安装和配置 OpenEBS 动态 NFS Provisioner
本节介绍如何使用 Helm 安装 NFS 配置器。如果你想使用 DigitalOcean Kubernetes 一键安装,请跳过本节,使用 DigitalOcean Kubernetes 1-Click Apps 安装 NFS 配置器。
每次使用持久化卷(PersistentVolume)作为 Kubernetes 有状态应用程序的一部分时,都会配置一个新的 DigitalOcean 块存储卷。StorageClass 资源会告诉 Kubernetes 可用的底层存储类型。DigitalOcean 默认使用 "块存储"(do-block-storage)。
下面的命令列出了 Kubernetes 集群的可用存储类:
kubectl get sc
输出结果类似于:
Output
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
do-block-storage (default) dobs.csi.digitalocean.com Delete Immediate true 24h
DigitalOcean 块存储卷(Block Storage Volumes)是由单个节点以读写方式(RWO)挂载的。其他节点不能挂载同一个卷。持久卷(PersistentVolume)的数据内容不能被多个 Pod 同时访问。
水平 Pod 自动扩展(HPA)用于扩展动态 StatefulSet 中的 WordPress Pod,因此 WordPress 需要一个被许多节点(RWX)挂载为读写器的卷。
NFS(网络文件系统)是在块存储上提供 RWX 卷的常用解决方案。该服务器在 RWX 模式下提供持久卷申领(PVC),以便多个网络应用程序能以共享的方式访问数据。
OpenEBS 动态 NFS Provisioner 允许用户创建一个 NFS PV,在用户选择的后端存储之上为每个 PV 设置一个新的内核 NFS 实例。
接下来,你将使用以下命令在 Kubernetes 集群上安装 OpenEBS 动态 NFS Provisioner:
首先,克隆 container-blueprints 仓库。然后,将目录更改为你本地副本中的 DOKS-wordpress 子文件夹:
git clone https://github.com/digitalocean/container-blueprints.git
cd container-blueprints/DOKS-wordpress
接下来,添加 Helm 仓库:
helm repo add openebs-nfs https://openebs.github.io/dynamic-nfs-provisioner
helm repo update
然后,打开并检查仓库中提供的 assets/manifests/openEBS-nfs-provisioner-values.yaml
文件:
nfsStorageClass:backendStorageClass: "do-block-storage"
注意:上面显示的覆盖值将 backendStorageClass
的默认值更改为 do-block-storage
。请访问 openebs nfs provisioner helm values 了解完整的 values.yaml
文件和更多详细信息。
最后,使用 Helm 安装图表:
helm install openebs-nfs openebs-nfs/nfs-provisioner --version 0.9.0 \--namespace openebs \--create-namespace \-f "assets/manifests/openEBS-nfs-provisioner-values.yaml"
注意:使用的是特定版本的 Helm 图表。在本例中,选择了 0.9.0 版本,该版本对应应用程序的 0.9.0 版本。一般来说,锁定特定版本是一种好的做法。这有助于获得可预测的结果,并允许通过 Git 进行版本控制。
你可以通过以下方式验证 openEBS 的部署状态:
helm ls -n openebs
输出结果类似于(注意 STATUS 列的值为 "deployed"):
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
openebs-nfs openebs 1 2022-05-09 10:58:14.388721 +0300 EEST deployed nfs-provisioner-0.9.0 0.9.0
NFS 配置器需要一个块存储设备来创建 NFS 服务器所需的磁盘容量。接下来,你将配置 DigitalOcean 提供的默认 Kubernetes Storage Class (do-block-storage
) 作为 NFS 配置器的后端存储。在这种情况下,任何使用新创建的 Storage Class 的应用程序,都可以在 DigitalOcean 卷上通过 OpenEBS NFS 配置器使用共享存储(NFS)。
接下来,打开并检查仓库中提供的 sc-rwx-values.yaml
文件:
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: rwx-storageannotations: openebs.io/cas-type: nsfrwxcas.openebs.io/config: |- name: NSFServerTypevalue: "kernel"- name: BackendStorageClassvalue: "do-block-storage"
provisioner: openebs.io/nfsrwx
reclaimPolicy: Delete
上述配置的解释:
provisioner
- 定义了用于配置 PV 的存储类(例如 openebs.io/nfsrwx)reclaimPolicy
- 动态配置的卷会在用户删除相应的 PersistentVolumeClaim 时自动删除
有关 openEBS 的更多信息,请访问 OpenEBS 文档。
通过 kubectl 应用:
kubectl apply -f assets/manifests/sc-rwx-values.yaml
通过执行以下命令验证是否创建了 StorageClass:
kubectl get sc
输出结果类似于:
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
do-block-storage (default) dobs.csi.digitalocean.com Delete Immediate true 107m
openebs-kernel-nfs openebs.io/nfsrwx Delete Immediate false 84m
rwx-storage openebs.io/nfsrwx Delete Immediate false 84m
现在,你有了一个名为 rwx-storage
的新 StorageClass,可以在 DigitalOcean Block Storage 上动态配置共享卷。
配置 WordPress MySQL 托管数据库
在本节中,你将创建一个专用的 MySQL 数据库,例如 DigitalOcean 的托管数据库用于 WordPress。这是必要的,因为你的 WordPress 安装将位于 Kubernetes 集群内的单独服务器上。(可观看视频教程了解如何快速配置数据库)
默认情况下,WordPress Helm 图表在集群内的单独 pod 上安装 MariaDB 并将其配置为默认数据库。在决定使用托管数据库还是默认的 MariaDB 之前,你应该考虑以下几个方面:
- 使用托管数据库服务时,你只需决定数据库服务器的初始大小即可。此外,自动化方面也具有吸引力。执行更新、运行迁移和创建备份都是自动完成的。有关托管数据库的更多信息,请参阅这篇文章。使用托管数据库会产生额外费用。
- 使用默认的 MariaDB Helm 图表安装时,需要注意 DB pods(数据库应用容器)是临时的,因此它们可能会经常重启或失败。特定的管理任务如备份或扩展需要更多的手动工作和设置来实现这些目标。使用 MariaDB 安装不会产生任何额外费用。
如果你不想使用外部数据库,请跳到下一章 - 配置 Redis 数据库。
首先,创建 MySQL 托管数据库:
doctl databases create wordpress-mysql --engine mysql --region nyc1 --num-nodes 2 --size db-s-2vcpu-4gb
本教程中的示例使用一个主节点和一个从节点,2 个 CPU/4 GB(100 美元/月)。有关可用大小的列表,请访问:DigitalOcean API 参考。
输出结果类似于以下内容(STATE 列应显示 online):
Output
ID Name Engine Version Number of Nodes Region Status Size
2f0d0969-a8e1-4f94-8b73-2d43c68f8e72 wordpress-mysql-test mysql 8 1 nyc1 online db-s-1vcpu-1gb
要完成 MySQL 的设置,需要数据库 ID。你可以运行以下命令来打印你的 MySQL 数据库 ID:
doctl databases list
接下来,创建 WordPress 数据库用户:
doctl databases user create 2f0d0969-a8e1-4f94-8b73-2d43c68f8e72 wordpress_user
输出结果类似于以下内容(密码将自动生成):
Name Role Password
wordpress_user normal *******
默认情况下,新用户可以获得整个数据库的全部权限。一般来说,最好的安全做法是将新用户的权限限制在 WordPress 数据库内。你可以按照 DigitalOcean 提供的如何修改 MySQL 数据库中的用户权限指南来完成这项任务。
接下来,创建主要的 WordPress 数据库:
doctl databases db create 2f0d0969-a8e1-4f94-8b73-2d43c68f8e72 wordpress
输出结果类似于以下内容(密码将自动生成):
Name
wordpress
最后,你需要在 MySQL 数据库和 Kubernetes 集群 (DOKS) 之间设置可信源:
首先,提取 Kubernetes 集群 ID:
doctl kubernetes cluster list
输出结果类似于以下内容:
Output
ID Name Region Version Auto Upgrade Status Node Pools
c278b4a3-19f0-4de6-b1b2-6d90d94faa3b k8s-cluster nyc1 1.21.10-do.0 false running basic
最后,限制传入连接:
doctl databases firewalls append 2f0d0969-a8e1-4f94-8b73-2d43c68f8e72 --rule k8s:c278b4a3-19f0-4de6-b1b2-6d90d94faa3b
注意:
2f0d0969-a8e1-4f94-8b73-2d43c68f8e72
:表示数据库 IDc278b4a3-19f0-4de6-b1b2-6d90d94faa3b
:表示 Kubernetes ID
请访问如何保护 MySQL 托管数据库集群了解更多详细信息。
配置 Redis 数据库
远程字典服务器(Redis)是一种内存、持久、键值数据库,也称为数据结构服务器。Redis 的缓存机制与 MySQL 或 MariaDB 结合使用时,可以加快 WordPress 数据库查询的速度。Redis 允许你在内存中缓存和存储数据,以实现高性能的数据检索和存储。使用 Redis,可以将 MySQL 数据库查询处理的数据存储在 Redis 缓存实例中,以便快速检索。
安装和配置 Redis 实例有两种方式。使用 DigitalOcean 的托管数据库服务或通过 Helm 图表安装。以下将探讨这两种选项。
配置 Redis DO 托管数据库
在本节中,你将使用 DigitalOcean 创建一个 Redis 数据库。如果不想使用托管数据库,请跳至下一节 - 配置 Redis Helm 图。
在决定使用托管数据库还是 Helm 安装的数据库之前,你应该考虑以下几个方面:
- 使用托管数据库服务时,你只需决定数据库服务器的初始大小即可。此外,自动化方面也具有吸引力。执行更新、运行迁移和创建备份都是自动完成的。使用托管数据库会产生额外费用。
- 使用 Redis Helm 图表安装时,需要注意 DB pods(数据库应用容器)是临时的,因此它们可能会经常重启或失败。特定的管理任务如备份或扩展需要更多的手动工作和设置来实现这些目标。使用 Redis 安装不会产生任何额外费用。
首先,创建 Redis 托管数据库:
doctl databases create wordpress-redis --engine redis --region nyc1 --num-nodes 1 --size db-s-1vcpu-1gb
本教程中的示例使用一个节点,1 个 CPU/1 GB(10 美元/月)。有关可用大小的列表,请访问API 文档。
输出结果类似于以下内容(STATE 列应显示 online):
Output
ID Name Engine Version Number of Nodes Region Status Size
91180998-7fe2-450c-b353-492d8abcddad wordpress-redis redis 6 1 nyc1 creating db-s-1vcpu-1gb
接下来,你需要在 Redis 数据库和 Kubernetes 集群 (DOKS) 之间设置可信源:
- 首先,提取 Kubernetes 集群 ID:
doctl kubernetes cluster list
输出结果类似于以下内容:
Output
ID Name Region Version Auto Upgrade Status Node Pools
c278b4a3-19f0-4de6-b1b2-6d90d94faa3b k8s-cluster nyc1 1.21.10-do.0 false running basic
- 最后,限制传入连接:
doctl databases firewalls append 2f0d0969-a8e1-4f94-8b73-2d43c68f8e72 --rule k8s:c278b4a3-19f0-4de6-b1b2-6d90d94faa3b
请访问如何保护 Redis 托管数据库集群了解更多详细信息。
配置 Redis Helm 图表
在本节中,你将使用 Bitnami Redis Helm 图表在 Kubernetes 集群中创建一个 Redis 数据库。
首先,添加 Helm 仓库,并列出可用的图表:
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update bitnami
接下来,打开并检查仓库中提供的 assets/manifests/redis-values.yaml
文件:
master:persistence:enabled: truestorageClass: rwx-storageaccessModes: ["ReadWriteMany"]size: 5Gi
auth:enabled: truepassword: <YOUR_REDIS_PASSWORD_HERE>architecture: standalone
上述配置的解释:
master.persistance
块 - 启用 Redis 主节点上的持久性,使用 PVC 并将 PV 存储类设置为之前创建的存储类auth
块 - 启用并设置密码认证,密码由用户设置architecture
- Redis 架构。独立的 Redis StatefulSet。Redis 主服务指向主节点,可以在此执行读写操作。
注意:大多数覆盖项可以自定义。请访问 redis helm values 了解更多详细信息。
最后,使用 Helm 安装图表:
helm upgrade redis bitnami/redis \--atomic \--create-namespace \--install \--namespace redis \--version 17.0.5 \--values assets/manifests/redis-values.yaml
使用的是特定版本的 Redis Helm 图表。在本例中,选择了 17.0.5 版本,该版本对应 Redis 的 7.0.4 版本。一般来说,锁定特定版本是一种好的做法。这有助于获得可预测的结果,并允许通过 Git 进行版本控制。
检查 Helm 发布状态:
helm ls -n redis
输出结果类似于(注意 STATUS 列的值为 "deployed"):
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
redis redis 1 2022-06-02 08:45:38.617726 +0300 EEST deployed redis-17.0.5 7.0.4
验证 Redis 是否正常运行:
kubectl get all -n redis
输出结果类似于(所有 Redis pods 应为 UP 和 RUNNING 状态):
NAME READY STATUS RESTARTS AGE
pod/redis-master-0 1/1 Running 0 2m24sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/redis-headless ClusterIP None <none> 6379/TCP 2m25s
service/redis-master ClusterIP 10.245.14.50 <none> 6379/TCP 2m25sNAME READY AGE
statefulset.apps/redis-master 1/1 2m26s
安装 WordPress
部署 Helm 图表
在本节中,你将使用 Bitnami WordPress Helm 图表在 Kubernetes 集群中安装 WordPress。
最重要的 Helm 图表值是:
externalDatabase
- 配置 WordPress 使用外部数据库(例如 DigitalOcean 托管的 MySQL 数据库)。mariadb.enabled
- 配置 WordPress 使用集群内数据库(例如 MariaDB)。
首先,添加 Helm 仓库,并列出可用的图表:
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update bitnami
接下来,打开并检查仓库中提供的 assets/manifests/wordpress-values.yaml
文件:
# WordPress 服务类型
service:type: ClusterIP# 启用使用持久卷声明的持久性
persistence:enabled: truestorageClassName: rwx-storageaccessModes: ["ReadWriteMany"]size: 5GivolumePermissions:enabled: true# Prometheus 导出器 / 指标配置
metrics:enabled: false# 允许的自动更新级别。允许值:major, minor 或 none。
wordpressAutoUpdateLevel: minor# 用于生成 WordPress URL 的方案
wordpressScheme: https# WordPress 凭据
wordpressUsername: <YOUR_WORDPRESS_USER_NAME_HERE>
wordpressPassword: <YOUR_WORDPRESS_USER_PASSSWORD_HERE># 外部数据库详细信息
externalDatabase:host: <YOUR_WORDPRESS_MYSQL_DB_HOST_HERE>port: 25060user: <YOUR_WORDPRESS_MYSQL_DB_USER_NAME_HERE>password: <YOUR_WORDPRESS_MYSQL_DB_USER_PASSWORD_HERE>database: <YOUR_WORDPRESS_MYSQL_DB_NAME_HERE># 禁用 MariaDB
mariadb:enabled: falsewordpressExtraConfigContent: |define( 'WP_REDIS_SCHEME', '<REDIS_SCHEME>' );define( 'WP_REDIS_HOST', '<REDIS_HOST>' );define( 'WP_REDIS_PORT', <REDIS_PORT> );define( 'WP_REDIS_PASSWORD', '<REDIS_PASSWORD>');define( 'WP_REDIS_DATABASE', 0 );
大多数覆盖项可以自定义。请访问 wordpress helm values 了解更多详细信息。使用托管 Redis DO 数据库时,WP_REDIS_SCHEME
参数需要设置为 tls
,而使用 helm 安装的 Redis 数据库时需要设置为 tcp
。对于 helm 安装的 Redis 数据库,可以通过以下命令获取 WP_REDIS_HOST
参数值:
kubectl exec -i -t <REDIS_POD> --namespace redis -- hostname -i
最后,使用 Helm 安装图表:
helm upgrade wordpress bitnami/wordpress \--atomic \--create-namespace \--install \--namespace wordpress \--version 15.0.11 \--values assets/manifests/wordpress-values.yaml
使用的是特定版本的 WordPress Helm 图表。在本例中,选择了 15.0.11 版本,该版本对应 WordPress 的 6.0.1 版本。一般来说,锁定特定版本是一种好的做法。这有助于获得可预测的结果,并允许通过 Git 进行版本控制。
检查 Helm 发布状态:
helm ls -n wordpress
输出结果类似于(注意 STATUS 列的值为 "deployed"):
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
wordpress wordpress 1 2022-03-22 14:22:18.146474 +0200 EET deployed wordpress-15.0.11 6.0.1
验证 WordPress 是否正常运行:
kubectl get all -n wordpress
输出结果类似于(所有 WordPress pods 应为 UP 和 RUNNING 状态):
NAME READY STATUS RESTARTS AGE
pod/wordpress-6f55c9ffbd-4frrh 1/1 Running 0 23hNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/wordpress ClusterIP 10.245.36.237 <none> 80/TCP,443/TCP 23hNAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/wordpress 1/1 1 1 23hNAME DESIRED CURRENT READY AGE
replicaset.apps/wordpress-6f55c9ffbd 1 1 1 23h
验证 wordpress
命名空间下创建的 PVC 和 openebs
命名空间下关联的 OpenEBS 卷:
kubectl get pvc -A
输出结果类似于(注意 WordPress PVC 的 RWX 访问模式,以及之前通过 OpenEBS NFS provisioner 定义的新存储类):
NAMESPACE NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
openebs nfs-pvc-2b898be6-19f4-4e52-ab9b-10e73ce7d82f Bound pvc-b253c0eb-b02b-46a6-ae88-9a7dd2b71377 5Gi RWO do-block-storage 10m
openebs nfs-pvc-4ce1c2a8-ee65-420f-a722-50f4e50c60a7 Bound pvc-2f2c9dd8-807d-4919-aac1-ab1af69e24c7 5Gi RWO do-block-storage 3m22s
redis redis-data-redis-master-0 Bound pvc-2b898be6-19f4-4e52-ab9b-10e73ce7d82f 5Gi RWX rwx-storage 10m
wordpress wordpress Bound pvc-4ce1c2a8-ee65-420f-a722-50f4e50c60a7 5Gi RWX rwx-storage 3m22s
验证集群中创建的关联 PV:
kubectl get pv
输出结果类似于:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-2b898be6-19f4-4e52-ab9b-10e73ce7d82f 5Gi RWX Delete Bound redis/redis-data-redis-master-0 rwx-storage 12m
pvc-2f2c9dd8-807d-4919-aac1-ab1af69e24c7 5Gi RWO Delete Bound openebs/nfs-pvc-4ce1c2a8-ee65-420f-a722-50f4e50c60a7 do-block-storage 4m48s
pvc-4ce1c2a8-ee65-420f-a722-50f4e50c60a7 5Gi RWX Delete Bound wordpress/wordpress rwx-storage 4m48s
pvc-b253c0eb-b02b-46a6-ae88-9a7dd2b71377 5Gi RWO Delete Bound openebs/nfs-pvc-2b898be6-19f4-4e52-ab9b-10e73ce7d82f do-block-storage 12m
你还可以创建其他 pods 以展示 NFS provisioner 的能力,方法是打开 wordpress-values.yaml
文件并添加 replicaCount
行,设置为所需的副本数。
...
replicaCount: 3
...
使用 helm upgrade
命令应用更改:
helm upgrade wordpress bitnami/wordpress \--atomic \--create-namespace \--install \--namespace wordpress \--version 15.0.11 \--values assets/manifests/wordpress-values.yaml
验证更改是否已应用。注意增加的副本数和 pods 数量:
kubectl get all -n wordpress
输出结果类似于:
NAME READY STATUS RESTARTS AGE
pod/wordpress-5f5f4cf94c-d7mqb 1/1 Running 0 2m58s
pod/wordpress-5f5f4cf94c-qkxdq 1/1 Running 0 3m38s
pod/wordpress-5f5f4cf94c-zf46h 1/1 Running 0 87sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/wordpress ClusterIP 10.245.151.58 <none> 80/TCP,443/TCP 35mNAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/wordpress 3/3 3 3 35mNAME DESIRED CURRENT READY AGE
replicaset.apps/wordpress-5f5f4cf94c 3 3 3 35m
replicaset.apps/wordpress-798789f994 0 0 0 19m
我们还可以检查 pods 部署的位置:
kubectl get all -n wordpress -o wide
输出结果类似于(注意 pods 部署在不同的节点上):
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/wordpress-5f5f4cf94c-d7mqb 1/1 Running 0 4m7s 10.244.0.206 basicnp-cwxop <none> <none>
pod/wordpress-5f5f4cf94c-qkxdq 1/1 Running 0 4m47s 10.244.1.84 basicnp-cwxol <none> <none>
pod/wordpress-5f5f4cf94c-zf46h 1/1 Running 0 2m36s 10.244.0.194 basicnp-cwxop <none> <none>
使用 Let's Encrypt 证书确保流量安全
Bitnami WordPress Helm 图表通过 cert-manager 内置了对 Ingress 路由和证书管理的支持。这使得使用包括 Let's Encrypt 在内的各种证书提供商的证书来配置 TLS 支持变得容易。
安装 Nginx Ingress Controller
首先,添加 Helm 仓库,并列出可用的图表:
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update ingress-nginx
接下来,使用 Helm 安装 Nginx Ingress Controller:
helm install ingress-nginx ingress-nginx/ingress-nginx --version 4.1.3 \--namespace ingress-nginx \--create-namespace
接下来,通过运行以下命令检查 Helm 安装是否成功:
helm ls -n ingress-nginx
输出结果类似于(注意 STATUS 列的值为 "deployed"):
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
ingress-nginx ingress-nginx 1 2022-02-14 12:04:06.670028 +0200 EET deployed ingress-nginx-4.1.3 1.2.1
最后,列出 DigitalOcean 账户中的所有负载均衡器资源,并打印 IP、ID、名称和状态:
doctl compute load-balancer list --format IP,ID,Name,Status
输出结果类似于(应该包含为 Nginx Ingress Controller 创建的新负载均衡器资源,状态应为健康):
IP ID Name Status
45.55.107.209 0471a318-a98d-49e3-aaa1-ccd855831447 acdc25c5cfd404fd68cd103be95af8ae active
为 Nginx Ingress Controller 配置 DNS
在此步骤中,你将使用你拥有的域名在 DigitalOcean 账户中配置 DNS。然后,你将为 WordPress 创建域名 A 记录。
首先,请发出以下命令以创建新域(例如 bond-0.co):
doctl compute domain create bond-0.co
注意:你需要确保你的域名注册商已配置为指向 DigitalOcean 名称服务器。请访问 如何设置 DigitalOcean 名称服务器 获取更多信息。
接下来,你将为 WordPress 应用程序添加所需的 A 记录。首先,需要确定由 Nginx 部署创建的负载均衡器外部 IP:
kubectl get svc -n ingress-nginx
输出结果类似于(注意 ingress-nginx-controller 服务的 EXTERNAL-IP 列值):
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 10.245.109.87 45.55.107.209 80:32667/TCP,443:31663/TCP 25h
ingress-nginx-controller-admission ClusterIP 10.245.90.207 <none> 443/TCP 25h
然后,添加记录(请相应替换 <>
占位符)。你可以根据需要更改 TTL 值:
doctl compute domain records create bond-0.co --record-type "A" --record-name "wordpress" --record-data "<YOUR_LB_IP_ADDRESS>" --record-ttl "30"
提示:如果你的账户中只有一个负载均衡器,请使用以下代码片段:
LOAD_BALANCER_IP=$(doctl compute load-balancer list --format IP --no-header)
doctl compute domain records create bond-0.co --record-type "A" --record-name "wordpress" --record-data "$LOAD_BALANCER_IP" --record-ttl "30"
观察和结果:
列出 bond-0.co 域的可用记录:
doctl compute domain records list bond-0.co
输出结果类似于:
Output
ID Type Name Data Priority Port TTL Weight
311452740 SOA @ 1800 0 0 1800 0
311452742 NS @ ns1.digitalocean.com 0 0 1800 0
311452743 NS @ ns2.digitalocean.com 0 0 1800 0
311452744 NS @ ns3.digitalocean.com 0 0 1800 0
311453305 A wordpress 45.55.107.209 0 0 30 0
安装 Cert-Manager
首先,添加 Jetstack Helm 仓库并列出可用的图表:
helm repo add jetstack https://charts.jetstack.io
helm repo update jetstack
接下来,使用 Helm 安装 Cert-Manager:
helm install cert-manager jetstack/cert-manager --version 1.8.0 \--namespace cert-manager \--create-namespace \--set installCRDs=true
最后,通过运行以下命令检查 Cert-Manager 安装是否成功:
helm ls -n cert-manager
输出结果类似于(STATUS 列应显示 "deployed"):
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
cert-manager cert-manager 1 2021-10-20 12:13:05.124264 +0300 EEST deployed cert-manager-v1.8.0 v1.8.0
为 WordPress 配置生产就绪的 TLS 证书
首先,需要一个集群颁发者来获取最终的 TLS 证书。打开并检查仓库中提供的 assets/manifests/letsencrypt-issuer-values-values.yaml
文件:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:name: letsencrypt-prodnamespace: wordpress
spec:acme:# 你必须将此电子邮件地址替换为你自己的。# Let's Encrypt 将使用此地址与您联系有关证书到期和账户相关的问题。email: <YOUR-EMAIL-HERE>server: https://acme-v02.api.letsencrypt.org/directoryprivateKeySecretRef:# 用于存储账户私钥的 Secret 资源。name: prod-issuer-account-key# 添加一个单一的挑战解决器,使用 nginx 进行 HTTP01 验证solvers:- http01:ingress:class: nginx
通过 kubectl 应用:
kubectl apply -f assets/manifests/letsencrypt-issuer-values.yaml
为了确保 WordPress 流量安全,打开之前创建的 wordpress-values.yaml
文件,并在末尾添加以下设置:
# 启用 WordPress 的 Ingress 记录生成
ingress:enabled: truecertManager: truetls: falsehostname: <YOUR_WORDPRESS_DOMAIN_HERE>annotations:kubernetes.io/ingress.class: "nginx"cert-manager.io/cluster-issuer: "letsencrypt-prod"extraTls:- hosts:- <YOUR_WORDPRESS_DOMAIN_HERE>secretName: wordpress.local-tls
通过 helm 升级:
helm upgrade wordpress bitnami/wordpress \--create-namespace \--namespace wordpress \--version 15.0.11 \--timeout 10m0s \--values assets/manifests/wordpress-values.yaml
这会自动通过 cert-manager 创建一个证书。然后,你可以通过运行以下命令验证你是否已成功获取证书:
kubectl get certificate -n wordpress wordpress.local-tls
如果成功,输出的 READY 列应显示 True:
NAME READY SECRET AGE
wordpress.local-tls True wordpress.local-tls 24h
现在,你可以使用之前配置的域名访问 WordPress。你将通过安装过程的引导。
启用 WordPress 监控指标
在本节中,你将学习如何启用指标来监控 WordPress 实例。
首先,打开之前在本教程中创建的 wordpress-values.yaml
文件,并将 metrics.enabled
字段设置为 true:
# Prometheus 导出器 / 指标配置
metrics:enabled: true
使用 Helm 应用更改:
helm upgrade wordpress bitnami/wordpress \--create-namespace \--namespace wordpress \--version 15.0.11 \--timeout 10m0s \--values assets/manifests/wordpress-values.yaml
接下来,端口转发 wordpress 服务以检查可用的指标:
kubectl port-forward --namespace wordpress svc/wordpress-metrics 9150:9150
现在,打开 Web 浏览器并导航到 localhost:9150/metrics
,查看所有 WordPress 指标。
最后,你需要配置 Grafana 和 Prometheus 来可视化你的新 WordPress 实例暴露的指标。请访问 如何安装 Prometheus 监控堆栈 了解如何安装和配置 Grafana 和 Prometheus。
配置 WordPress 插件
插件是 WordPress 网站的构建模块。无论你是需要添加联系表单、改善 SEO、提高网站速度、创建在线商店,还是提供电子邮件订阅等功能,插件都能为你的网站带来重要功能。
以下是一些推荐的插件:
- Contact Form by WPForms:允许你为你的网站创建精美的联系表单、反馈表单、订阅表单、付款表单以及其他类型的表单。
- MonsterInsights:是 WordPress 上最好的 Google Analytics 插件。它可以“正确”地将你的网站与 Google Analytics 连接起来,这样你就可以清楚地看到人们如何发现和使用你的网站。
- All in One SEO:帮助你从搜索引擎获得更多的访问量。虽然 WordPress 本身是 SEO 友好的,但使用 SEO 最佳实践可以大幅增加你的网站流量。
- SeedProd:是 WordPress 上最好的拖放式页面生成器。它允许你轻松定制网站设计,并创建自定义页面布局,而无需编写任何代码。
- LiteSpeed Cache:是一款多功能网站加速插件,具有独有的服务器级缓存和优化功能集合。
- UpdraftPlus:简化了备份和恢复。将文件和数据库备份到云端,并一键恢复。
- Query Monitor:WordPress 的开发者工具面板。它可以调试数据库查询、PHP 错误、钩子和操作。
更多插件请访问 WordPress 插件。
提高 WordPress 性能
CDN(内容分发网络)是加快 WordPress 网站速度的一种简单方法。CDN 是一种服务器设置,通过优化媒体文件的传输请求来提高网页的加载速度。当访问者远离服务器位置时,大多数网站会面临延迟问题。使用 CDN 可以通过在提供静态内容(如图像、CSS、JavaScript 和视频流)时卸载 Web 服务器来加快内容交付速度。缓存静态内容的另一个好处是最小化延迟。CDN 是优化网站并改善全球用户体验的可靠解决方案。
配置 NitroPack 插件
NitroPack 是一款用于优化网站速度和性能的插件。
接下来,你将为你的 WordPress 实例配置 NitroPack 插件。
注意:通过 WordPress Helm 图表值文件(wordpress-values.yaml)配置的管理员密码在尝试登录 WordPress 管理员控制台时会失败。要更改密码,你需要连接到数据库并重置它。首先,如果你不熟悉 DigitalOcean 管理的数据库,请阅读 如何连接到 MySQL 数据库集群。然后,按照 WordPress 支持网站上的 重置 WordPress 用户密码 文章进行操作。
请按照以下步骤为你的 WordPress 实例配置 NitroPack 插件:
- 通过以下链接在你的 Web 浏览器中打开 WordPress 安装的管理员控制台(确保相应替换
<YOUR_WORDPRESS_DOMAIN_HERE>
占位符):
https://<YOUR_WORDPRESS_DOMAIN_HERE>/wp-admin
- 当被要求时,请使用 WordPress 管理员凭据登录。
- 点击插件菜单项,然后打开“添加新”子菜单。
- 搜索 NitroPack 插件,然后在结果页面中点击“立即安装”按钮。安装完成后,点击“激活”按钮。你应该能看到插件添加到你的插件列表中。
- 点击插件名称下的设置链接。在接下来的页面中,点击“连接到 NitroPack”按钮。接下来,你将被重定向到登录或创建一个新的 NitroPack 账户。
- NitroPack.io 仪表板页面应打开,显示与计划、优化页面等相关的信息。
接下来,请按照以下步骤将你的网站与 NitroPack 连接:
- 导航至 NitroPack,使用配置插件时创建的账户登录。
- 点击“添加新网站”菜单项,然后填写网站 URL 和网站名称。现在,点击“免费订阅”选项,然后点击“继续”按钮。
- 如果你的域名托管在 Cloudflare 上,你将被提示将你的 Cloudflare 账户与 NitroPack 账户连接。
- 你应该可以看到仪表板上的缓存信息。
注意:安装 NitroPack 后你可能会看到以下信息:Could not turn on the WP_CACHE constant in wp-config.php.
这是由于 wp-config.php 文件的权限限制。要解决此问题,你需要使用 kubectl SSH 进入 WordPress 容器:
kubectl exec --stdin --tty <your_wordpress_pod> -n wordpress -- /bin/bash
导航到容器内的 /bitnami/wordpress
目录并运行以下命令更改权限:
chmod 0644 wp-config.php
重启插件主页应解决该错误。
你还可以查看这篇文章了解 NitroPack 是否正在为访问者提供优化页面。
配置 Cloudflare
Cloudflare 是一家提供内容分发网络(CDN)、DNS、DDoS 保护和安全服务的公司。Cloudflare 是加快和增强 WordPress 网站安全性的好解决方案。
注意:配置此项需要一个 Cloudflare 账户。如果你没有,请访问 Cloudflare 网站 并注册一个免费账户。如果 WordPress 安装是使用其他注册商(如 GoDaddy)购买的域名配置的,你需要将其自定义名称服务器更改为指向 Cloudflare 名称服务器。
请按照以下步骤配置 Cloudflare 以配合你的 WordPress 网站:
- 使用你的账户登录 Cloudflare 仪表板,并点击“+添加站点”。
- 输入 WordPress 网站的域名,然后点击“添加站点”按钮。
- 在计划选择页面中,点击“免费计划”下的“开始使用”按钮。
- 在“查看 DNS 记录”页面,点击“添加记录”按钮并添加 A 记录。
- 为记录选择一个名称,并确保输入的 IPv4 地址是 DigitalOcean 负载均衡器的地址,然后点击“继续”按钮。
- 在下一页,你将被要求删除域名注册商中的任何自定义名称服务器,并添加 Cloudflare 的名称服务器。使用你的管理员账户登录域名注册商并更改自定义名称服务器。
- 点击“完成,检查名称服务器”按钮。
- 在下一页,Cloudflare 提供了一些配置建议,可以跳过,稍后处理。点击“跳过建议”链接。
当站点在 Cloudflare 上激活时,将发送电子邮件通知你。在 Cloudflare 账户中,你可以查看分析页面,获取有关 WordPress 网站的 Web 流量信息。
处理名称服务器更新可能需要最多 24 小时完成。
配置 Redis 对象缓存
WordPress 会进行多次 MySQL 查询,而 Redis 对象缓存可以优化 WordPress 数据库的使用。Redis 对象可用于存储发送到 MySQL 服务器的特定查询的请求输出缓存。
接下来,你将为你的 WordPress 实例配置 Redis 对象缓存插件。
请按照以下步骤配置 Redis 对象缓存,使其与你的 WordPress 网站配合使用:
- 在浏览器中通过以下链接打开 WordPress 安装的管理员控制面板(确保相应替换
<YOUR_WORDPRESS_DOMAIN_HERE>
占位符):
plaintext https://<YOUR_WORDPRESS_DOMAIN_HERE>/wp-admin
- 当被要求时,请使用 WordPress 管理员凭据登录。
- 点击插件菜单项,然后打开“添加新”子菜单。
- 搜索 Redis 对象缓存插件,然后在结果页面中点击“立即安装”按钮。安装完成后,点击“激活”按钮。你应该能看到插件概述页面。
- 点击“启用对象缓存”按钮。插件应连接到 Redis 集群,并显示“已连接”状态。
升级 WordPress
由于 WordPress 如此受欢迎,它经常成为恶意利用的目标,因此,保持它的最新版本是非常重要的。你可以通过 helm 升级命令升级 WordPress。
首先,更新 helm 仓库:
helm repo update
接下来,将 WordPress 升级到新版本:
helm upgrade wordpress bitnami/wordpress \--atomic \--create-namespace \--install \--namespace wordpress \--version <WORDPRESS_NEW_VERSION> \--timeout 10m0s \--values assets/manifests/wordpress-values.yaml
将 <WORDPRESS_NEW_VERSION>
替换为新版本号。
结论
在本指南中,你学习了如何使用 Helm 和外部 MySQL 数据库,以 Kubernetes 方式安装 WordPress。你还学习了如何将 WordPress 升级到新版本,以及在出错时如何回滚到之前的版本。
如果你想了解有关 Kubernetes 和 Helm 的更多信息,请查看我们社区页面的 DO Kubernetes 部分。
感谢你与 DigitalOcean 社区一起学习。查看我们的 计算、存储、负载均衡、DDoS 和 托管数据库 产品,了解更多产品信息。中国区用户需要技术支持,或需要咨询更多产品方案或场景,比如程序化广告、跨境电商,可联系 DigitalOcean 中国区独家战略合作伙伴卓普云。
相关文章:
![](https://img-blog.csdnimg.cn/direct/9801c0035c104c7abc7c614f87e116e5.png)
教程:在 Kubernetes 集群上部署 WordPress 网站
WordPress 是专为每个人设计的开源软件,强调创建网站、博客或应用程序的可访问性、性能、安全性和易用性。WordPress 是一个基于 PHP 的内容管理系统(CMS),使用 MySQL 作为数据存储,目前很多网站、电商独立站、个人博客…...
![](https://img-blog.csdnimg.cn/img_convert/fef278d2124a3e4fd472a9aa924fa541.png)
聊一聊 C# 弱引用 底层是怎么玩的
一:背景 1. 讲故事 最近在分析dump时,发现有程序的卡死和WeakReference有关,在以前只知道怎么用,但不清楚底层逻辑走向是什么样的,借着这个dump的契机来简单研究下。 二:弱引用的玩法 1. 一些基础概念 …...
![](https://www.ngui.cc/images/no-images.jpg)
蜘蛛池规矩采集优化与运用技巧 什么是蜘蛛池/SEO蜘蛛池怎么养?(蜘蛛池新手入门虚良SEO)
作为一名网络内容修改,我常常需求从各种网站上收集文章并转载到咱们的网站上。而在这个过程中,我深深感受到了蜘蛛池对我的帮助。今日,我就来共享一下我对蜘蛛池收集规矩的亲自感受。 归纳 本文将分9个方面具体介绍蜘蛛池收集规矩的长处和运…...
![](https://img-blog.csdnimg.cn/img_convert/8ffc834c5b33b56466195eaa3635b8d5.png)
SerDes介绍以及原语使用介绍(1)OSERDESE2
文章目录 前言:为什么需要serdes一、OSERDESE2框图二、OSERDESE2端口信号二、OSERDESE2原语参数三、OSERDESE2时序3.1、SDR模式3.2、DDR模式3.3、DDR模式下三态传输 前言:为什么需要serdes 需要 SerDes(串行器/解串器)主要是为了…...
![](https://i-blog.csdnimg.cn/direct/8833591cf8f848129036d2bf9e7cf878.png)
基于单片机和组态王的温度监控系统的设计
摘 要 : 介绍了以 MSP430 单片机为核心 , 建立基于 DS18B20 和组态王的温度采集和监控系统。主要研究了单片机和组态王的通用通讯协议。按照 KingView 提供的通信协议 , 设计组态王与单片机的通信程序 , 实现了组态王与M SP430 单片机的直接串行通讯。在中药提取装置的…...
![](https://img-blog.csdnimg.cn/direct/e71de3e76752457d9fc7d97a37a4efc9.webp)
unity 导入的模型设置讲解
咱们先讲Model这一栏 Model Scene:场景级属性,例如是否导入灯光和照相机,以及使用什么比例因子。 Scale Factor:缩放因子(也就是模型导入后大小如果小了或者大了在这里直接改是相当于该模型的大小的,而且在…...
![](https://www.ngui.cc/images/no-images.jpg)
汽车 vSOC安全运营管理平台开发解决方案
汽车 vSOC 安全解决方案 一、引言 随着汽车行业的快速发展,汽车的智能化和互联化程度越来越高,汽车网络安全问题也日益凸显。汽车 vSOC(Vehicle Security Operations Center)作为汽车网络安全的重要组成部分,其作用越来越受到重视。本方案旨在提供一套可实施落地的汽车 vS…...
![](https://www.ngui.cc/images/no-images.jpg)
python 第三方库
一、什么是第三方库 python的三方库指的是,需要通过pip install 安装后才能使用的 python 工具 三方库有很多: 做web自动化测试的库:selenium单元测试框架:pytest、unittest做app自动化测试:Python-Appium-Client做接…...
![](https://img-blog.csdnimg.cn/direct/42876b1c871440bbb672b3484d239145.png)
VMware Workstation环境下,DHCP服务的安装配置,用ubuntu来测试
需求说明: 某企业信息中心计划使用IP地址17216.11.0用于虚拟网络测试,注册域名为xyz.net.cn.并将172.16.11.2作为主域名的服务器(DNS服务器)的IP地址,将172.16.11.3分配给虚拟网络测试的DHCP服务器,将172.16.11.4分配给虚拟网络测试的web服务器,将172.16.11.5分配给FTP服务器…...
![](https://img-blog.csdnimg.cn/direct/9f619fc19b5e452b9b5c2933061b5d75.png)
CSS实现文字颜色渐变
直接上代码和效果图: <p class"linecolor">文字颜色渐变</p><style type"text/css">.linecolor{font-size: 30px;background-image:-webkit-linear-gradient(bottom,red,#fd8403,yellow);-webkit-background-clip:text;-web…...
![](https://www.ngui.cc/images/no-images.jpg)
《每天5分钟用Flask搭建一个管理系统》第4章:模板渲染
第4章:模板渲染 4.1 模板的概念和使用 模板是一种用于生成输出的方法,它允许您将Python代码和HTML标记混合在一起,从而创建动态网页。 示例代码:基本模板 <!-- templates/home.html --> <!DOCTYPE html> <html…...
![](https://www.ngui.cc/images/no-images.jpg)
逆向学习汇编篇:指令的操作
本节课在线学习视频(网盘地址,保存后即可免费观看): https://pan.quark.cn/s/660c759dea95 在逆向工程中,深入理解汇编语言的指令操作是至关重要的。汇编指令是计算机硬件与软件之间的桥梁,它们直…...
![](https://img-blog.csdnimg.cn/img_convert/a83d774bbc683554e0d2f63e5e62091e.png)
VB.net实战(VSTO):VSTOwpf体验框架打包教程
如果是考虑到Wps用户较多,就不建议采用侧边栏的形式 只是个体验框架,界面未作美化,office的用户可以用任意一种窗体,喜欢那个界面就写那个界面,wps的侧边栏只能弹出一部分,每次需要的手动拖动。 打包了案例…...
![](https://www.ngui.cc/images/no-images.jpg)
Jquery 获得Form下的所有text、checkbox等表单的值
Jquery使用表单我主要是想获得某一个表单下的所有text获得checkbox的值: 可以这样写: var parameter{}; $("input[typetext]",document.forms[0]).each(function(){ alert(this.name); }); 获得所有名为hobby的选中的checkbox的值和form2下的所有text的值 function s…...
![](https://img-blog.csdnimg.cn/direct/2a7f31db019f487dbd847d5c85ce6391.png)
stl之string
构造函数 void test1() {string s1;//不传参cout << s1 << endl;string s2("123456");cout << s2 << endl;string s3(s2);cout << s3 << endl;string s4(s2, 1, 5);cout << s4 << endl;string s5("123456&quo…...
![](https://img-blog.csdnimg.cn/direct/2c41087ba60647d89422b71027aa612b.png)
Vue3学习笔记<->nginx部署vue项目
安装nginx vue项目通常部署到nginx上,所以先安装一个nginx。为了方便安装的是windows版nginx,解压就能用。 项目参考上一篇文章《Vue3学习笔记<->创建第一个vue项目》《Vue3学习笔记<->创建第一个vue项目》…...
![](https://csdnimg.cn/release/blog_editor_html/release2.3.6/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=N7T8)
使用 WebGL 创建 3D 对象
WebGL Demohttps://mdn.github.io/dom-examples/webgl-examples/tutorial/sample5/index.html 现在让我们给之前的正方形添加五个面从而可以创建一个三维的立方体。最简单的方式就是通过调用方法 gl.drawElements() 使用顶点数组列表来替换之前的通过方法gl.drawArrays() 直接…...
![](https://img-blog.csdnimg.cn/img_convert/108a80e44e9c9235929d8160221014cb.png)
百度地图3d区域掩膜,最常见通用的大屏地图展现形式
需求及效果 原本项目使用的是百度地图3.0,也就是2d版本的那个地图,客户不满意觉得不够好看,让把地图改成3d的,但是我们因为另外的系统用的都是百度地图,为了保持统一只能用百度地图做 经过3天的努力,最后我终于把这个…...
![](https://img-blog.csdnimg.cn/direct/704bb53d475345e5898273ade14b7fba.png)
小区物业管理收费系统源码小程序
便捷、透明、智能化的新体验 一款基于FastAdminUniApp开发的一款物业收费管理小程序。包含房产管理、收费标准、家属管理、抄表管理、在线缴费、业主公告、统计报表、业主投票、可视化大屏等功能。为物业量身打造的小区收费管理系统,贴合物业工作场景,轻…...
![](https://img-blog.csdnimg.cn/direct/f024ea5e422e4b27baec1cba90698b13.png)
C++实现一个简单的Qt信号槽机制
昨天写这个文章《深入探讨C的高级反射机制(2):写个能用的反射库》的时候就在想,是不是也能在这套反射逻辑的基础上,实现一个类似Qt的信号槽机制? Qt信号槽机制简介 所谓的Qt的信号槽(Signals …...
![](https://www.ngui.cc/images/no-images.jpg)
微信小程序常用的传值
1.通过 URL 传参 在页面跳转时,可以在 URL 中携带参数进行传递,然后在目标页面的 onLoad 生命周期中获取参数。 // 在页面 A 中跳转到页面 B 并传递参数 wx.navigateTo({url: /pages/detail/index?id123 });// 在页面 B 的 onLoad 生命周期中获取参数…...
![](https://www.ngui.cc/images/no-images.jpg)
SQL面试真题解答 数据统计分析,求“同比、环比”等(SQL窗口函数使用)
SQL面试真题解答 数据统计分析,求“同比、环比”等(SQL窗口函数使用) 环比、环比增长率、同比、同比增长率,根据百度百科上的 说明: 环比增长率 环比增长率,一般是指和上期相比较的增长率。 环比增长率&a…...
![](https://img-blog.csdnimg.cn/direct/f14731c6ade14f9c93012d0c26345d99.png)
【递归、搜索与回溯】floodfill算法二
floodfill算法二 1.被围绕的区域2.太平洋大西洋水流问题3.扫雷游戏4.衣橱整理 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃😃 1.被围绕的区域…...
![](https://img-blog.csdnimg.cn/img_convert/9d39c1a96b4d8d22e99f08b4d6ea8d60.png)
Dataease安装,配置Jenkins自动部署
Dataease安装,配置Jenkins自动部署 一.安装Dataease 安装前准备:1.Ubuntu20.04 LTS国内源安装指定版本Docker 2.docker-compose安装 下载离线安装的安装包,下载地址:https://community.fit2cloud.com/#/download/dataease/v1-…...
![](https://img-blog.csdnimg.cn/direct/72d02e1aaa9444dc8949637046ccbb87.png)
关于IDEA启动报错 【JAVA_HOME does not point to a valid JM installation】
希望文章能给到你启发和灵感~ 感谢支持和关注~ 阅读指南 一、基础环境说明1.1 硬件环境1.2 软件环境 二、起因 一、基础环境说明 考虑环境因素不同,大家适当的对比自己的软硬件环境情况分析~ 1.1 硬件环境 MacOS Monterey 版本 1…...
![](https://img-blog.csdnimg.cn/direct/4c465fc5818d456ead1a19d37ff9b5e0.png#pic_center)
设置小蓝熊的CPU亲和性、CPU优先级再设置法环的CPU亲和性
# 适用于Windows系统 # 时间 : 2024-06-28 # 作者 : 三巧(https://blog.csdn.net/qq_39124701) # 文件名 : 设置小蓝熊的CPU亲和性、CPU优先级再设置法环的CPU亲和性.ps1 # 使用方法: 打开记事本,将所有代码复制到记事本中,保存文件时候修改文件后…...
![](https://www.ngui.cc/images/no-images.jpg)
Oracle中的序列(Sequence)是一种数据库对象
Oracle中的序列(Sequence)是一种数据库对象,用于生成数字序列,通常用于为主键列生成唯一、连续的数值。以下是一些使用序列的案例: 1. **为主键生成唯一值**: 在Oracle中,序列最常用的场景是…...
![](https://img-blog.csdnimg.cn/img_convert/dcf9cb6779b7122f78ddd2c469cf9239.webp?x-oss-process=image/format,png)
热点观察 | 《姜饼人王国》新作来袭、《Monopoly GO!》荣登5月全球畅销榜榜首
本周出海热点: 1. 中国品牌借欧洲杯打响知名度 2. 米哈游玩家切割二次元 3. 6月27日,Steam游戏《六月衷曲》上线TapTap 4. 《Monopoly GO!》荣登5月全球畅销榜榜首 5. 《地下城与勇士》拿下本周亚洲T1市场畅销榜冠军 6. 《姜饼人王国》新作强势登顶…...
![](https://img-blog.csdnimg.cn/direct/86b3252659d14bf5a5593ba281ad4e3c.png)
智能网络构建:探索大模型在网络领域的应用
网络领域以其高度复杂性和快速迭代为特点,完成从网络设计、配置、诊断到安全的网络任务需要广泛的专业知识。这些任务的固有复杂性,加上网络技术和协议不断变化的格局,为传统基于机器学习的方法带来了显著的障碍。这些方法在泛化和自动化网络…...
![](https://www.ngui.cc/images/no-images.jpg)
C++编程逻辑讲解step by step:定义一个Person类,它的每个对象表示一个人。
题目 定义一个Person类,它的每个对象表示一个人。数据成员必须包含姓名、出生年份、死亡年份,一个构造函数,一析构函数,读取数据的成员函数,一个print()成员函数显示所有数据。 #include <iostream> using namespace std;…...
![](https://img-blog.csdnimg.cn/img_convert/c96206d33c97720cf0cf2e13f048280e.jpeg)
DBdoctor产品介绍
基本信息 DBdoctor是一款企业级数据库监控、巡检、性能诊断、SQL审核与优化平台,致力于解决一切数据库性能问题。采用eBPF技术可对数据库做细粒度的扫描,帮助您一分钟内找到数据库性能问题,实现性能诊断百倍提效。针对数据库性能诊断门槛高、…...
![](https://img-blog.csdnimg.cn/direct/fc10cf34f41d4504a45c250f389cc6a1.png)
一加Ace3 刷机救砖简化说明
注意:工具使用英文目录,支持救砖和降级。PJE110国行版,CPH2609国际版。目前国行版不能完美转换国际版,每次升级都需要刷oplusstanvbk,不建议使用。跨国转换或ROOT一定先解锁Bootloader,可以使用“一加全能工…...
![](https://img-blog.csdnimg.cn/direct/65c8856f29ef480c9df12bae63c72221.png)
【服务器05】之【登录/注册账号成功转至游戏场景】
Unity登录注册数据库 打开【服务器01】的文章项目 导入新UI系统 点击2D 双击输入栏位置 修改输入框尺寸及位置 放大字体 修改默认输入文字 发现中文字变成了口口口口 原因是新UI系统不支持中文,解决这个问题需要更换字体 并且修改输入时字体大小 我们取电脑中找Fon…...
![](https://img-blog.csdnimg.cn/img_convert/f53c0fd2ebd46b34da97920dc1bca8c4.png)
平价蓝牙耳机推荐性价比高,性价比高的蓝牙耳机学生党推荐
市场上的蓝牙耳机价格从几十元到几百甚至上千不等,性能与价格也呈现多样化,对于学生党来说,一个理想的选择是那些性价比高的平价蓝牙耳机,它们在不牺牲必要功能的同时,提供了可接受的音质和足够的便利性,接…...
![](https://img-blog.csdnimg.cn/img_convert/c50a636333d5533ec80d57ba1425755f.jpeg)
【华为战报】5月、6月HCIP考试战报!
华为认证:HCIA-HCIP-HCIE 点击查看: 【华为战报】4月 HCIP考试战报! 【华为战报】2月、3月HCIP考试战报! 【华为战报】11月份HCIP考试战报! 【HCIE喜报】HCIE备考2个月丝滑通关,考试心得分享ÿ…...
![](https://www.ngui.cc/images/no-images.jpg)
OBD诊断
文章目录 OBD 参考标准OBD 服务OBD服务中的DTCOBD服务中0x03和0x07的区别参考 OBD 参考标准 OBD的标准: ISO 15031 Road Vehicles-Communication between vehicle and external equipment for emission-related diagnostics OBD 服务 序号ID服务说明服务详解10x0…...
![](https://img-blog.csdnimg.cn/direct/e678d5c05144448f9c9233bf292616a1.gif)
Elasticsearch 聚合查询
Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…...
![](https://www.ngui.cc/images/no-images.jpg)
adb remount fails - mount: ‘system‘ not in /proc/mounts 解决办法
mount -o rw,remount /挂载根 mount -o ro,remount /将状态重置为“ro” 以下是我个人的一些话 我热衷于在网络上分享我遇到的问题和解决方案。如果你有任何问题或需要帮助,欢迎留言交流,在共同学习的道路上一起进步。我很高兴结识那些在学习上积极进取…...
![](https://img-blog.csdnimg.cn/img_convert/68eae5855b973f04b2ca97846c92eb45.png)
百元蓝牙耳机推荐2024哪个好?蓝牙耳机性价比之王推荐
现在的百元价位的蓝牙耳机成为了许多消费者入门级的选择,它不仅需要满足基础的通话需求,更要在音质、舒适度、续航能力等多方面达到一定的标准,随着技术的发展和市场的竞争激烈,各大品牌在这一价格区间推出了极具竞争力的产品&…...
![](https://img-blog.csdnimg.cn/img_convert/4d5f13ef5ed83071c983dfd83319ce9b.png)
Spring项目报错解读与全部报错详解
你好,我是Qiuner. 为帮助别人少走弯路和记录自己编程学习过程而写博客 这是我的 github https://github.com/Qiuner ⭐️ gitee https://gitee.com/Qiuner 🌹 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 😄 (^ ~ ^) 想看更多 那就点个关注吧 我…...
![](https://www.ngui.cc/images/no-images.jpg)
10秒教会你mysql的连接
连接MySQL数据库通常可以通过多种方法实现,以下是几种常见的方法,我将按照您的要求以清晰、分点的方式归纳说明: 1. 使用MySQL命令行客户端 打开终端或命令提示符:首先,打开您的计算机上的终端或命令提示符窗口。输入…...
![](https://i-blog.csdnimg.cn/direct/157fd93c267a42c699c78b4450b2f638.png)
万物皆可爬——亮数据代理IP+Python爬虫批量下载百度图片助力AI训练
💂 个人网站:【 摸鱼游戏】【神级代码资源网站】【导航大全】🤟 一站式轻松构建小程序、Web网站、移动应用:👉注册地址🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交…...
![](https://img-blog.csdnimg.cn/direct/49dd8243b06e49b5a23ea6f24a1d493a.png)
OpenCv形态学(一)
目录 形态学转换 结构元素 腐蚀 膨胀 开运算 闭运算 形态学梯度 顶帽 黑帽 图像轮廓 查找轮廓 绘制轮廓 形态学转换 形态变换是一些基于图像形状的简单操作。通常在二值图像上执行。它需要两个输入,一个是我们的原始图像,第二个是决定操作性…...
![](https://www.ngui.cc/images/no-images.jpg)
CSS基础汇总
CSS 1. 选择器 标签选择器 通过标签名找标签(把指定的样式应用到某一个、组、类标签上) id选择器 通过id属性值找标签,关键符号#id值{样式} 复合选择器 1、并列选择器:关键符号,用法:选择器1,…...
![](https://www.ngui.cc/images/no-images.jpg)
cocos creator让所有button点击时播放音效
原理: 利用prototype属性,通过重写 cc.Button.prototype._onTouchEnded 方法,以便在按钮被点击时播放音频。通过重写其 _onTouchEnded 方法,可以添加自定义行为,如播放音频。 概念解释: prototype&#…...
![](https://i-blog.csdnimg.cn/direct/f65385a03b184c2897165f166b42ccec.png)
mybatisplus自带的雪花算法(IdType.ASSIGN_ID)无法自动生成弊端缺点,以及改进方法
前言 今日在使用mybatisplus的雪花算法自动给id赋值时发现怎么都是null的情况,这尼玛测了半天,终于发现巨坑,废话不多说,直接上干货 IService.save 只有调用IService中的save方法才能正常生成id,像IService.saveBatc…...
![](https://img-blog.csdnimg.cn/direct/afa1f0185e324d7c91fd553cedbb95d2.png)
单位转换:将kb转换为 MB ,GB等形式
写法一: function formatSizeUnits(kb) {let units [KB, MB, GB, TB, PB,EB,ZB,YB];let unitIndex 0;while (kb > 1024 && unitIndex < units.length - 1) {kb / 1024;unitIndex;}return ${kb.toFixed(2)} ${units[unitIndex]}; } console.log(for…...
![](https://img-blog.csdnimg.cn/img_convert/fb143cbadac49abc5ab38d6632ce02a3.webp?x-oss-process=image/format,png)
优思学院|「按计划推动型」与「需求拉动型」的生产模式
针对生产架构做对比分类的用语,主要有按计划推进型与需求拉动型。 「按计划推动型」与「需求拉动型」两者乃是生产架构上常使用、成对比的两个用语。不过,有时不只用来指单纯的生产现场架构,也有人把它应用在更广泛的生产架构设计上。 按计划…...
![](https://img-blog.csdnimg.cn/direct/8ad94351467644b3a3d2d67977b873fc.png)
解释什么是lambda函数?它有什么好处?
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...
![](https://i-blog.csdnimg.cn/direct/6f85ffe41c2d48b180bf4cd8b3ef9564.png)
码农:如何快速融入团队
问题: 码农如何快速融入团队? 记住一个标准:能干事、能抗事。 总结一个字: 靠谱。 适用范围:新手码农、老司机码农、测试、DBA、运维、产品经理、项目经理、架构师、技术专家、。。。。适用于任何行业的打工者。 下面要…...