博客维护

这个博客坚持了好多年了,经常会涉及到一些简单维护,因为频率低,很多操作会忘记,故特此记录。

2022年12月 更换主题/升级EC2

这次对做了比较大的改变,包括更换主题(更好的适配移动端)、升级EC2、使用Elatsic IP、调整了php-fpm、prefork的一些参数。

  • 首先,将EC2主机升级到t3.medium 2c4g了(原来是1c2gb,而偶尔会出现Out of memory的问题),并使用一个Elastic IP避免每次重启后IP变化,然后需要更改DNS解析的问题
  • 从原来使用了10年的Prower主题更换为现在的Powder。两个主题名字看起来有点像,但是似乎没有任何关联。
  • 为了更好的使用内存,则适当调大了httpd、php-fpm的并发参数
  • 另外,也对主题做了一些定制,包括调整字体、占宽等等问题。
  • 后续再记录较为详细的调整和说明。

修改Wordpress Block Theme主题

wordpress在5.9之后开始支持新的Block Theme主题,主题有更强的可定制性,更好的利用了块编辑器的特点。上手有一点点难度,但是之后,就发现,还是非常好用的。这次对主题做了很多调整,这里简单记录如下:

  • 把默认页面宽度从600调整为了800px,该修改在theme.json文件中的settings.layout.contentSize处修改。
  • 新增了一个template(页面模板)db-news,云数据库技术等页面使用了该模板
  • 保留了之前模板的定制css,如.mycode .t3
  • 还修改模板部分字体、padding、header、footer等地方
  • 为了适配Event Calendar插件,在ssl.conf中新增如下重定向代码:
RewriteEngine on
RewriteRule ^/events/([a-z/.]*)$ /index.php/events/$1 [R=301,L]

httpd、php-fpm并发控制参数调整

[暂不记录]

2021年12月 使用插件Code Syntax Block高亮代码

在习惯新的块编辑器之后,尝试使用插件Code Syntax Block来美化/格式化/高亮代码展示。插件安装上之后,发现几个问题:

1. 无法简单的导入新prism主题

2. 修改插件主题中的字体之后,发现并不生效(注:想用一个等宽/monospace字体)

花了几个小时来解决这个问题,记录如下。

先看看第二个问题:为什么修改了主题中的字体相关的CSS并不生效?通过调试发现,是被主题中的全局字体设置覆盖了。于是新增了优先级更高的CSS如下:

## 我这里CSS文件为:vim prism-duotone-sea.css (需要根据实际情况编辑正确的CSS文件)
code[class*="language-"],
pre[class*="language-"] *{
    font-family: Menlo, Monaco, "Courier New", monospace !important;
}

在重新刷新缓存(shift+command+r)后,查看是有效的。

再来看看第一个问题,插件的作者似乎是做了一些硬编码的(参考index.js)或者就不支持扩展,所以简单阅读代码后做了一些扩展。

首先,在build/index.js的找到插件展示的数组,新增需要添加的数组:,新增了大概这一小段元素:

{label:"duotone",value:"prism-duotone-sea"}

还需要修改插件的插件的index.php文件,在初始化主题数组中新增你添加的主题:

/ 注:下面代码中数组元素'prism-duotone-sea'为新增
const MKAZ_CODE_SYNTAX_COLOR_SCHEMES = ['prism-a11y-dark', 'prism-duotone-sea','prism-ghcolors', 'prism-nord', 'prism-onedark'];

如此,新添加的主题就可以正常工作了。哎,想要高亮的、使用等宽字体(monospace)的代码展示,并不容易,大概花了2.5小时把,故此记录,以便后续持续维护。

2021年09月 迁移到Amazon Linux 2

看起来很简单,但是还是搞了大概3-4个小时吧,故记录如下。

最新的Wordpress推荐使用PHP 7.4以上的版本,才能比较好的使用最新的块编辑器;另外,最近要安装一个Resume插件也需要php 5.7以上的版本;另外,Amazon Linux在2020年底已经停止了标准支持(standard support),进入了维护支持的阶段(maintenance support phase,参考)。感觉,是时候升级一下EC2的主机了。

购买新主机EC2主机

安装httpd、mysql-server、php

Amazon Linux 2是一个类似RHEL/Centos/Fedora的发行版本,故使用类似的方法安装。

rpm -E %{rhel}
7

cat /etc/os-release
NAME="Amazon Linux"
VERSION="2"
ID="amzn"
ID_LIKE="centos rhel fedora"
VERSION_ID="2"
PRETTY_NAME="Amazon Linux 2"
ANSI_COLOR="0;33"
CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2"
HOME_URL="https://amazonlinux.com/"

安装httpd(默认安装版本是:2.4.48-2.amzn2):

sudo yum install httpd

安装MySQL:MySQL的按照还是比较复杂的,官方的MySQL已经不在一般的默认公共yum仓库中,而是需要单独配置Oracle官方的yum仓库。MariaDB一般都是在的,也许下一次升级的时候就会把Wordpress运行在MariaDB上了。暂时还是先用MySQL吧。

官方MySQL的详细安装说明:A Quick Guide to Using the MySQL Yum Repository。具体的步骤如下。

安装并启用相关MySQL的YUM仓库:

sudo rpm -Uvh mysql80-community-release-el7-3.noarch.rpm
yum repolist all | grep mysql

打开MySQL 5.7(默认可能是8.0):
sudo yum-config-manager --enable mysql57-community

或者通过编辑mysql仓库列表文件的方式:
sudo vim /etc/yum.repos.d/mysql-community.repo
-- 打开MySQL 5.7对应block的参数enable=1

sudo yum install mysql-community-server

mysql -V
mysql Ver 14.14 Distrib 5.7.35, for Linux (x86_64) using EditLine wrapper

启动并初始化MySQL:

sudo service mysqld start
Redirecting to /bin/systemctl start mysqld.service

--找到MySQL root的初始密码
sudo cat /var/log/mysqld.log |grep pass

为了简化把本地密码设置为空了,前提是需要在my.cnf中配置如下参数:
validate-password=OFF
新增了自动清除binary log的参数:
expire_logs_days=5

安装php7.4:默认安装的php版本时比较低的,需要使用amazon-linux-extra命令安装。

sudo amazon-linux-extras enable php7.4

yum install php

另外,一些相关的包也都要安装:
yum install php-cli php-pdo php-fpm php-json php-mysqlnd

配置Web Server,安装Wordpress

在httpd配置中新增站点的配置文件,并将原来的站点目录文件都拷贝新主机下:

# DumpIOInput On
# DumpIOOutput On
# LogLevel debug
# DumpIOLogLevel debug
ServerAdmin orczhou@gmail.com
DocumentRoot /var/www/orczhou.com
ServerName www.orczhou.com
Redirect permanent / https://www.orczhou.com/
ErrorLog logs/orczhou.com-error_log
CustomLog logs/orczhou.com-access_log common

Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all

将MySQL中的数据导入新的数据库

source /var/www/backup.blog.210915/wp_orczhou.210915.sql

设置数据库的账号和密码:
GRANT ALL PRIVILEGES ON wp_orczhou.* TO 'wp_orczhou'@'localhost' identified by '****';

最后配置SSL:按照相关httpd模块,并把需要的两个秘钥文件拷贝到对应的目录下。

yum install mod_ssl
service httpd restart

最后,测试完成后,再切换域名。

2021年09月 新增了resume builder插件

新增了该插件之后,为了更好地适配中文简历,并对样式做一些微调,对主题中的header.php做了如下修改:

<!--added by orczhou@2021-->
<?php
/*
* Check if this is a page in "resume builder " page
*
* */
global $post;
//print_r($post);
if($post->post_type == "rb_resume"){
echo <<<EOT
<style>
#header { display: none;}
#footerbox { display: none;}
#single-post-title { display: none;}
#single-post-title-comment { display: none;}
#blogImg {display:none;}
#single-page-comments {display:none;}
.rbt-header .rbt-name {display:none;}
.rb-template-default .rbt-contact-info {margin-top:5px;margin-bottom: 15px;}
.rb-template-default .rbt-section-heading {margin-bottom:5px;}
.rb-template-default .rbt-history-blocks .rbt-history-block .rbt-history-place-time>span{ font-weight:normal; }
.rb-template-default .rbt-history-blocks .rbt-history-block .rbt-history-job-degree {font-size:14px;}
.rbt-history-description ul {margin-left: 0px; padding-left: 0px;}
html { margin-top: 1px !important; }
.rb-template-default .rbt-history-blocks .rbt-history-block .rbt-history-job-degree::after{top:5px;}
.rbt-header-wrapper {align-items: center;}
</style>
EOT;
}
?>
<!--END added by orczhou-->

2020年03月30日 博客升级为https支持

具体可以参考:基于httpd的wordpress站点升级为https

2019年12月01日 文件上传限制修改为25MB

分别修改php.ini中文件的:post_max_size = 25M upload_max_filesize = 25M

sudo vim /etc/php.ini 
upload_max_filesize = 25M
post_max_size = 25M

2018年07月23日 使用fail2ban自动化一些BAN

httpd的访问日志中,有一些异常的访问,会导致httpd压力比较大,但是这些IP看起来是某个自动化的程序发送过来的,而且持续变化,无法手动ban,只能找一个自动化的程序,这里使用fail2ban,看起来工作的还可以:

sudo yum install fail2ban

日志信息
112.111.185.113 - - [23/Jul/2018:02:23:34 +0000] "GET /index.php/2011/09/thanks-percona-response-time-distribution HTTP/1.1" 301 -
112.111.185.113 - - [23/Jul/2018:02:23:34 +0000] "GET /index.php/2011/09/thanks-percona-response-time-distribution/ HTTP/1.1" 200 28759
112.111.185.113 - - [23/Jul/2018:02:23:44 +0000] "GET /index.php/2011/09/thanks-percona-response-time-distribution HTTP/1.1" 301 -
112.111.185.113 - - [23/Jul/2018:02:23:45 +0000] "GET /index.php/2011/09/thanks-percona-response-time-distribution HTTP/1.1" 301 -
112.111.185.113 - - [23/Jul/2018:02:23:45 +0000] "GET /index.php/2011/09/thanks-percona-response-time-distribution HTTP/1.1" 301 -
112.111.185.113 - - [23/Jul/2018:02:23:45 +0000] "GET /index.php/2011/09/thanks-percona-response-time-distribution HTTP/1.1" 301 -
112.111.185.113 - - [23/Jul/2018:02:23:46 +0000] "GET /index.php/2011/09/thanks-percona-response-time-distribution HTTP/1.1" 301 -

配置:
jail.conf
[apache-my-1]
enabled  = true
filter   = apache-my-1
logpath  = /var/log/httpd/orczhou.com-access_log
action   = iptables[name=fail2banapach, port=http, protocol=tcp]
bantime  = 172800 ; 2 days
findtime = 300; 1 day
maxretry = 5

$ cat filter.d/apache-my-1.conf
# Fail2Ban configuration file
#
#
#

[Definition]

#
# failregex = ^<HOST>  -.*"(GET|POST).*HTTP.*"(?:%(badbots)s|%(badbotscustom)s)"$
# 112.111.185.113 - - [23/Jul/2018:02:15:11 +0000] "GET /index.php/2011/09/thanks-percona-response-time-distribution/ HTTP/1.1" 200 28725
failregex = ^<HOST> -.*thanks-percona-response-time-distribution.*$

# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
# Values:  TEXT
#
ignoreregex =

查看是否ban成功:
sudo tail -f -n 100 /var/log/messages|grep "fail2ban"
Jul 23 02:26:00 ip-172-31-31-180 fail2ban.filter : INFO   Added logfile = /var/log/httpd/orczhou.com-access_log
Jul 23 02:26:00 ip-172-31-31-180 fail2ban.filter : INFO   Set maxRetry = 5
Jul 23 02:26:00 ip-172-31-31-180 fail2ban.filter : INFO   Set findtime = 600
Jul 23 02:26:00 ip-172-31-31-180 fail2ban.actions: INFO   Set banTime = 172800
Jul 23 02:26:00 ip-172-31-31-180 fail2ban.jail   : INFO   Jail 'ssh-iptables' started
Jul 23 02:26:00 ip-172-31-31-180 fail2ban.jail   : INFO   Jail 'apache-my-1' started
Jul 23 02:26:22 ip-172-31-31-180 fail2ban.actions: WARNING [apache-my-1] Ban 112.111.185.113

2018年06月20日 Ban一些IP

Ban: 
sudo iptables -A INPUT -s 175.44.8.219 -j DROP
Un-ban:
sudo iptables -D INPUT -s 42.120.74.101 -j DROP

2018年01月21日 简单的博客备份脚本

#!/bin/bash
bdir="backup.blog."date +%y%m%d
mkdir $bdir && cd $bdir
mysqldump -uroot wp_orczhou > wp_orczhou.date +%y%m%d.sql
tar zcf orczhou.com.date +%y%m%d.tar.gz /var/www/orczhou.com
cd .. && tar zcf $bdir.tar.gz $bdir

这个脚本需要使用sudo运行,原因是wp-config.php从安全的角度,给出尽可能少的权限:

-rw------- 1 apache apache 3.2K Jan 23 03:33 /var/www/orczhou.com/wp-config.php

可以看到,只有owner有rw权限,group和other都没有权限。

2018年01月21日 从digitalocean迁移到EC2

Snip20180123_99

之前使用digitalocean主要是因为价格便宜(5$/月),使用体验也非常不错,界面也简单(大概是因为产品线少吧),所以从13年使用至今:

对比了一下,现在AWS的价格也很便宜了(3年tokyo t2.micro ec2是$174),而且东京实例网络延迟也比欧美地区好非常多。所以,果断搬迁。

购买的是tokyo地区的EC2,可用区ap-northeast-1a,用的Amazon Linux,用的普通硬盘。环境搭建也比较简单,这里简单记录一下:

sudo yum install mysql57-server
sudo service mysqld start 

# MySQL innodb buffer pool size改为50MB,my.cnf中新增:
innodb_buffer_pool_size = 50M
sudo service mysqld restart

sudo yum httpd install
sudo service httpd start

# 配置httpd: 监听80端口,配置VirtualHost
<VirtualHost *:80>
    ServerAdmin orczhou@gmail.com
    DocumentRoot /var/www/orczhou.com
    ServerName www.orczhou.com
    ErrorLog logs/orczhou.com-error_log
    CustomLog logs/orczhou.com-access_log common
</VirtualHost>

<Directory "/var/www/orczhou.com">
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

# 安装php:
sudo yum install php
sudo yum install php-mysql
sudo service httpd restart

# 配置httpd,减少服务进程数量,减少内存
<IfModule prefork.c>
StartServers       4
MinSpareServers    3
MaxSpareServers    6
ServerLimit        20
MaxClients         20
MaxRequestsPerChild  4000
</IfModule>

# 导出导入数据库
mysqldump -uroot wp_orczhou > wp_orczhou.sql

mysql -uroot wp_orczhou < wp_orczhou.sql

#账号授权
grant all ON wp_orczhou.* TO 'wp_orczhou'@'localhost' IDENTIFIED BY PASSWORD 'xxxxxxx’;

基本上,上面的命令就可以完成整个安装了。其他一些记录的:(1) MySQL5.7的默认配置基本上满足需求,默认bp是128MB,对大一点的EC2应该也是OK的,我这个主机由于httpd占用内存较多,出现了OOM把mysqld kill掉的情况,所以调小到50MB。 (2) EC2开通的时候,需要注意选带公网IP的选项;另外,默认应该是只允许22端口开放,注意要在安全组新增80端口的开放。 (3) 插曲,之前还选了一次REDHAT Linux,后来发现RH Linux要比Amazon Linux贵非常多,就换了。不过,也可以看到Amazon上生态非常完善,如果是企业级应用,对稳定性诉求更高,可以选择RH Linux。

2017年12月27日 调整上传文件大小的限制

为了上传更大的文件(PDF),于是调整了上传文件大小限制。参考了这篇文章:Is The WordPress Upload Limit Giving You Trouble? Here’s How To Change It,操作包括:

更改了/etc/php.ini的配置:upload_max_filesize = 5M 重新启动httpd之后,配置生效。

2016年03月14日 关闭gravatar服务

鉴于速度太慢,关闭gravatar头像服务

2016年03月14日 删除Google Reader插件

2016年03月03日 删除xmlrpc.php

因为有个IP一直不断发送POST请求到xmlrpc.php,所以将xmlrpc.php重命名为xmlrpc.php.bak,当然相应功能也就没了。同时使用iptable禁用相应IP参考

iptables -A INPUT -s 185.130.5.243 -j DROP

2011年03月13日 修改主题 增加目录插件

修改主题,删除顶端的蓝色的条纹,缩小了banner的高度

/*--- Blog Pic ---*/
#blogImg {
background:#368be6 url(images/blogImg.gif) repeat-x;
/*height:109px;*/
height:4px;
width:100%;
}
#blogPic {
/*background:#368be6 url(images/blogPic.jpg);*/
/*height:109px;*/
width:960px;
margin:0 auto;
}

2010年10月08日 新增Quotmarks Replacer

使用插件Quotmarks Replacer来解决半角引号会被自动替换成全角引号的问题

2009年12月02日 新增了mycode样式的代码

CSS样式如下:

/*------added by orczhou@gmail.com-------*/
.mycode {
  -moz-background-clip:border;
  -moz-background-inline-policy:continuous;
  -moz-background-origin:padding;
  -x-system-font:none;
  background:#222222 url(../image/code.gif) repeat scroll 0 0;
  border-left:6px solid #1664D9;
  color:#00CC00;
  display:block;
  font-family:"Courier New",Courier,monospace;
  font-size:1em;
  font-size-adjust:none;
  font-stretch:normal;
  font-style:normal;
  font-variant:normal;
  font-weight:normal;
  line-height:normal;
  margin-bottom:12px;
  overflow:auto;
  padding:10px;
  width:95%;
}
/*------added by orczhou@gmail.com-------*/
.myt1{
    color: red;
    margin-left: 30px;
    margin-bottom: 5px;
}

/*------modified by orczhou@gmail.com-------------*/
blockquote{
    margin:0,28px,0,28px;
}

2009年08月09日 添加插件”WP-Cumulus

代码更改如下:

<!--Modified by orczhou for Plugin-wp-cumulus-->
<?/php wp_tag_cloud('unit=px&smallest=12&largest=22&number=20'); /
wp_cumulus_insert();?>