一句命令部署 WordPress
写了许多 WordPress 相关的文章,但迟迟没有写部署的方法,目前比较简单的部署方法有宝塔面板一键部署或直接使用 WordPress 应用镜像。
而考虑到宝塔面板需要额外预留大约 0.5G 内存且最近刚出来一个非常严重的数据库安全漏洞(无法预知以后还会不会有);直接装 WordPress 应用镜像过于无脑。因此我在这里介绍一条被很多人忽略的部署方法 —— 使用 docker。
关于 docker 软件的安装及容器的部署过程,我已经在 ShareLaTeX 部署中提过一次了,这里不再做特别详细的介绍。
WordPress 容器的配置文件可以参考下面内容,并根据需求自行修改配置文件:
version: '3.1'
services:
WordPress:
image: WordPress
restart: always
ports:
- 80:80
environment:
WordPress_DB_HOST: db
WordPress_DB_USER: root
...
WordPress 主题二次开发 —— 子主题
在 WP 开发过程中,直接修改主题文件对主题进行美化是不妥的,因为若主题升级,一切又得重来,而子主题可以完美解决这一问题。子主题是指一个继承了另一个主题 —— 父主题全部功能样式的主题,同时它允许你自己添加一些功能与样式。
创建一个子主题比较容易:
首先进入 themes 文件夹,该文件夹下放置了你全部的主题,找一个你希望继承的父主题文件夹,这里假设名为 theme-parent,接下来创建子主题只需要两个步骤:
在 themes 文件夹下创建一个新文件夹,命名为 theme-child(表示子主题的文件夹名,可任意命名)
进入子主题文件夹,创建一个文件:style.css,内容如下:
/*!
Theme name:Theme-Child
Template:theme-parent
*/
@import url ('../theme-parent/style.css')
Theme name 后面内容是你的子主题名称,Template 后面填写父主题文件夹名,下面的 url 修改成父主题下的 style.css 的相对路径。
此时子主题已经制作完成,它和父主题一毛一样,因为我们没有加任何新的内容。若想加入新的函数, ...
Apache 字体文件跨域问题
开启 cdn 加速后,我在浏览器中遇到了数十条类似下面的报错:
...has been blocked by CORS policy: No 'Access-Control-Allow-Origin'...
就是个 CORS 跨域问题,这里出问题的文件基本都是一些诸如 ttf、otf 什么的字体文件。相信各位都比较清楚跨域是啥、什么时候会产生跨域,这里不再多说。要解决这个问题也非常容易,这里针对 apache(apache2)进行说明,nginx 也类似。
首先登录 apache2 所在的服务器,跑一句命令:
a2enmod headers
开启 mod_headers 模块,然后重新加载配置:
/etc/init.d/apache2 force-reload
接下来打开站点的配置文件(.htaccess 文件)
写入下面一段代码保存即可:
<FilesMatch "\.(ttf|otf|eot|woff|woff2|)(.*)">
<IfModule mod_headers.c>
Header set Access-Control-A ...
WordPress 配置 CDN 加速
CDN(内容分发网络)可以根据用户的位置就近获取网站静态资源,降低网络的拥塞、减轻服务器压力。
这里我选择的平台依旧是阿里云,进入阿里云的控制台,找到 CDN→域名管理→添加域名。(若想配置 DCDN,前往阿里云 DCDN 控制台进行下面类似的操作即可。)
以 cdn.fyz666.xyz 为例,按上图进行配置以后,域名管理栏中就出现了你刚刚设置的加速域名,接下来根据需求需要进行 DNS 解析即可。
稍等片刻,解析记录就生效了。接下来就可以前往 WordPress 修改静态资源链接了。但一个一个修改实在是累,而且万一哪天不用 cdn 了还得改回来,就很麻烦,这里推荐一款 WP 插件:CDN Enabler
至此全站加速基本配置完了,还有一些小 bug 需要处理,例如字体文件被 CORS 跨域阻止。解决方法戳这里。
使用密钥登录 SSH
由于使用密码登录 ssh 相对而言安全性差一点(而且每次都输密码太麻烦了),我们可以使用密钥进行 ssh 连接。
先在本地生成一对 rsa 密钥:
ssh-keygen -t rsa -m PEM -b 3072
随后一路回车即可。
接下来进入用户目录 C://Users/ 用户名 /,可以发现已经生成了一个.ssh 文件夹。里面包含 id_rsa 和 id_rsa.pub 两个文件,其中后者是公钥文件。将公钥文件 id_rsa.pub 上传到服务器需要密钥登录的用户名文件夹的.ssh 目录下(如果没有.ssh 目录就自己创建一个),并将公钥文件重命名为 authorized_keys,例如 /home/user1/.ssh/authorized_keys。
现在在本地进行 ssh 连接:ssh user1@ip 已经默认使用密钥了。
接下来需要禁止该用户使用密码登录:
登录服务器修改 /etc/ssh/sshd_config 文件:
sudo vi /etc/ssh/sshd_config
添加下面内容(user1 是禁用密码登录的用户名):
Match user user1
PasswordAuthenticati ...
Linux 系统禁止 root 用户 SSH 登录
Root 用户在 linux 系统中拥有至高无上的权力与地位,可以做任何你想做的事,因此若一旦被不怀好意的人暴力破解 root 用户的密码,服务器就会陷入危险境地。
(我的服务器:这么看得起我???)咳咳,虽然我的服务器不值得被其他人暴破,但流程还是要走一下的。阿里云的 Linux 服务器自带了一个可以在控制台无密码登录的 admin 用户,因此只要禁止 root 登录 SSH 即可。而我不太喜欢阿里云的远程连接界面,故又创了一个新用户。
禁止 root 用户登录的操作:
# 打开以下文件
sudo vi /etc/ssh/sshd_config
方法一方法二# 翻到文件最下面将这一项修改为 no
PermitRootLogin no
# 重启 sshd
sudo systemctl restart sshd.service
但这种方法过于简单粗暴,也直接限制了 root 的 sftp 登录,如果想让 root 用户仍可以登录 sftp,则可以使用方法二。# 这一项不修改
PermitRootLogin yes
# 添加下面两行
Match user root
ForceCommand internal-sftp
# ...
WordPress 登录提示 Cookies 被阻止的解决办法
有一天,我正常在前台登录窗口输入自己的账号密码,却得到了一个登录失败的提示,F12 查看 Network 之后发现报错内容如下:
我根本没当回事,轻车熟路打开浏览器设置页面找到 cookie 设置,却发现根本没有阻止网页的 cookie。
查遍资料,大多解决办法都是在 wp-config.php 文件中加一句诸如这样的代码:define ('COOKIE_DOMAIN', $_SERVER ['HTTP_HOST'] );
但这并没能解决我的问题,后来经过研究我发现原来是 WP 自带的登录功能会先判断浏览器是否支持 cookie,若支持则添加一个 cookie,该 cookie 存在时尚能正常进行登录。这个 cookie 长这样:
于是我在登录函数里加了一段 js 代码来判断浏览器是否支持 cookie,若支持则添加上面的 cookie:
if (!navigator.cookieEnabled){
alert (' 浏览器未支持 cookie,请更换浏览器或解除对本站 cookie 的阻止 ');
return;
}
if ($.cookie ('WordPress_test_ ...
Docker for Windows 磁盘映像文件迁移
最近在 windows 10 系统上安装了 docker,随手 pull 了几个镜像后,发现 C 盘空间锐减(少了 1-2 个 G),心想其默认镜像存储空间铁定在 C 盘了,故得想办法将其揪出来,并修改一下默认路径。
查了好多资料,基本都表示 windows 版的 docker 是基于 hyper-v 虚拟机运行的,需要去修改 hyper-v 虚拟机的一个虚拟磁盘路径,但我找了一下发现我甚至连 hyper-v 虚拟机都没有创建。。。那是怎么运行起来 docker 的呢?
后来了解到我的 docker 版本是 2.3.0.4,这一版本已经不依赖于 hyper-v 了,而采用了 WSL 2 这种我没听说过的东西。
用 TreeSizeFree 软件扫描了一下 C 盘之后在 AppData 下面找到了一个很大的 Docker 文件夹,文件夹内部文件结构大概是:Docker/wsl/data/ext4.vhdx。
这个 ext4.vhdx 就是一个磁盘映像文件,非常大。下面是将其转移的操作步骤:
停止 docker
关闭 WSL:wsl --shutdown
导出数据到随便哪个盘:wsl --export docker-desktop-data F:\docker-deskt ...
WordPress 媒体库图片不显示问题的解决
先写一个相关的小插曲,今天上午起床后打开博客,发现导航菜单炸了:所有一级、二级菜单都变成了没有 url 的自定义链接,有些菜单的导航标签也消失了。
这个问题虽然令我诧异(WP 群里的大佬们也都表示没见过这个问题,一度怀疑是主题 bug),但好在十分容易解决,删除菜单重新添加一个就行了,我也没多想。
后来我打开媒体库,发现所有媒体图片都无法显示,而显示成一张默认图片:
不过原图片并没有删掉,通过图片链接访问完全没有问题。
突然想起昨天搞了一下数据库,会不会是这个原因呢,我一通仔细排查果然发现了端倪。
昨天在优化数据库时,看了这篇文章
该文章表示 wp_postmeta 这张表可有可无,我就随手清空了一下,却不想这一清空后果相当严重,不仅导致导航菜单直接乱套,所有链接都没了,还导致媒体库图片的数据全部无法显示。经过很长时间的排查才发现是因为清了这张表,这张表一定不能乱清空!!!得谨慎啊。
找到问题以后,感觉基本没啥快捷的恢复方法了,因此我选择直接恢复服务器三天前的快照,不然重新传图片实在是太麻烦了。
最后,学到的教训:
对于自己不了解的操作,一定要谨慎操作!!!
操作数据库前,一定要备份!!!
RSA 加密算法原理(二)
在 RSA 加密算法原理(一)一文中我科普了一些简单的数论基础知识,接下来可以细说 RSA 的数学原理啦~
先以一个例子简单讲一下 RSA 算法的流程,假设 A 要向 B 发消息,那么 B 会按以下流程生成一对密钥:
生成一对密钥(公私钥)
选择两个不相等的素数 $p$ 和 $q$,例如 $p=31,q=37$
计算 $n=p\times q=31\times37=1147$
计算 $\phi (n)$,这里有一个比较直观的看法:由于 $n$ 是两个素数 $p,q$ 的乘积,那么小于 $n$ 的正整数中,与 $n$ 不互素的应该有
\begin {aligned}&kq,k= 1,2,...,p-1\\&kp,k= 1,2,...,q-1\end {aligned} 且 $p、q$ 均为素数可以保证这些数两两不同,因此
\begin {aligned}\phi (n)&=n-1-(p-1)-(q-1)\\&=n-p-q+1\\&=(p-1)(q-1)\\&=30\times36=1080\end {aligned}
在 $(1, \phi (n))$ 之间随机选择一个正整数 $e$,使得 $e ⊥ \phi (n)$,这里我们随 ...
RSA 加密算法原理(一)
密码学是计算机科学中与数学关系比较密切的领域,而当今最重要最流行的加密方式当属 RSA 加密,其应用领域非常广泛,从银行卡密码的加密到 WEB 数字签名等等都有其用武之地。本文将简单讲述这方面的历史与数学背景。
相关历史历史上,有一种加密模式曾非常流行,即对称加密。(当然目前对称加密仍是一种重要的加密方法,被应用于许多加密数据量较大的场景)
所谓 “对称加密”,也就是指下面这个过程:
A 与 B 约定一种加密规则
A 将信息加密,将密文发给 B
B 应用约定的规则,对密文直接解密得到明文
这里约定的规则被称为 “密钥”,这种加密方式有它的优势,即加密速度快。但劣势也很显著:“密钥” 需要在联络者之间进行传递,这也造成了不安全的因素,第三方若拦截了密钥,也就破译了信息。因此顺应历史潮流,1976 年,一种新的加密理念诞生了:
先由 B 生成两把密钥,分别是公钥和私钥,公钥,如其名,是公开的,任何人都可以获取;而私钥则由 B 进行保管。
B 将公钥发送给 A,A 将信息用公钥进行加密,将密文发送给 B。
B 用私钥将密文进行解密得到明文。
随意从百度拿了个图
这也被称为 “非对称加密”。
当然,一个思维正常的人肯定会发问:既然 ...
WordPress 前台注册登录
WP 的原生的注册登录页面真的丑,而且会跳转离开主页,导致用户体验比较差,于是我打算实现一下在前台进行无跳转注册登录。
其实前台登录的插件有不少,但我不太想用插件,就自己来写咯~
由于并没有摸清 WP 注册登录的逻辑,自己写 Authentication 等函数可能安全性稍差一些,也会比较麻烦。(何况既然有已经写好的注册登录功能,为啥不用呢?)于是,我有了一个朴素的想法,即利用 ajax 向原生的注册登录页面(wp-login.php)post 数据,通过判断返回的 html 页面数据来判断是否登录成功。
最终样式如图:
前端代码:
引用站外地址,不保证站点的可用性和安全性
WordPress 弹窗登录表单
GitHub Gist
将其导入 WordPress 主题目录,修改一下路径参数即可!
思路比较简单,即失败时的页面必定会有个 #login_error 元素(有更好的判断方法敬请大佬们留言!!)
最后在前 ...
WordPress 中短码的嵌套使用
众所周知,短代码是 WordPress 的一大特色,使用起来相当舒适方便,但短代码默认不能嵌套使用,本文给出一种朴素的方法用来解决这个问题。
在 functions.php 文件中定义一个函数:
function recursive_shortcode ($content){
$new_content = do_shortcode ($content);
while ($new_content!=$content){
$content = $new_content;
$new_content = do_shortcode ($content);
}
return $new_content;
}
之后为最外层短代码对应函数的返回值套一个 recursive_shortcode 即可。
MySQL 数据库自增主键重置的方法
最近做 WordPress 站点测试某些功能的时候,为数据表添加了几条测试数据,测试完后又将其删除,但自增主键却不会自动重置,对强迫症非常不友好,因此需要进行一些操作来将其重置。
方法一方法二若数据表是空的,或不需要表中的数据了,可以直接清空并重置自增字段:
TRUNCATE TABLE 'table_name';
但不巧,我不想清空数据表,清空了用户就全没了呀,这时还有另外的方法。
删掉自增主键
重置自增值为 1
添加新的自增主键
ALTER TABLE 'table_name' DROP ID;
ALTER TABLE 'table_name' AUTO_INCREMENT = 1;
ALTER TABLE 'table_name' ADD ID int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
但我在 DROP ID 时遇到了一个奇怪的报错:Invalid default value for 'xxx'(某日期字段)
将该字段的类型从 DATETIME 换成了 TIMESTAMP,并令其默认值为 CURRENT_TIM ...
如何安装并优雅地使用 Jupyter Notebook
Jupyter 是啥?为什么以及什么时候要用它?Jupyter Notebook 是一款基于网页的交互式 Python IDE,当然如今随着它的发展,也逐渐支持 R、PHP 等其他编程语言,它是一款模块化的代码解释器,也就是可以将大段的代码模块化处理,分为多段运行。
该 IDE 的交互性非常好,设想你在做数据处理、分析的时候,一般会希望马上看到结果,此时若在 pycharm 等常规解释器中,就不得不把所有的代码从头跑一遍,你还得在中间插入一些 print 来打印结果,非常之麻烦,但在 jupyter 中,在前面代码都已经运行过的基础上,可以直接运行当前段代码。基于这些特性,jupyter 可能会适用于数据处理分析以及各种建模过程等场景,但不一定适合用于软件开发等流程比较丰富、整体性比较强的领域。
我第一次使用这个 IDE 是在完成数据科学大作业的过程中,那么今天就来简单介绍一下自己的安装配置经验。
安装过程前提:python3.3 及以上(听说 2.7 版本也可)
做数据科学的童鞋们建议直接安装 Anaconda,因为它不但直接自带了 jupyter notebook,还附赠了一两百个数据科学相关的库,非常的方便。
什么?你的 ...
如何写 CSS 样式使 HTML 元素位于屏幕正中
在做前端时,往往会遇到将某个标签元素置于屏幕正中的需求,例如对话框等。这里提供一种利用 CSS 的方法,只需为目标元素添加以下 CSS 样式:
position: fixed;
top: 50%;
left: 50%;
-webkit-transform: translateX (-50%) translateY (-50%);
-moz-transform: translateX (-50%) translateY (-50%);
-ms-transform: translateX (-50%) translateY (-50%);
transform: translateX (-50%) translateY (-50%);
即可让该元素始终位于屏幕正中。
为网站打造独特的右键菜单
最近发现了一款可以更改网站的右键菜单的 WordPress 插件,但只有 WordPress 可以使用,且插件不够轻量,用多了也会造成网站速度越来越慢,因此可以考虑实现用纯前端操作实现这个功能。
本着不重复造轮子的思想(其实是懒),我找到了这篇文章,这位大佬的菜单样式写的特别好看,同时我又根据自己的一些需求进行了一些增删改与优化。(顺便这位大佬的代码好像是经压缩后又重新规范化的,看的是真的累啊)
代码资源点这儿。提取码:3pyf
大概样式如下图:
代码的思想不难,简单讲解一下:
先禁用浏览器自带的右键菜单功能
在网页中预先隐藏好一个自定义的菜单
点击右键时将其显示到鼠标旁
点击左键时再将其隐藏
我的优化主要是将 mousemove 事件去掉了,这块实在太耗计算资源。
这里我有一个新的但比较常规的需求就是在右键 <a> 标签时,出现一个 “新标签页打开” 菜单项,点击该选项可以将该链接在新标签页打开。
这里我们通过对所有的 < a > 标签的 oncontextmenu 事件写一个响应函数来实现:
$(document).on ('contextmenu', 'a [href]:not ("[hr ...
Form 表单回车自动提交的原因及避免办法
在 html 中使用 form 表单的时候,有时候会遇到回车自动提交的问题,比如我做了一个登录表单,希望其通过 ajax 提交而不进行网页整体刷新,但一敲回车,表单自己提交了上去并造成网页整体刷新,就会造成比较差的体验。
当然第一个方法就是你别用 form 就行了,但考虑到 form 有一个 serialize () 方法特别好用,因此我非用 form 不可,这时还有另外的解决方法。
首先这种自动提交的行为来自于浏览器的迷惑行为自动优化,查找资料后发现有以下几条规则:
表单含有 type="submit" 的按钮时,回车自动提交
表单有且仅有一个 type="text" 的 input 时,回车自动提交
button 按钮在不声明 type 时,有些浏览器会默认其为 submit
其他表单元素如 textarea、select 不影响,radio、checkbox 不影响触发规则,但本身在 FireFox 下会响应回车键,在 IE 下不响应
type="image" 的 input,效果等同于 type="submit",不知道为什么会设计这样一种 type,不推荐使用,应该 ...
使用 Python 向百度推送 url
百度站长工具提供了许多推送接口,API 提交中给了使用一些其他语言的例子,唯独没有 python(大概是觉得 python 过于简单),因此我写了一个 python 脚本用以批量推送网站内的 url。
首先需要一个站点地图,在我网站上是”/sitemap.php”,访问会生成 xml 格式的站点地图文件(也可以通过其他任何方式,只要能获取一个每行一个 url 的字符串文本即可)。
import requests
import re
sitemap_url = 'https://blog.fyz666.xyz/sitemap.php'// 站点地图
post_url = 'http://data.zz.baidu.com/urls?site=https://blog.fyz666.xyz&token=xxxxxx' # 这个 API 链接由百度站长工具提供
urls_response = requests.get (sitemap_url)
urls= '\n'.join (re.findall ('(?<=<loc>).*(?=</loc>)', urls_response.text))
he ...
WordPress 开启邮件发送功能
基于 WordPress 的用户注册需要发送验证邮件,我们需要开启 WordPress 的邮件发送功能。
本文针对阿里云服务器来进行 SMTP 服务的配置,首先登录阿里云官网开通邮件推送服务,该服务支持每天 200 条免费邮件,小站用用肯定是够了。接下来找到邮件推送控制台,然后按下图指示,进行配置:
step2 中在已有域名的基础上解析一个二级域名即可,这个二级域名将用以发送邮件。
step3 配置全部完成后,进行 step4 的验证。
以下简要说明 step3:
接下来进入云解析 DNS 界面,为刚才选择的域名进行解析,解析内容是图中的四条值,解析完成后 10 分钟内一般会验证通过,届时进入 step4 进行验证即可。
接下来进行下图操作:
其中回信地址设为常用邮箱,然后验证一下即可,验证完后设置一个 SMTP 密码,同时发信地址是后面服务器发邮件时显示的邮件来源,这两个东西后面会用到。
接下来需要使用一个 WordPress 邮件插件,我用的是 SMTP Mailer,亲测好用!
插件设置中,SMTP Host 填写阿里云给的 smtp 服务器地址,我的是 smtpdm.aliyun.com,SMTP Authenticati ...