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即可
参考
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存在问题
解决方案
直接下载该映射数据文件放到指定目录
具体方法
- 下载国家和城市与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 - 解压gz文件(网上很多教程没有这一步,如果你直接将上面下载的文件放在目标文件夹后还是没用,可以试试先解压,我就遇到了这个问题)
- 将解压后的文件放到
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://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