wordpress全站https

博客使用的是wordpress,最近在支持https,配置好证书,后台设置好地址,七牛云的插件也配置好了,却发现文章中的图片都不能看到了,原来之前文章中插入的地址都是http的地址,直接插入数据库了,其中一种方法就是将数据库中的内容遍历出来改了,但是这样可能会伤害到文章数据,所以还是直接全站改掉http链接的好,方法就是在function.php文件中添加下面一段代码就可以实现了~

function replacehttp($content){
if( is_ssl() ){
$content = str_replace('http://blog.duicode.com/wp-content', 'https://blog.duicode.com/wp-content', $content);
}
return $content;
}
add_filter('the_content', 'replacehttp');

NFS实现共享wordpress

实验环境

192.168.68.134 wordpress站点 nfs-server

192.168.68.144 nfs-client

实验要求

nfs server共享/var/www/html目录

nfs clinet挂载nfs-server共享的目录,部署wordpress

nfs server端

先部署wordpress document root 在 /var/ww/html下

vim /etc/exports :/var/www/html/ 192.168.0.0/16(rw)

exportfs -r

systemctl start nfs

nfs client端

[root@centos ~]# showmount -e 192.168.68.134

[root@centos ~]# mount -t nfs 192.168.68.134:/var/www/html /var/www/html

[root@centos ~]# systemctl restart httpd

Nginx下wordpress 固定链接更改后404问题解决

安装好wordpress后默认文章固定链接后缀是 ?p=xx之类的,这样的链接虽然挺简洁,但对SEO不利。

在后台自定义固定链接后,打开网站除首页外,其他页面都是404。这是由于没有设置好Nginx对wordpress的rewrite规则,google了一些解决办法,说的都是要在Nginx的配置文件写入

server{

  location / {
    try_files $uri $uri/ /index.php?$args;
  }

}

但是写上以上代码仍然不起作用。于是google到Nginx官网上对于wordpress的rewrite规则说明,照着例子改了自己的Nginx配置,参考如下

upstream php {
        server unix:/tmp/php-cgi.socket;
        server 127.0.0.1:9000;
}

server {
    listen 80;
    server_name www.zhenglinbo.com zhenglinbo.com;

    root /var/www/blog;
    index index.html index.htm index.php;

    location / {

      try_files $uri $uri/ /index.php?$args;

    }

    location ~ .php$ {
                #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
                include fastcgi.conf;
                fastcgi_intercept_errors on;
                fastcgi_pass php;
        }

    location ~* .(js|css|png|jpg|jpeg|gif|ico)$ {
                expires max;
                log_not_found off;
        }

    error_page 404 /error/index.html;
        location = /40x.html {
    }   

}

成功!使用自定义的文章固定链接为 /post-%post_id%.html 。

附Nginx官网对wordpress的rewrite规则说明:https://www.nginx.com/resources/wiki/start/topics/recipes/wordpress/

基于docker的WordPress环境搭建

WordPress是一个强大的框架,它的使用者众多,社区十分活跃,我们可以非常轻易地找到很多非常漂亮的主题来装饰个人博客。

根据官方的说法,搭建一个wordpress至少需要系统支持以下特征:

  • PHP 7 以及更高版本
  • MySQL 5.6 以及更高版本或者是 MariaDB 10.0 以及更高版本
  • Apache的mod_rewrite模块支持

对于我这种大白来说,搭建服务并不难,配置软件也不是不可接受。但是我只是搭一个博客而已啊喂,要安装这么多东西把系统弄的乱糟糟的,简直不能忍,有没有更优雅的方式呢?

这时候。docker这一个工具就该派上用场了。它创建了一个与主机系统独立的空间,整洁高效。

mariadb:

$docker run --name db --env MYSQL_ROOT_PASSWORD=example -d mariadb

wordpress:

$docker run --name WordPress --link db:mysql -p 4000:80 -d wordpress

第一条命令创建了一个db容器,并给它创建了一个别名叫db,并设置了MySQL的密码为example。第二条则创建了一个wordpress的容器,由于两个容器有数据交流,这里用了一个–link参数来将它们联系起来,但是注意:用–link containerA参数时需要A已经创建并且已经在运行。在这里我们将docker的80端口和主机的4000端口连起来。访问docker里的wordpress,只需要在主机的浏览器输入http://localhost:4000就可以了。

另外,这个博客就是在docker里面搭建起来的。

几个提高WORDPRESS速度的技巧

虽然有很多介绍WordPress缓存插件的,我也介绍过用Redis来缓存WordPress生成的页面,这也不失为一个较便捷的优化方法。但是很多时候我们会使用动态的元素,比如手机端和桌面端分发不同的图片,如果直接使用前端缓存插件会导致这些元素失去原有的效果。
Apache因为可以把PHP作为自己的一个模块,所以在大并发的时候理论上效率要比Nginx之类的使用FastCGI方式的效率高一点,而且不容易出现502错误。不过我个人觉得这种差异非常小,而且PHP+Nginx也是非常常见的搭配方式,所以这里不讨论。

0x00 主题资源

很多人使用了外国主题,里面调用了许多国内无法访问或者访问很慢的资源,比如Google fonts,或者直接引用的外国CDN上的js文件,都可能导致网站加载速度过慢。在Chrome中按F12打开Developer Tools,选择其中的Network面板就可以看到加载过慢的元素,你可以下载这些文件到自己的服务器中,然后通过跨文件搜索工具搜索引用这些元素的文件并将他们的URL修改为自己网站的链接。

0x01 Nginx

如果你使用了HTTPS,那请直接开启HTTP2,极大的提高网页加载速度

listen 443 ssl http2 fastopen=3 reuseport;

fastopen是Linux内核的特性,客户端和服务端均为Linux内核时才有作用,可加快TCP握手速度。reuseport为Nginx 1.9.1的新特性套接字端口共享,详情可参考Socket Sharding in NGINX Release 1.9.1。

使用keepalive并设定一个过期时间,单位为秒,在时间内浏览器和服务器会保持连接,有新的请求响应会更迅速。

keepalive_timeout 70;

对于https,可以设置ssl会话过期时间

ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;

对于一些静态化的资源,比如js与css文件,可以通过设置缓存过期时间,告诉浏览器在规定时间内不需要再次请求这些资源以加快访问速度(d为天,h为小时)

location ~.*.(js|css)?$  
{  
 expires 1d;  
} 

大多数Nginx配置中都已经启用Gzip来压缩网页内容,你也可以使用谷歌开发的Brotli来提高压缩率,需要在Nginx编译时引入

#下载Brotli的Nginx模块
git clone https://github.com/google/ngx_brotli.git
cd ngx_brotli
git submodule update --init

#在Nginx编译时设定参数
./configure --add-module=../ngx_brotli

#在Nginx的主配置http块中开启Brotli
brotli             on;
brotli_comp_level  6;
brotli_types       text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/svg+xml;

0x02 PHP

PHP对WordPress性能的影响非常大,建议使用7.0以及更新的版本,我目前在使用PHP7.1。PHP的几个大版本性能差异可以看PHP核心开发者鸟哥的评测,大致上7.x版本会比5.x版本提高一倍左右的性能。
PHP另外一个需要注意的点是要开启OPcache,OPcache 通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能, 存储预编译字节码的好处就是 省去了每次加载和解析 PHP 脚本的开销。
PHP 5.5.0及以后的版本只要未在编译时禁用默认扩展,OPcache均已附带在PHP中,只需要在PHP配置文件PHP.ini中使用zend_extension=opcache.so即可加载(Windows使用zend_extension=php_opcache.dll加载)
推荐配置(官方配置说明)

opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.max_wasted_percentage=5
opcache.validate_timestamps=60 (你对代码的改动将会在此秒数后生效)
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.file_cache=/tmp (让Opcache把opcode缓存缓存到外部文件中)

同时可以为OPcache启用大页内存,使用命令sudo sysctl vm.nr_hugepages=512分配,PHP.ini中加入

opcache.huge_code_pages=1

对于使用IIS的用户,可以使用WinCache扩展,下载后将其释放到PHP目录下的ext文件夹中,在PHP.ini中加载

extension=php_wincache.dll
wincache.fcenabled=1
wincache.ocenabled=1

0x003 WordPress后端缓存

WordPress的后端缓存有例如使用Memcached和Redis的,不过无一例外,都需要使用TCP进行通讯,而使用PHP的扩展APCu进行后端缓存则可以绕过这一瓶颈。
首先安装APCu,如果你和我一样直接使用包管理器安装PHP,那么使用同样的方式安装即可。如果你使用的一键包或者自己手动编译安装,则需要自己手动编译,你可以在这里找到最新的模块

wget https://pecl.php.net/get/apcu-5.1.8.tgz
tar zxf apcu-5.1.8.tgz
phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make
sudo make install

在PHP.ini中添加

extension=apcu.so
apc.enabled=1
apc.enable_cli=1

在WordPress中安装WP LCache插件并启用,在WordPress网站目录下的wp-content中新建一个文件object-cache.php,在其中填入

<?php
$lcache_path = dirname( realpath( __FILE__ ) ) . '/plugins/wp-lcache/object-cache.php';
require_once( $lcache_path );

保存即可生效,之后会发现WP后台的响应速度有可见变化。

在 Kubernetes 集群中运行 WordPress

作为一名开发者,我会尝试留意那些我可能不会每天使用的技术的进步。了解这些技术至关重要,因为它们可能会间接影响到我的工作。比如由 Docker 推动的、近期正在兴起的容器化技术,可用于上规模地托管 Web 应用。从技术层面来讲,我并不是一个 DevOps,但当我每天构建 Web 应用时,多去留意这些技术如何去发展,会对我有所裨益。

这种进步的一个绝佳的例子,是近一段时间高速发展的容器编排平台。它允许你轻松地部署、管理容器化应用,并对它们的规模进行调整。目前看来,容器编排的流行工具有 Kubernetes (来自 Google),Docker Swarm 和 Apache Mesos。如果你想较好的了解上面那些技术以及它们的区别,我推荐你看一下这篇文章。

在这篇文章中,我们将会从一些简单的操作开始,了解一下 Kubernetes 平台,看看如何将一个 WordPress 网站部署在本地机器上的一个单节点集群中。

安装 Kubernetes

在 Kubernetes 文档中有一个很好的互动教程,涵盖了很多东西。但出于本文的目的,我只会介绍在 MacOS 中 Kuberentes 的安装和使用。

我们要做的第一件事是在你的本地主机中安装 Kubernetes。我们将使用一个叫做 MiniKube 的工具,它专门用于在你的机器上方便地设置一个用于测试的 Kubernetes 集群。

根据 Minikube 文档,在我们开始之前,有一些先决条件。首先要保证你已经安装了一个 Hypervisor (我将会使用 Virtualbox)。接下来,我们需要安装 Kubernetes 命令行工具(也就是 kubectl)。如果你在用 Homebrew,这一步非常简单,只需要运行命令:

$ brew install kubectl

现在我们可以真正 安装 Minikube 了:

$ curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.21.0/minikube-darwin-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/

最后,我们要启动 Minicube 创建一个虚拟机,来作为我们的单节点 Kubernetes 集群。现在我要说一点:尽管我们在本文中只在本地运行它,但是在真正的服务器上运行 Kubernetes 集群时,后面提到的大多数概念都会适用。在多节点集群上,“主节点”将负责管理其它工作节点(虚拟机或物理服务器),并且 Kubernetes 将会在集群中自动进行容器的分发和调度。

$ minikube start --vm-driver=virtualbox

安装 Helm

现在,本机中应该有一个正在运行的(单节点)Kubernetes 集群了。我们现在可以用任何方式来与 Kubernetes 交互。如果你想现在可以体验一下,我觉得 kubernetesbyexample.com 可以很好地向你介绍 Kubernetes 的概念和术语。

虽然我们可以手动配置这些东西,但实际上我们将会使用另外的工具,来将我们的 WordPress 应用部署到 Kubernetes 集群中。Helm 被称为“Kubernetes 的包管理工具”,它可以让你轻松地在你的集群中部署预构建的软件包,也就是“图表chart”。你可以把图表看做一组专为特定应用(如 WordPress)而设计的容器定义和配置。首先我们在本地主机上安装 Helm:

$ brew install kubernetes-helm

然后我们需要在集群中安装 Helm。 幸运的是,只需要运行下面的命令就好:

$ helm init

安装 WordPress

现在 Helm 已经在我们的集群中运行了,我们可以安装 WordPress 图表。运行:

$ helm install --namespace wordpress --name wordpress --set serviceType=NodePort stable/wordpress  

这条命令将会在容器中安装并运行 WordPress,并在容器中运行 MariaDB 作为数据库。它在 Kubernetes 中被称为“Pod”。一个 Pod 基本上可视为一个或多个应用程序容器和这些容器的一些共享资源(例如存储卷,网络等)的组合的抽象。

我们需要给这个部署一个名字和一个命名空间,以将它们组织起来并便于查找。我们同样会将 serviceType 设置为 NodePort 。这一步非常重要,因为在默认设置中,服务类型会被设置为 LoadBalancer。由于我们的集群现在没有负载均衡器,所以我们将无法在集群外访问我们的 WordPress 站点。

在输出数据的最后一部分,你会注意到一些关于访问你的 WordPress 站点的有用的命令。运行那些命令,你可以获取到我们的 WordPress 站点的外部 IP 地址和端口:

$ export NODE_PORT=$(kubectl get --namespace wordpress -o jsonpath="{.spec.ports[0].nodePort}" services wordpress-wordpress)
$ export NODE_IP=$(kubectl get nodes --namespace wordpress -o jsonpath="{.items[0].status.addresses[0].address}")
$ echo http://$NODE_IP:$NODE_PORT/admin

你现在访问刚刚生成的 URL(忽略 /admin 部分),就可以看到 WordPress 已经在你的 Kubernetes 集群中运行了!

扩展 WordPress

Kubernetes 等服务编排平台的一个伟大之处,在于它将应用的扩展和管理变得易如反掌。我们看一下应用的部署状态:

$ kubectl get deployments --namespace=wordpress

未分类

可以看到,我们有两个部署,一个是 Mariadb 数据库,一个是 WordPress 本身。现在,我们假设你的 WordPress 开始承载大量的流量,所以我们想将这些负载分摊在多个实例上。我们可以通过一个简单的命令来扩展 wordpress-wordpress 部署:

$ kubectl scale --replicas 2 deployments wordpress-wordpress --namespace=wordpress

再次运行 kubectl get deployments,我们现在应该会看到下面的场景:

未分类

你刚刚扩大了你的 WordPress 站点规模!超级简单,对不对?现在我们有了多个 WordPress 容器,可以在它们之中对流量进行负载均衡。想了解 Kubernetes 扩展的更多信息,参见这篇指南。

高可用

Kubernetes 等平台的的另一大特色在于,它不单单能进行方便的扩展,还可以通过自愈组件来提供高可用性。假设我们的一个 WordPress 部署因为某些原因失效了,那 Kubernetes 会立刻自动替换掉这个部署。我们可以通过删除我们 WordPress 部署的一个 pod 来模拟这个过程。

首先运行命令,获取 pod 列表:

$ kubectl get pods --namespace=wordpress

未分类

然后删除其中一个 pod:

$ kubectl delete pod wordpress-wordpress-876183909-jqc8s --namespace=wordpress

如果你再次运行 kubectl get pods 命令,应该会看到 Kubernetes 立刻换上了新的 pod (3l167)。

未分类

更进一步

我们只是简单了解了 Kubernetes 能完成工作的表面。如果你想深入研究,我建议你查看以下功能:

  • 平行扩展
  • 自愈
  • 自动更新及回滚
  • 密钥管理

你在容器平台上运行过 WordPress 吗?有没有使用过 Kubernetes(或其它容器编排平台),有没有什么好的技巧?你通常会怎么扩展你的 WordPress 站点?请在评论中告诉我们。

Ansible roles实现LAMP架构部署wordpress

为何使用Ansible及Ansible特点? Agentless(去中心化) Stupied Simple SSH by default YAML no code,定制剧本 基于python实现 模块化:调用特定模块 ,完成特定任务,支持自定义模块

整个role目录的结构:

.
├── ansible.cfg
├── hosts
├── httpd-php_roles.retry
├── httpd-php_roles.yml
├── roles
│ ├── httpd
│ │ ├── files
│ │ │ ├── mysql_wp.sh
│ │ │ ├── wordpress-4.7.4-zh_CN.tar.gz
│ │ │ ├── wordpress.conf
│ │ │ └── wp-config.php
│ │ ├── handlers
│ │ │ └── main.yml
│ │ ├── tasks
│ │ │ └── main.yml
│ │ └── vars
│ ├── mariadb
│ │ ├── defaults
│ │ ├── files
│ │ ├── handlers
│ │ │ └── main.yml
│ │ ├── tasks
│ │ │ └── main.yml
│ │ ├── templetes
│ │ └── vars
│ └── php
│ ├── defaults
│ ├── files
│ ├── handlers
│ ├── meta
│ ├── tasks
│ │ └── main.yml
│ ├── tmpletes
│ └── vars
└── wp-config.php

1. 定义hosts目标主机:

vim /etc/ansible/hosts
[httpd]
192.168.5.111

2. 创建httpd相关的目录:

mkdir httpd/{tasks,vars,files} -pv

3. 进入tasks目录创建并编辑main.yml

---
- name: install httpd
  yum: name=httpd state=present
- name: conf httpd
  copy: src=wordpress.conf dest=/etc/httpd/conf.d/
- name: file wordpress
  copy: src=wordpress-4.7.4-zh_CN.tar.gz dest=/var/www/html
- name: tar wordpress.tar.gz
  shell: "tar -xf wordpress-4.7.4-zh_CN.tar.gz && chown -R apache.apache wordpress && mv wordpress-4.7.4-zh_CN.tar.gz /usr/local/src"
  args:
    chdir: /var/www/html 
  notify: start httpd  #当上面的执行完成后会触发handler定义的同名的动作 
- name: conf wp-config.php
  copy: src=wp-config.php dest=/var/www/html/wordpress
- name: mysql_wp.sh
  script: mysql_wp.sh
  notify: restart httpd 
- name: restart httpd
    service: name=httpd state=restarted

4. 将所需的文件放入roles/httpd/files中,文件中的内容下面用到会提及

files/
├── mysql_wp.sh
├── wordpress-4.7.4-zh_CN.tar.gz
├── wordpress.conf
└── wp-config.php

5. 在handlers中编辑main.yml定义触发的动作

---
- name: start httpd
  service: name=httpd state=started
- name: restart httpd
  service: name=httpd state=restarted

6. httpd的已经完成,接下来定义php模块的内容,同样在roles中创建php相关目录:

mkdir php/{tmpletes,tasks,files,handlers,meta,defaults,vars} -pv

7. 编辑tasks中的main.yml文件,这里只是安装了一个php模块:

---
- name: install php
  yum: name=php state=present

8. 定义mariadb相关的内容的目录:

mkdir mariadb/{templetes,handlers,vars,files,defaults,tasks} -vp

9. 编辑roles/mariadb/tasks/main.yml文件,顺带安装一下几个模块:

---
- name: install mariadb
  yum: name=mariadb-server state=present
- name: install httpd-mysql
  yum: name=php-mysql state=present
- name: install php-mbstring
  yum: name=php-mbstring state=present
- name: restart mariadb 
  service: name=mariadb state=restarted

10. wordpress程序需要手动更改一个配置文件,事先编辑好直接推送wordpress/目录下,这就是roles/httpd/files中的wp-conf.php,需要更改内容如下:

define('DB_NAME', 'wordpress');

/** MySQL数据库用户名 */
define('DB_USER', 'wpuser');

/** MySQL数据库密码 */
define('DB_PASSWORD', 'wppd');

/** MySQL主机 */
define('DB_HOST', 'localhost');

11. 上面定义的数据库需要数据库等需要自行创建,将其写脚本files/mysql_wp.sh文件:

#!/bin/bash
#
mysql -uroot -e " 
        CREATE DATABASE IF NOT EXISTS wordpress CHARACTER  SET 'utf8';
        GRANT ALL ON wordpress.* TO 'wpuser'@'localhost' IDENTIFIED BY 'wppd'; "

12. 与roles同级创建一个yml文件,将这三个项目整合起来运行:

cd /etc/ansible
vim httpd-php_roles.yml
---
- hosts: httpd
  remote_user: root
  roles:
  - { role: php, tags: [ php-tag,ap-tag ] }
  - { role: mariadb, tags: [ mariadb-tag,ap-tag ] }
  - { role: httpd, tags: [ httpd-tag,ap-tag ] }

13. 向定义的目标主机进行发布程序:

~]# ansible-playbook /etc/ansible/httpd-php_roles.yml

只要目标主机yum源可用,没有遇到报错基本OK.

未分类

访问验证一下:

未分类

使用Docker compose配置WordPress运行环境并支持https

最近把 WordPress 迁移到了腾讯云,为了配置方便使用了 docker 来运行,这里记录下配置过程

准备 compose 文件

WordPress 的 docker compose 文件网上有很多,需要一个 mysql 的镜像,还有 WordPress 的镜像,大概长这样:

version: '3'
services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress
   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
volumes:
    db_data:

定制 Dockerfile 添加 https 支持

借助于 letsencrypt 这个项目, 给个人网站添加 letsencrypt 变得十分容易,详细见这篇文章:

如何免费的让网站启用HTTPS: (https://coolshell.cn/articles/18094.html)

大概流程就是安装一个软件包 letsencrypt ,然后配置你的网站信息即可,但是我们的 WordPress 是安装在 docker 里面,所以我们要想办法把这个软件包打进镜像里面。

接下来我们要对 WordPress 这个镜像进行自定义,参考这篇文章:

docker + wordpress + letsencrypt: (https://breeto.id.au/2017/03/docker-wordpress-letsencrypt/)

先定制 Dockerfile,集成 letsencrypt

新建文件夹 wordpress_tls 添加 Dockerfile

FROM wordpress:php7.1
RUN echo "export TERM=xterm LANG=en_US.UTF-8" >> ~/.bashrc 
    && apt-get update && apt-get -y install git 
    && rm -rf "/opt/letsencrypt" 
    && git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt 
    && cd /opt/letsencrypt 
    && ./letsencrypt-auto --version

wordpress 官方镜像使用的 ubuntu 源是国外源,打包镜像的速度会让你怀疑人生。可以把宿主机的 ubuntu 源放进 docker 镜像里。

$cp /etc/apt/sources.list ./

修改 Dockerfile

FROM wordpress:php7.1
ADD sources.list /etc/apt/sources.list
RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 
    && apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32 // 改成你的 key
RUN echo "export TERM=xterm LANG=en_US.UTF-8" >> ~/.bashrc 
    && apt-get update && apt-get -y install git 
    && rm -rf "/opt/letsencrypt" 
    && git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt 
    && cd /opt/letsencrypt 
    && ./letsencrypt-auto --version

添加新的源会有认证的问题,可以参考 http://naveenubuntu.blogspot.com/2011/08/fixing-gpg-keys-in-ubuntu.html 解决

配置 https

启动容器:

$docker-compose up -d

然后配置 https

$docker-compose exec wordpress_tls /opt/letsencrypt/certbot-auto --apache -d your.domain.com --agree-tos -n -m [email protected]

Let’s Encrypt 的证书90天就过期了,过期后执行

$ docker-compose exec wordpress_tls /opt/letsencrypt/certbot-auto renew

来更新,可以把更新脚本写进 crontab
$crontab -e

0 0 1 * * docker-compose exec wordpress_tls /opt/letsencrypt/certbot-auto renew

完整示例

https://github.com/myfjdthink/docker-wordpress

WordPress域名更换、备份,网站数据迁移教程

如何更换WordPress网站域名

情况一、空间不变,旧域名绑定不变,新域名已做好解析

这种情况WordPress网站域名更换最容易。只需要登陆网站的后台即可操作。

进入后台,点击 设置-常规

未分类

只要修改 WordPress 地址(URL)和 站点地址(URL),然后保存,基本上就可以了。

保存后,原域名就已经不能访问后台了,这个时候就要用新域名访问后台。但是,有一个重要事情还必须做。那就是旧域名下的文章中包含的图片地址是否已经更正,固定链接是否重新设置。如果网站的文章不多,才10篇8篇的,可以手动去更新一次新域名网站的文章包含的图片地址。同时,后台需要重新设置一次固定链接格式。如果网站的文章比较多,那么手动更新文章的图片链接地址,那就会很困难了。可以通过SQL更新数据库进行。

完成以上的步骤之后,还需要注意的一点就是将旧的域名301重定向到新域名,有利于权重的传递和旧域名收录访问更新到新的域名地址。301重定向规则,请自行百度搜索,这个是很重要对seo

情况二、空间变,旧域名绑定解析失败,新域名已绑定空间并解析成功

这种情况已经不是单纯的网站更换域名,还包括了网站的迁移,相比第一种情况,就复杂了一些。

方法一、使用 WordPress 自带导出工具

步骤一、登入旧域名网站的后台,点击 工具 – 导出 如下图:

未分类

选择要导出的内容,然后 下载导出的文件 即可获得一个 XML格式的文件。

步骤二、在新的空间里,用新域名安装 WordPress ,然后,登入网站后台,点击 工具 – 导入

选择 WordPress ,将会提示下载安装导入插件。下载安装后,启用,然后选择之前导出的文件即可导入数据。

步骤三、导入数据后,还需要把旧域名的里的主题、媒体库文件上传到新的空间里。即 wp-content 里的 theme 和 uploads 目录下载到本地再上传到新空间里。

步骤四、设置对应的固定链接格式。同样,根据情况是否需要做旧域名的301重定向。

上面的方法操作相对容易,但是因为是已经重新安装了一次 WordPress ,因此,导入的数据目录,在一定程度上,和原来有所不同。

方法二、利用 PHPMyadmin 数据库管理工具备份数据库迁移

步骤一、登陆 PHPMyadmin 数据库管理工具,备份旧域名的网站数据并下载到本地。

步骤二、通过新空间的 PHPMyadmin 数据库管理工具,导入旧域名的网站数据库。

步骤三、把旧空间文件打包通过FTP下载,并上传到新的空间。

以上的三个步骤不进行具体的截图演示,可以自行谷歌搜索。

步骤四、通过 PHPMyadmin 数据库管理工具 使用 SQL 命令更新 WordPress 地址和站点地址。

未分类

命令如下:(注意把 old.com 和 new.com 替换成你的新旧域名)

UPDATE wp_options SET option_value = replace( option_value, 'http://www.old.com', 'http://www.new.com' ) WHERE option_name = 'home' OR option_name = 'siteurl'; 

UPDATE wp_posts SET post_content = replace( post_content, 'http://www.old.com', 'http://www.new.com' ) ;

UPDATE wp_posts SET commment_content = replace( commment_content, 'http://www.old.com', 'http://www.new.com' ) ;

UPDATE wp_posts SET commment_author_url = replace( commment_author_url, 'http://www.old.com', 'http://www.new.com' ) ; 

UPDATE wp_posts SET guid = replace( guid, 'http://www.old.com', 'http://www.new.com' ) ;

其中,old.com 是你的老域名,而 new.com 是新域名。如果当初你的数据库表头不是默认的wp开头,注意修改成你自己数据库的表头,很多人都忘记了这点。

步骤五、修改新空间 WordPress 数据库配置文件 wp-config.php

使用notepad++ / editplus/ Dreamwaver 打开(切勿用记事本打开)。打开后,自己的新数据库名、数据库用户名、数据库密码进行修改配置。配置完之后FTP上传覆盖。

/** WordPress数据库的名称 */

define('DB_NAME', 'liaosam');

/** MySQL数据库用户名 */

define('DB_USER', 'liaosam');

/** MySQL数据库密码 */

define('DB_PASSWORD', '这里是数据库密码');

/** MySQL主机 */

define('DB_HOST', 'localhost');   一般Linux主机这里不用动,保持localhost即可。

/** 创建数据表时默认的文字编码 */

define('DB_CHARSET', 'utf8');

完成以上步骤后,基本上也就迁移和更换了网站的新域名,同样,还是需要对文章的图片进行一次更新,避免图片不能正常显示。

还是需要登陆后台设置一下网站的固定链接格式,以及根据个人情况是否需要对旧域名进行301重定向设置。

到了这里WordPress 网站关于域名更换和迁移基本上就完成了。

注意事项:

1、如果遇到 PhpMyAdmin导入数据库文件最大限制2048KB,可以找到php.ini,ctrl+F 找到upload_max_filesize,将值修改为20MB,覆盖即可。

2、更换后,一定要检查固定链接、文章图片地址、301重定向。

启用memcached动态缓存加速wordpress

概述

扉启博客正在使用的是基于nginx的fastcgi纯静态缓存,这是将所有的动态HTML页面都缓存到硬盘文件,nginx针对http请求只处理静态内容,因此对服务器的开销很小,速度快。对于动态内容不多的站点,用这个方法能极大缓解cpu的负担,由nginx来高效地处理并发。

另一种缓存方式是基于memcached缓存动态内容,将数据库的数据缓存在内存中,下次需要的时候直接从内存中取数据,减少MySQL的访问次数,也加速了wordpress对网页的处理。这种方式直接从内存中存取数据,理论上比静态缓存的IO开销更小,但是由于memcached需要占用一定php资源,因此会对CPU带来一些额外的压力。

本文记述了在另一个站点上安装部署memcached的过程,最后测试这种方式的缓存的响应速度和并发处理能力。

未分类

安装memcached服务

网上有一些文章提供了memcached服务的安装方法,有的手动下载源码编译安装,这里采用军哥lnmp一键包插件安装简单的方法。在lnmp源代码目录下,运行addon.sh脚本安装memcached服务

./addons.sh install memcached

在随后出现的选项里选择2,也就是php-memcached的带d的版本,这个相对不带d的版本更新,性能更好。

编译安装完成以后,检查一下memcached的服务是否已经运行。

systemctl status memcached
memcached.service - LSB: memcached - Memory caching daemon
   Loaded: loaded (/etc/rc.d/init.d/memcached; bad; vendor preset: disabled)
   Active: active (running) since Fri 2017-08-18 14:38:00 CST; 1 weeks 0 days ago

然后检查php的memcached模块是否已经加载

php -m | grep memcached

可以新建一个php文件测一下缓存功能,将下面的代码保存为test.php文件。

<?php
$m = new Memcached();
$m->addServer( '127.0.0.1', 11211 );
$m->set( 'foo', 100 );
echo $m->get( 'foo' ) . "n";

运行php -f test.php,如果结果是100的话表明memcached正常运行。
都没问题的话,就可以进行下一步安装wordpress插件

安装wordpress的memcached插件

访问github项目下载插件文件object-cache.php

将下载好的文件放入wordpress网站目录的wp-content/下,此时wordpress已自动利用memcached缓存功能。

缓存HTML页面到内存

到前面这一步已经完成了数据库查询的动态缓存,如果想要进一步提高性能,还可以类似与wp supercache或fastcgi缓存一下将网站的页面静态化,只不过存储在memcached分配的内存中,而不是硬盘上的文件。

这里要用到的插件叫做batcache,代码的readme文件里解释了这个名称的由来。bat并不表示真的和蝙蝠有什么联系,而是正好发布前夕wp-supercache已经发布,为了不和其他缓存插件冲突而用了这个名字。

首先下载官方插件项目的代码包batcache,解压缩后得到了advanced-cache.php文件,将其放入wordpress网站目录的wp-content/下。

然后在wordpress站点根目录下,在wp-config.php文件内加入一行

define('WP_CACHE', true);

batcache相关的配置在advanced-cache.php中的batcache类中,查找下面这几行

var $max_age =  3600; // Expire batcache items aged this many seconds (zero to disable batcache)
var $remote  =    0; // Zero disables sending buffers to remote datacenters (req/sec is never sent)
var $times   =    2; // Only batcache a page after it is accessed this many times... (two or more)
var $seconds =  120; // ...in this many seconds (zero to ignore this and use batcache immediately)

在此将缓存有效期设为3600秒,也就是过1小时后缓存将重新生成。在120秒内,连续访问该页面2次将生成缓存。具体数字可以根据实际情况修改。

测试一下,将网站的某个页面刷新几次,在Chrome的开发者工具源码页,注意查看body元素的footer里面,包含了下面一段,表明当前页面是由memached缓存生成的。

<!--
    generated in 0.349 seconds
    28088 bytes batcached for 300 seconds
-->

并发测试

经过几次测试,发现通过这种缓存方案,托管于linode的站点大概最多能承担每秒150个并发请求,再多就超过error rate的阈值了。

未分类

  • 平均响应时间170ms
  • 平均每秒并发数量170个
  • error rate为0.8%
  • 服务器的CPU使用率开始最高90%,后来稳定在50%左右

总结

针对博客类型的小站,最好还是使用fastcgi的方案实现全静态化。如果动态类型较多,可以采用memcached缓存方案,但是并发处理能力没有fastcgi的好。