Fari

Wordpress

docker环境下wordpress迁移并更换域名

先执行docker inspect xxx找到 Mount 部分,将挂载的 /var/www/html 目录打包(或者直接使用docker cp命令将该目录复制出来再打包也一样)

mysql容器也是一样,将 /var/lib/mysql 目录进行打包

打包后的两个文件复制到新的机器上解压,分别重命名为 html 和 mysql(命名随便)

使用 docker run ... -v xxx:xxx -u "1000:1000" xxx 或者docker-compose的方式启动wordpress和mysql,docker-compose.yml如下:

version: '3.1'

services:

  wordpress:
    image: wordpress
    container_name: wordpress-web
    restart: unless-stopped
    user: "1000:1000"
    networks:
      - huntzou_website
    environment:
      WORDPRESS_DB_HOST: wordpress-db
      WORDPRESS_DB_USER: xxx
      WORDPRESS_DB_PASSWORD: xxx
      WORDPRESS_DB_NAME: wp_db
      WORDPRESS_TABLE_PREFIX: wp
    volumes:
      - /home/hunt/Documents/docker_properties/wordpress/html:/var/www/html
      - /etc/localtime:/etc/localtime

  mysql:
    image: mysql
    container_name: wordpress-db
    user: "1000:1000"
    restart: unless-stopped
    networks:
      - huntzou_website
    #command: --default-authentication-plugin=mysql_native_password
    environment:
      MYSQL_DATABASE: wp_db
      MYSQL_ROOT_PASSWORD: zh613
    volumes:
      - /home/hunt/Documents/docker_properties/wordpress/mysql:/var/lib/mysql
      - /etc/localtime:/etc/localtime

networks:
  huntzou_website:
    external: true

其中-v的挂载目录就是打包的那个目录,挂载点和原主机挂载点相同。

wordpress上传文件:The response is not a valid JSON response

现象

wordpress媒体库中上传文件出错:Unexpected response from the server. The file may have been uploaded successfully. Check in the Media Library or reload the page.

同时,直接在文章页面上传文件也出错:The response is not a valid JSON response

解决

wordpress默认会限制上传文件的大小,但我肯定不是这个问题,我很早就将这个限制修改了。

我在wordpress前使用了nginx做反向代理,问题也就出在这,解决方法:

在nginx的配置文件 http{} 模块中修改最大允许的请求体大小 client_max_body_size

http {
    client_max_body_size 256M;

    server{...}
    ...
}

重新加载配置文件或重启nginx即可

参考

https://stackoverflow.com/questions/59915558/wordpress-unexpected-response-from-the-server-the-file-may-have-been-uploaded

wordpress引用其他文章链接会创建一条新的评论

当我在一篇文章中加入了其他文章的链接,wordpress后台就会自动为引用的文章添加一个comment

这个东西并不是bug,而是feature,名为 “Pingbacks”

关掉这个功能很简单,进入到后台,找到 设置–>讨论–>pingbacks 和 notify 前面的勾去掉就行了

参考:https://wordpress.com/support/comments/pingbacks/#can-i-stop-self-pings

Wordpress: Maximum call stack size exceeded

在wordpress中使用古腾堡编辑器(Gutenberg)写文章点击发布后没反应,再次点击就一直转圈,查看浏览器控制台发现如下报错

我这里是因为 EditorsKit 插件的问题引起的,将其禁用掉就好了

wordpress 后台登录一直是被锁定状态

情景

一直提示过多的错误登录,即使是自己没有输错过密码,即使是过了限制时间再次登录也会被重置限制时间等等,反正就是一直提示尝试次数过多而被限制。

原因

由于安装了 Limit Login Attempts Reloaded 插件,该插件会限制同一个ip错误登录的次数,但是又由于开启了nginx的反向代理(并且还是多层代理),导致不管是谁登录后台,都会被认为是同一个ip(nginx服务器的ip)登录的。所以若别人尝试登录达到限制,其他客户端的任何登录都会被限制。

临时解决

进入wordpress后台服务器,删除该插件的目录

root@a5665d258313:/var/www/html/wp-content/plugins# pwd
/var/www/html/wp-content/plugins
root@a5665d258313:/var/www/html/wp-content/plugins# ls
xxx xxx xxxx  limit-login-attempts-reloaded	xxx xxx xxx
root@a5665d258313:/var/www/html/wp-content/plugins# rm -rf limit-login-attempts-reloaded

永久解决

这种反向代理的场景很常见,那该插件肯定也是有解决的。

配置nginx

在代理的请求头中加上真实IP的信息

插件设置

进入该插件的设置页面最下面就有,在 Trusted IP Origins 的头部加上 HTTP_X_REAL_IP

为什么默认的 REMOTE_ADDR 获取不到真实IP

因为我使用了多层代理,导致其在nginx内部进行了多次重定向,remote_addr 记录的是最后一次跳转的客户端的地址,即仍然是nginx的ip

这里好像理解的不对,我找找资料先

Nginx反向代理wordpress开启HTTPS

网站创建过程详见:个人网站搭建过程

申请SSL证书

首先申请一个SSL证书,我在腾讯云上申请的

https://buy.cloud.tencent.com/ssl?fromSource=ssl

注:23年3月20号以后页面进行了改版,现在在证书购买页面看不到免费证书了,需要去 SSL证书管理控制台/我的证书/免费证书 里面才能看到购买免费证书的入口,现在全网域名可配置20个免费证书,腾讯云域名还能额外配置30个免费证书

使用dns验证需手动添加一条域名解析记录

使用文件验证需在web根目录创建指定文件

以下为使用dns验证的方式

根据提示,去域名服务商添加一条解析记录

点击查看域名验证状态,等待几分钟即可,都是自动验证签发的

签发通过后点击下载,会得到一个压缩包,里面有证书以及私钥

修改wordpress地址设置

将原来的http修改为https,关于这两个地址的作用:关于wordpress中WordPress Address和Site Address的理解

给nginx配置SSL证书

将上述证书和私钥复制到nginx服务器上,例如我这里就把它们放在了nginx容器中的 /opt/bitnami/nginx/conf/cert/blog 目录(解压后一共有四个文件,但只需要这两个就够了)

修改nginx配置文件

# 用作将http跳转到https
server {
    listen 80;
    server_name woyou.cool;
    rewrite ^/(.*) https://blog.woyou.cool/$1 permanent;
}
server {
    listen 443 ssl;
    server_name blog.woyou.cool;
    access_log /opt/bitnami/nginx/logs/huntzou_website.log;
    error_log /opt/bitnami/nginx/logs/huntzou_website_error.log;

    #证书文件名称
    ssl_certificate /opt/bitnami/nginx/conf/cert/blog/blog.woyou.cool_bundle.crt;
    #私钥文件名称
    ssl_certificate_key /opt/bitnami/nginx/conf/cert/blog/blog.woyou.cool.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header HOST $http_host;
        proxy_set_header X-NginX-Proxy true;

        # 注意这个配置,一定要有,下文说明
        proxy_set_header X-Forwarded-Proto  https;

        proxy_pass http://wp-web:80;
        proxy_redirect off;
    }
}

将配置文件保存后重启nginx

关于wordpress中WordPress Address和Site Address的理解

wordpress的 设置=>基本设置 中存在这样两个让人困惑的配置

WordPress Address

即wordpress资源文件在服务器中存放的位置,例如,加载wordpress网页时需要加载的各种js、css等资源文件

若错误地设置了该地址,则wordpress网页就会显示不正常(毕竟css等资源文件找不到了),但数据依然可以正常获取

错误修复

若不慎错误地修改了该地址导致页面不正常,可通过以下方式恢复

找到wordpress主题文件夹所在位置,并在其中的 functions.php 文件最下面加入:

update_option('siteurl','http://127.0.0.1(即修改前地址)');
update_option('home','http://127.0.0.1(即修改前地址)');

强制刷新wordpress网页即可

页面正常后再删除这两行代码

Site Address

即网站访问地址,访问该地址将进入你的默认首页。相当于给首页增加了一个别名。该地址可随意修改

例如将该地址原本为 http://127.0.0.1,此时访问 http://127.0.0.1:anotherpage 将显示404。

若将该地址修改为 http://127.0.0.1:anotherpage,此时就能同时使用 http://127.0.0.1 和 http://127.0.0.1:anotherpage 进行访问

总结

不管是 WordPress Address 还是 Site Address 都不会修改wordpress原本的访问路径,其原本访问路径在apache启动时就已经确定了。修改Site Address基本不会影响访问,修改WordPress Address也只不过是在网页加载时告诉网页,我将资源文件放在哪了。但实际放没放,那就是另一回事了。

wordpress WP Statistics插件无法开启GeoIP国家和城市统计功能

现象

勾选 GeoIP收集GeoIP城市 点击保存无效

问题原因

这两个选项需从github上下载ip地址和物理地址映射的数据文件,但国内访问github存在问题

解决方案

直接下载该映射数据文件放到指定目录

具体方法

  1. 下载国家和城市与ip的映射数据文件(GeoLite2数据库,下文有介绍)
    https://raw.githubusercontent.com/wp-statistics/GeoLite2-Country/master/GeoLite2-Country.mmdb.gz
    https://raw.githubusercontent.com/wp-statistics/GeoLite2-City/master/GeoLite2-City.mmdb.gz
  2. 解压gz文件(网上很多教程没有这一步,如果你直接将上面下载的文件放在目标文件夹后还是没用,可以试试先解压,我就遇到了这个问题)
  3. 将解压后的文件放到 html/wp-content/uploads/wp-statistics/ 目录下,再次尝试开启即可

确认开启了还是没用?

ip显示为一个内网IP,城市都显示的是unknown

你是不是使用了反向代理功能?我也是这种情况,所以你还需要设置WP Statistics使用请求头中的真实ip地址:

Nginx配置中需要有这个

GeoLite2数据库

GeoLite2数据库是一个免费的 ip-物理地址 映射数据库,每周二更新一次

https://dev.maxmind.com/geoip/geolite2-free-geolocation-data?lang=en

该数据库由MixMind提供,但现在从官网下载较为麻烦,需要申请一个licese key,然后使用该key下载。下载链接:

https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country&license_key=YOUR_LICENSE_KEY&suffix=tar.gz

详见:https://dev.maxmind.com/geoip/updating-databases

也可以从其他渠道下载,例如:

https://github.com/P3TERX/GeoLite.mmdb

https://github.com/wp-statistics/GeoLite2-City

个人网站搭建过程

网站架构

wordpress是一个用于快速搭建博客平台的php软件,运行在apache下

wekan是一个开源看板,类似trello,可用于项目管理和计划安排

搭建步骤

环境准备

1. 安装docker

2. 拉取wordpress、mysql、wekan、mongo的docker镜像

docker pull wordpress
docker pull mysql
docker pull mongo:4.4-rc-focal
docker pull wekanteam/wekan:v5.35
# 作者反馈最新版的镜像有bug,不建议拉取最新的。不过我看他说目前已经修复了。

docker创建网络用于容器间通信

docker network create huntzou_website

启动容器

1. 启动mysql

docker run --name db-mysql --restart=always -v /etc/localtime:/etc/localtime -e MYSQL_ROOT_PASSWORD=<your pwd> -d --network huntzou_website f2ad9

2. 进入到mysql容器中创建数据库

docker exec -it <containerID> bash
mysql -u<your db user> -p
CREATE DATABASE <your db name> DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

3. 启动wordpress

docker run --name wp-web --restart=always -v /etc/localtime:/etc/localtime --network huntzou_website -d -e WORDPRESS_DB_HOST=db-mysql -e WORDPRESS_DB_USER=<your db user> -e WORDPRESS_DB_PASSWORD=<your db pwd> -e WORDPRESS_DB_NAME=<your db name> -e WORDPRESS_TABLE_PREFIX=wp b44d

4. 启动mongodb

修改docker中wordpress文件上传大小限制

默认情况下,只能向媒体库中上传2M大小的文件,该限制是php的限制而非wordpress。

解决方法:

进入docker容器

docker exec -it 6bab bash

其中 6bab 是 docker container id

找到php安装路径

whereis php

进入到其安装目录

cd /usr/local/etc/php
ls

默认情况下是没有 php.ini 文件的,需要创建一个。直接复制一个 php.ini-production 重命名为 php.ini 即可。

编辑 php.ini 文件,默认情况下docker容器中没有安装vim,可以选择安装或者将文件拷贝出来修改后再拷贝回去。演示后一种方法

php.ini 复制到宿主机

docker cp 6bab:/usr/local/etc/php/ php.ini

修改该文件中的这几个配置:

upload_max_filesize = 512M    #文件大小限制
post_max_size = 512M    #post大小限制
memory_limit = 256M        #内存占用限制

再将该文件复制回docker容器

docker cp php.ini 6bab:/usr/local/etc/php/

重启容器即可

docker restart 6bab