从 WordPress 到 Hugo:我的博客迁移全记录

背景 我的博客建于 2014 年,最初使用 WordPress 搭建。十年来,积累了 282 篇文章,涉及技术笔记、产品评测、行业观察等多个类别。 但随着时间推移,WordPress 的问题越来越明显: 性能瓶颈:每次访问都要查询数据库,响应慢,需要缓存插件维持 维护负担:核心、插件、主题需要频繁更新,安全隐患多 资源消耗:PHP + MySQL 的组合对服务器资源要求较高 备份复杂:需要同时备份数据库和文件,恢复流程繁琐 2026 年初,我决定将博客迁移到 Hugo —— 一个基于 Go 语言的静态网站生成器。 迁移完成后,博客的访问速度提升了 5-10 倍,服务器资源占用降低了 90% 以上。 本文记录了整个迁移过程,希望对有类似需求的朋友有所帮助。 一、为什么选择 Hugo? 在决定迁移之前,我对比了几种主流的静态网站生成器: 工具 优点 缺点 Hugo 极快(毫秒级构建)、Go 原生、主题丰富 模板语法需要学习 Jekyll GitHub 原生支持、生态成熟 Ruby 依赖、构建较慢 Hexo 中文社区活跃、上手简单 Node.js 依赖、插件质量参差 Astro 现代化、支持多框架 相对较新、迁移资源少 最终选择 Hugo 的原因: 构建速度:282 篇文章的构建时间不到 5 秒 单文件部署:Hugo 是一个独立二进制文件,无需安装依赖 主题生态:PaperMod、Stack 等主题现代且维护活跃 迁移工具:社区有成熟的 WordPress 转 Hugo 方案 二、迁移方案设计 2.1 迁移流程概览 WordPress (MySQL) ↓ 导出 WXR XML(WordPress 导出工具) ↓ PHP 转换脚本(自定义 wp2hugo.php) ↓ Hugo Markdown 文件 ↓ Hugo 构建 ↓ 静态 HTML(Nginx 托管) 2.2 关键决策 决策一:使用 PHP 转换而非现成工具 ...

2026年2月22日 · 4 分钟

本小站正式从阿里云迁往华为云

本站在阿里云ECS已经有5年之久了,1C2G的配置,1M带宽 外加20G云盘,一年要耗费1100多大洋~~。随着云化技术的发展,一直等着阿里能有优惠,然而一直都如此。 碰巧前段时间看到华为云的优惠活动。新注册用户 2C4G的HECS 3年只要700多。瞬间心动,直接买了。 前段时间增加了域名备案,但是一直没有机会把主机迁移。 今晚早下班,一并做了迁移。同时把好久没升级的nginx和php都升级到了最新版本 华为云 棒棒的^_^

2020年7月17日 · 1 分钟

赵岩的博客全站HTTPS改造

互联网安全和个人隐私越来越被人们关注,不仅仅是电商等交易网站都实现了全站https,现在微博、百度以及大大小小的博客都实现了全站https。如果你的网站不是https的,火狐、chrome、IE浏览器都会在地址栏前方提示用户 你当前访问的网站是不安全的。 为了跟风,赵岩的博客今天起全站使用https。 为了实现全站HTTPS。我主要做了以下工作: 第一、HTTPS证书 https使用SSL传输协议,SSL之所以安全,是因为加密传输的。初始公钥由服务器传递给浏览器,为了保证公钥安全的传输到浏览器,并被浏览器认可,我们需要一个由第三方权威机构签名的证书。详细参考《HTTPS到底是如何保证通信安全的》 普通的单域名证书一年需要1000多元,我们自然不会去花这个钱的。阿里云代理的赛门铁克提供个人免费域名证书。可以直接申请。阿里证书申请 申请的时候选择“Symantec ”、“免费型”、“一个域名”。阿里云会要求DNS或者文件验证,证明你是域名的拥有者。整个申请过程10几分钟可完成。 第二、升级Nginx Nginx需要使用–with-http_ssl_module参数编译,确保支持https。为此我趁机会升级了下Nginx的版本到最新版本。 把你的证书pem文件和私钥key文件上传到服务器。 配置nginx.conf,监听443端口并加载证书。 原来监听的80端口,301转向443端口 server { listen 80; server_name zhaoyanblog.com; include black_list; rewrite ^(.*) https://$server_name$1 permanent; } server { listen 443; server_name zhaoyanblog.com; ssl on; ssl_certificate cert/xxx.pem; ssl_certificate_key cert/xxxx.key; ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ...... 第三、全站HTTPS 1、检查网站内有没有引用了别的网站的js。需要切成https地址。或者根据document.location.protocol自适应当前的访问协议。 比如:微博、百度统计、百度站长、百度联盟广告等等组件。 http://widget.weibo.com/weiboshow/index.php 改成 https://widget.weibo.com/weiboshow/index.php 2、检查是否直接使用了本站的http地址。改成相对路径。虽然已经配置了80端口301跳转。这样改会少一步对服务器的访问。 比如:/wp-content/uploads/2017/04/zhaoyanblog_2017-04-17_14-50-20.jpg 改成 /wp-content/uploads/2017/04/zhaoyanblog_2017-04-17_14-50-20.jpg 可以通过查看浏览器的调试信息,知道哪些访问的资源仍然是http的。 第四、通知百度进行HTTPS验证 在验证好全站已经使用https,并且访问http也可以301跳转到https。我们需要通知百度等搜索引擎进行https验证。因为搜索引擎在之前都是缓存我们的http地址。需要告知他我们切到https。避免导致收录的页面丢失。 直接登录百度站长,里面有个https验证页面,点击验证即可。 至此赵岩的博客已经实现全站https ...

2018年5月20日 · 1 分钟

如何安全升级wordpress

第一步:备份 如果真到了升级后一团糟的底部,有了备份的数据,还可以重头再来。 备份分两部分: 第一部分是代码备份,对整个根目录打包存放到安全的位置 tar zcvf backup_dir/backup_20160124.tar.gz /home/wordpress/html 第二部分是数据库备份 mysqldump -u username -ppassword yourdatabase > backup_20160124.sql 第二步:本地环境搭建 在本地机器上搭建一套apache+php+mysql系统。在windows机器上,可以直接安装个省事的WAMP(Windows+APACHE+MYSQL+PHP)。 然后把备份的数据库导入到本地的机器,把备份的代码解压到apache的工作目录。 设置本地hosts,举例: 127.0.0.1 zhaoyanblog.com 浏览器访问http://zhaoyanblog.com 就是访问的本地环境。 第三步:wordpress升级演练 wordpress升级有两种形式: 一种是通过wordpress的管理后台进行升级。 另外一种是把wordpress最新安装包下载下来,把其中的wp-content删除,然后用其覆盖当前的代码。 然后访问http://zhaoyanblog.com/wp-admin/upgrade.php进行其它升级(比如数据库数据)。 最后访问本地http://zhaoyanblog.com,确认升级是否有问题。 第四步:正式环境升级 当本地升级没有问题之后,把在本地的升级步骤,再实施到正式的环境即可。 最后说一句 wordpress好多版本是为了解决老版本中的安全问题,所以时间长了wordpress的版本升级还是很有必要的。

2016年1月24日 · 1 分钟

博客适配移动浏览器

博客使用了wordpress,虽然大部分wordpress的主题都是响应式布局,也就是随着客户端屏幕大小,语言进行自由适配,但是总是不完美的。 用wordpress,首先想到的就是用插件解决这个问题。发现wptouch这款插件的页面是最舒服的一款适配移动的插件。 wptouch是专门用来解决wordpress的移动端浏览的问题,它有自己专门的主题。功能强大。 wptouch只提供基础的功能,强大的主题功能需要付费升级到pro版本。 当然wordpress适配移动端,还有其它方式,举例说: 安装专门的移动主题,然后使用wordpress-mobile-theme-switcher等插件,根据User-agent进行动态主题切换。

2016年1月17日 · 1 分钟

博客正式从apache迁移至nginx

从apache迁移到nginx,主要有以下几个方面的事情: 1、编译php和nginx 编译php的参数: ./configure –prefix=/usr/local/php5 -with-config-file-path=/usr/local/php5/etc –enable-fpm –enable-pcntl –enable-mysqlnd –enable-opcache –enable-sockets –enable-sysvmsg –enable-sysvsem –enable-sysvshm –enable-shmop –enable-zip –enable-ftp –enable-soap –enable-xml –enable-mbstring –disable-rpath –disable-debug –disable-fileinfo –with-mysql –with-mysqli –with-pdo-mysql –with-pcre-regex –with-iconv –with-zlib –with-mcrypt –with-gd –with-mhash –with-xmlrpc make make install 编译php关键的是要加–enable-fpm参数,因为nginx不像apache有php插件,可以直接调用php。nginx是通过fast-cgi连接php服务,php服务是通过fpm启动的,php的其它模块最好也编译进去,不知道wordpress会用到什么模块,否则又要重新编译。 编译nginx ./configure –prefix=/usr/local/nginx make make install nginx 没有什么选项要指定,直接编译就好了。 2、启动php-fpm cp /usr/local/php5/etc/php-fpm.conf.default /usr/local/php5/etc/php-fpm.conf 编辑配置文件:/usr/local/php5/etc/php-fpm.conf 一个是用户和群组: user = zhaoyanblog group = users 一个是端口 listen = 127.0.0.1:9000 最后启动就可以了: /usr/local/php5/sbin/php-fpm 3、启动nginx 编辑配置文件:/usr/local/nginx/conf/nginx.conf 添加http选项,增加压缩选项: gzip on; #启动压缩的最小报文大小 gzip_min_length 1k; #压缩所使用的缓存 gzip_buffers 4 16k; #压缩等级1表示最快,9表示最好 gzip_comp_level 2; #压缩支持的content-Type类型 gzip_types text/plain text/javascript application/x-javascript text/css text/xml application/xml application/xml+rss application/javascript; 里server里配置: ...

2016年1月9日 · 1 分钟

谨防黑客攻击wordpress的xmlrpc.php

最近两天随便瞟了两眼机器的负载,发现飙升到了0.6了,我的博客一向访问人很少,即便是1CPU1G的配置,负载也不会这么高的。仔细看了apache的access日志。发现大量的访问xmlrpc.php的请求。 167.114.89.173 - - [22/Nov/2015:04:52:29 +0800] "POST /xmlrpc.php HTTP/1.0" 200 370 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html)" 192.99.196.123 - - [22/Nov/2015:04:52:33 +0800] "POST /xmlrpc.php HTTP/1.0" 200 370 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html)" 192.99.196.123 - - [22/Nov/2015:04:52:39 +0800] "POST /xmlrpc.php HTTP/1.0" 200 370 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html)" 167.114.89.173 - - [22/Nov/2015:04:52:41 +0800] "POST /xmlrpc.php HTTP/1.0" 200 370 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html)" 167.114.89.173 - - [22/Nov/2015:04:52:49 +0800] "POST /xmlrpc.php HTTP/1.0" 200 370 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html)" 167.114.89.168 - - [22/Nov/2015:04:52:49 +0800] "POST /xmlrpc.php HTTP/1.0" 200 370 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html)" 192.99.196.123 - - [22/Nov/2015:04:52:51 +0800] "POST /xmlrpc.php HTTP/1.0" 200 370 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html)" 192.99.196.123 - - [22/Nov/2015:04:52:58 +0800] "POST /xmlrpc.php HTTP/1.0" 200 370 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html)" 167.114.89.168 - - [22/Nov/2015:04:52:58 +0800] "POST /xmlrpc.php HTTP/1.0" 200 370 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html)" 167.114.89.168 - - [22/Nov/2015:04:52:58 +0800] "POST /xmlrpc.php HTTP/1.0" 200 370 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html)" 167.114.89.173 - - [22/Nov/2015:04:53:04 +0800] "POST /xmlrpc.php HTTP/1.0" 200 370 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html)" 167.114.89.173 - - [22/Nov/2015:04:53:07 +0800] "POST /xmlrpc.php HTTP/1.0" 200 370 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html)" 之前也看到过类似的请求,第一眼看到User-Agent包含Googlebot/2.1,http://www.google.com/bot.html等关键字,以为是google的爬虫,没有太留意。今天仔细看了下,发现并非如此,这样的访问是大量连续存在的,而且存在多个ip地址。都是POST请求到xmlrpc.php。抓包看内容完全一样的。百度下ip大都是芬兰啊,加拿大等国外的,也没有迹象表明是google的ip。google爬虫也应该不是这样的行为,所以果断屏蔽。之前使用虚拟机,只能在apache和php层。这次使用的独立主机,最直接的的方式就是在防火墙上屏蔽它们。 ...

2015年11月22日 · 2 分钟

写个定时任务每天向百度提交新链接

百度蜘蛛的爬行是有周期性的,你当天写的文章,百度可能几天后才会收集到。为了让百度早点收录新写的文章,我们可以向百度主动提交当天的新链接,百度站长可以每个月主动提交500个链接。 首先写个脚本push.sh #!/bin/sh CURRENT_DIR=$(dirname "$0") MYSQL_USERNAME="xxxxxx" MYSQL_PASSWORD="xxxxxxxx" MYSQL_DATABASE="xxxxxxx" MYSQL_CMD="/usr/bin/mysql" #百度链接提交地址,在百度站长里可以找到 BAIDU_COMMIT_URL="http://data.zz.baidu.com/urls?site=zhaoyanblog.com&token=xxxxxxx" #找出今天所有发布的文章,post类型代码文章,publish状态表示发布状态的,排除草稿。 today=`date "+%Y-%m-%d 00:00:00"` ids=`$MYSQL_CMD -N -u $MYSQL_USERNAME -p$MYSQL_PASSWORD $MYSQL_DATABASE -e "select ID from wp_posts where post_type='post' and post_status='publish' and post_date>'${today}';"` if [ ! -n "$ids" ]; then exit; fi #把文章地址输出到一个临时文件里 cd $CURRENT_DIR rm -rf urls.txt for id in $ids; do echo "http://zhaoyanblog.com/archives/$id.html" >> urls.txt; done #提交给百度 curl -H 'Content-Type:text/plain' --data-binary @urls.txt "$BAIDU_COMMIT_URL" 然后在crontab里添加定时任务,每天晚上11点50执行: 50 23 * * * /bin/sh /home/zhaoyanblog/push/push.sh 2>&1 1»/home/zhaoyanblog/push/push.log

2015年9月30日 · 1 分钟

赵岩的博客正式加入公益404页面

写博客,写的不好的时候,就想删除,目录结构设计的不合理,就想更改。但是有一些网页已经被百度等搜索引擎收录了。用户访问的时候就会显示404页面,表示页面不存在。 在过去,网站通常的做法是把404页面写上友好的提示语,或者随机显示一则笑话,甚至是直接跳转到主页。 现在有很多大型的网站,像百度、腾讯等都已经把404页面改为公益广告,特别是寻找丢失儿童的广告。例如腾讯公司内部员工志愿者就发起了这样一起互联网公益活动,建议站长博主在自己的404页面中嵌入一段简单的代码,就能通过互联网来迅速传播失踪儿童信息,从而提高找回失踪儿童的概率。 我认为这是个好主意,从今天开始,赵岩的博客正式加入公益404页面,打开不存在的页面都会跳转到公益寻人广告页面。 比如:http://zhaoyanblog.com/404.html

2015年6月28日 · 1 分钟

最近对wordpress的优化

第一:去掉一些不用的html head内容,让页面更小 在function.php中加入: remove_action( ‘wp_head’, ‘wp_generator’); remove_action( ‘wp_head’, ‘wlwmanifest_link’); remove_action( ‘wp_head’, ‘rsd_link’); remove_action( ‘wp_head’, ‘index_rel_link’ ); remove_action( ‘wp_head’, ‘parent_post_rel_link’, 10, 0 ); remove_action( ‘wp_head’, ‘start_post_rel_link’, 10, 0 ); remove_action( ‘wp_head’, ‘adjacent_posts_rel_link_wp_head’, 10, 0 ); remove_action( ‘wp_head’, ‘feed_links’, 2 ); remove_action( ‘wp_head’, ‘feed_links_extra’, 3 ); remove_action( ‘wp_head’, ‘wp_print_head_scripts’, 9 ); remove_action( ‘wp_head’, ‘rel_canonical’ ); remove_action( ‘wp_head’, ‘wp_shortlink_wp_head’, 10, 0 ); 第二:去掉一些定时任务,这些定时任务会频繁访问数据库和网络 在function.php中加入: remove_action( ‘init’, ‘wp_schedule_update_checks’ ); remove_action( ’load-plugins.php’, ‘wp_update_plugins’ ); remove_action( ’load-themes.php’, ‘wp_update_themes’ ); remove_action( ’load-update-core.php’, ‘wp_update_plugins’ ); remove_action( ’load-update-core.php’, ‘wp_update_themes’ ); remove_action( ’load-update.php’, ‘wp_update_plugins’ ); remove_action( ’load-update.php’, ‘wp_update_themes’ ); remove_action( ‘upgrader_process_complete’, ‘wp_update_plugins’ ); remove_action( ‘upgrader_process_complete’, ‘wp_update_themes’ ); remove_action( ‘upgrader_process_complete’, ‘wp_version_check’ ); remove_action( ‘wp_maybe_auto_update’, ‘wp_maybe_auto_update’ ); remove_action( ‘wp_update_plugins’, ‘wp_update_plugins’ ); remove_action( ‘wp_update_themes’, ‘wp_update_themes’ ); remove_action( ‘wp_version_check’, ‘wp_version_check’ ); ...

2015年5月27日 · 1 分钟

博客正式迁入阿里云ECS

从今日起,我的博客正式迁入阿里云ECS服务器了。之前是用的西部数码west263的虚拟机。图的就是便宜。便宜没好货,服务器三天两头的出故障。 这是dnspod的部分监控信息: zhaoyanblog.com johnyannj.gotoip2.com. 01-29 17:21 01-29 17:39 17分钟 53秒 zhaoyanblog.com johnyannj.gotoip2.com. 01-23 23:41 01-23 23:51 10分钟 27秒 zhaoyanblog.com johnyannj.gotoip2.com. 01-21 01:01 01-21 01:05 4分钟 30秒 zhaoyanblog.com johnyannj.gotoip2.com. 01-16 18:25 01-16 18:54 28分钟 29秒 zhaoyanblog.com johnyannj.gotoip2.com. 01-12 11:05 01-12 11:24 19分钟 19秒 zhaoyanblog.com johnyannj.gotoip2.com. 01-12 02:57 01-12 07:40 4小时 43分钟 52秒 zhaoyanblog.com johnyannj.gotoip2.com. 01-11 20:50 01-11 21:14 24分钟 3秒 zhaoyanblog.com johnyannj.gotoip2.com. 01-11 15:52 01-11 16:13 21分钟 5秒 zhaoyanblog.com johnyannj.gotoip2.com. 01-11 11:51 01-11 12:08 16分钟 31秒 zhaoyanblog.com johnyannj.gotoip2.com. 01-11 05:55 01-11 07:49 1小时 54分钟 6秒 ...

2015年5月17日 · 1 分钟

有了自己域名的专属邮箱

从今天开始,本站长就有了自己的专属邮箱了zhaoyan@zhaoyanblog.com。因为是买了万网的域名,赠送的10G企业邮箱,一直没有用。现在用起来了。以后再也不用担心垃圾广告了。 如果你看到我的博客,有什么疑问,或者发现不对的地方,欢迎你给我发邮件,或者微博给我留言一起交流技术问题。

2015年4月10日 · 1 分钟

防止垃圾评论的有效方法还是验证码

本博客在上线之初,就受垃圾评论的骚扰,有一种wordpress评论机器人,每天都自动寻找wordpress站点,进行自动评论,每天都收到大量这样的垃圾评论: 我不想关闭评论功能,或者是只允许注册之后评论,因为我自己的博客,没必要,我也不想开放注册功能的。我一开始的解决方法是屏蔽这些IP,见文章:《如何屏蔽恶意访问IP》 可是屏蔽了一部分IP,过几天又有新的ip出现。目前已经屏蔽了数个IP段: 199.30.24.* 199.30.25.* 112.111.189.* 112.111.191.* 112.111.184.* 但是老是这样屏蔽也不是办法,有可能把正常用户的ip给屏蔽了。今天才想到了这个问题,在防止垃圾评论上,屏蔽IP太不专业了,垃圾评论是机器人所为,而在计算机的世界里,验证码才是自动区分计算机和人类行为的专业行为。 好了,搜索CAPTCHA,安装一个验证码wordpress插件,设置一下,ok了,再也不用担心垃圾评论的问题了。

2015年1月21日 · 1 分钟

媳妇熬成婆,本网站在百度也有了站点信息

今日早上习惯性的在百度site了一下自己的网站,惊喜的发现本站在百度也有站点信息了,截图如下: 不仅仅如此,另外一个小站也有了站点信息: 众所周知,百度推出site显示一个站点的备案等信息的功能,也就几个月时间,应该是为了识别出稳定可靠,有价值,健康的网站,以便把那些临时的,违法的网站剔除掉。在之初只有大型的门户网站以及一些出名的网站才会显示站点信息,慢慢扩大范围,据猜测,只有建站年限、收录量、访问量等一些参数满足了百度的相关条件才会被收录。 本站建站有一年有余,虽然不是每天都有更新,但也是持续到现在,本站百度收录量从只收录首先到现在三四百页,访问量从个位数的PV发展到每天近200PV,我想这是让百度信任的首要条件,其次就是本站从建站初期就使用百度统计、后来加入了百度联盟广告,这也是贴近百度的一种方式,我的第二个站也被百度显示了站点信息,但是访问量并不大,想想可能就是用了百度统计,百度联盟广告的原因,或者是沾了第一个网站的光了。 写博客是我的个人爱好,也是为了分享,博客被更多的人看到,总是高兴的,谢谢大家浏览我的博客,也希望其中的内容能对你所帮助。

2015年1月10日 · 1 分钟

千万不要自己点百度联盟的广告

因为流量有限,没有人点击我的广告,我这几天每天晚上都自己点下百度联盟的广告,每次点之前都清空cookie,自以为神不知鬼不觉,每天也有几块钱的广告收入。最终还是被百度联盟发现了,今天偶现发现了百度站内信,我的信誉等级从三颗星变为了一颗星,一颗星表示:“信誉修正期-会员存在大量的作弊违规行为,严重违反了百度联盟业务合作规范,信誉表现急需修正”。庆幸自己发现的及时,否则早被百度联盟踢出局了。 所以只有提高自己的页面质量,多发原创内容,提升网站流量,吸引自然用户点击才是王道。以后每天我再也不点击自己的广告了,默默的耕耘我的小网站,希望早日经过百度联盟的考察期。 战友们如果你也使用了百度联盟的广告,千万不要自己点百度联盟的广告,否则后悔的是你自己。谨记我这个惨痛的经历啊。

2014年9月18日 · 1 分钟