博客 / 詳情

返回

Wordpress博客遷移至Jekyll過程總結

想來想去還是想試試把我的博客轉成Jekyll, 一方面為了git管理, 另一方面實在是感覺請求過多速度太慢, 可改造性太差. 經過遷移後, 默認主題, 速度槓槓的, 顯示時間不到500ms哦~

安裝Jekyll

本文在CentOS7環境下操作.

環境需要

  • Ruby
  • RubyGems
  • NodeJS
  • Python 2.7(Whidy比較懶, 貌似CentOS7自帶? 還是啥時候裝了, 不會的自己搜一下= =.)

安裝Ruby2.5.0和RubyGems

目前最新穩定版本是2.5.0, CentOS自帶源的版本比較老, 我們需要第三方源rbenv來安裝最新穩定版, 安裝方法如下:
  1. 安裝rbenvRuby依賴的組件

    # yum install -y git-core zlib zlib-devel gcc-c++ patch readline readline-devel libyaml-devel libffi-devel openssl-devel make bzip2 autoconf automake libtool bison curl sqlite-devel
  2. 安裝rbenvrub-build(務必在非root用户的home下面操作)

    # cd ~
    # git clone git://github.com/sstephenson/rbenv.git .rbenv
    # echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
    # echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
    # git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
    # echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bash_profile
    # source ~/.bash_profile
  3. 查看當前可安裝的Ruby版本

    # rbenv install -l
  4. 安裝目前最新穩定版本2.5.0

    # rbenv install -v 2.5.0
    # rbenv rehash

    rbenv rehash的作用是有多個Ruby版本的時候要執行的

  5. 檢查安裝是否成功

    # rbenv versions
  6. 設置為全局(否則ruby命令無法使用?)並檢測版本是否正確

    # rbenv global 2.5.0
    # ruby -v
  7. 可選/必選安裝bundle, 因為參考的安裝資料包含Rails, 所以這個是否必須安裝尚不確定, 如果同時需要Rails, 可以查看底部的參閲文檔.

    # gem install bundler
實際上整個安裝過程已經把RubyGems安裝好了?

參閲:

  • Install Ruby on Rails with Rbenv on CentOS 7

其它:

安裝Ruby-官方文檔

安裝NodeJS

這個比較簡單, 直接安裝就好了

# yum install nodejs

用 RubyGems 安裝 Jekyll

$ gem install jekyll

創建一個Jekyll站點

接下來在當前用户的目錄下創建一個博客站點並開啓服務

# cd ~
# jekyll new blog
# cd blog
# jekyll serve --host 0.0.0.0

此時打開瀏覽器訪問[server ip]:4000即可.(例如http://118.0.156.000:4000/)

示例頁面: http://daily.whidy.net/

參閲: http://jekyllcn.com/docs/inst...

Wordpress站點遷移至Jekyll全過程

官方有遷移文檔, 支持很多種類型的博客遷移, 所以看起來也就比較簡單了, 官方文檔Import your old & busted site or blog for use with Jekyll., 我們來嘗試Wordpress遷移.

先按照他的示例, 按照自己的網站進行修改, 大致如下

$ ruby -rubygems -e 'require "jekyll-import";
    JekyllImport::Importers::WordPress.run({
      "dbname"   => "yourWordpressDatabaseName",
      "user"     => "root",
      "password" => "IcannotTellYou",
      "host"     => "localhost",
      "port"     => "3306",
      "socket"   => "",
      "table_prefix"   => "wp_",
      "site_prefix"    => "",
      "clean_entities" => true,
      "comments"       => true,
      "categories"     => true,
      "tags"           => true,
      "more_excerpt"   => true,
      "more_anchor"    => true,
      "extension"      => "html",
      "status"         => ["publish"]
    })'

保證配置無誤後, 回車, 執行報錯!

Traceback (most recent call last):
        1: from /home/whidy/.rbenv/versions/2.5.0/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'
/home/whidy/.rbenv/versions/2.5.0/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require': cannot load such file -- ubygems (LoadError)

蛋疼, 查了下資料説可能是rubygems的bug, 參閲[Ruby [SOLVED]: After ruby update to 2.5.0, require 'bundler/setup' raise exception](http://www.cloudypoint.com/Tu... 然後看了下, 貌似真的是的, 立馬升級

$ gem update --system

我説gem安裝非常坑爹, 毫無提示, 都不知道是不是正在處理執行的命令, 其實已經在執行了, 根據網絡情況多等待一下. 接着唰唰唰的出來一大段, 一直到出現RubyGems system software updated, 就更新完了, 我們再嘗試遷移命令... 又報錯!!!

Traceback (most recent call last):
        2: from -e:1:in `<main>'
        1: from /home/whidy/.rbenv/versions/2.5.0/lib/ruby/site_ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'
/home/whidy/.rbenv/versions/2.5.0/lib/ruby/site_ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require': cannot load such file -- jekyll-import (LoadError)

蛋疼, 上次不是裝了嗎, 還是我記錯了. 好吧再裝一遍

$ gem install jekyll-import

然後再執行, 反覆報錯... 於是反覆執行各種依賴包... 總結如下

$ gem install sequel
$ gem install unidecode
$ gem install mysql2

這裏説要mysql2, 然後執行上面的命令報錯, 又説要mysql-devel, 服了- -, 那隻能一步步試試看了.

$ yum install mysql-devel

接着試

$ gem install mysql2

再跑遷移命令, 繼續報錯... 信息如下

         1: from /home/whidy/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gem
/home/whidy/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/mysql2-0.5.0/li
111) (Sequel::DatabaseConnectionError)

查到説是要填寫剛才遷移命令裏面的socket, 這個填啥呢, 我查了半天有各種各樣的, 比如/var/run/mysqld/mysqld.sock, /tmp/mysql.sock等等, 可能是他們都是mysql, 而我是MariaDB, 為了從根本問題上下手, 還是看看我的MariaDB的配置文件裏面怎麼寫的吧.

這裏需要説明的是, 我的Wordpress數據庫和要遷移到的Jekyll都在同一服務器上, 因此host這裏填寫的是localhost
$ sudo vi /etc/my.cnf

查到socket=/var/lib/mysql/mysql.sock, 那麼修改遷移配置如下:

$ ruby -rubygems -e 'require "jekyll-import";
    JekyllImport::Importers::WordPress.run({
      "dbname"   => "yourWordpressDatabaseName",
      "user"     => "root",
      "password" => "IcannotTellYou",
      "host"     => "localhost",
      "port"     => "3306",
      "socket"   => "/var/lib/mysql/mysql.sock",
      "table_prefix"   => "wp_",
      "site_prefix"    => "",
      "clean_entities" => true,
      "comments"       => true,
      "categories"     => true,
      "tags"           => true,
      "more_excerpt"   => true,
      "more_anchor"    => true,
      "extension"      => "html",
      "status"         => ["publish"]
    })'

慢慢的, 從前面十幾條錯誤, 減少到了最後一條

Could not require 'htmlentities', so the :clean_entities option is now disabled.

看來還是比較成功的... 那就裝一個試試看吧

$ gem install htmlentities

安裝後, 再次執行遷移命令, 搞得心都要碎了... 複製粘貼回車...

額, 沒. 有. 任. 何. 反. 應. 的. 結. 束. 了... 難道成功了?

在安裝Jekyll的目錄下編譯一下看看...

[whidy@VM_0_3_centos blog]$ jekyll b

又報錯...

Configuration file: /home/whidy/blog/_config.yml
            Source: /home/whidy/blog
       Destination: /home/whidy/blog/_site
 Incremental build: disabled. Enable with --incremental
      Generating...
     ...此處省略字數 哈哈哈...
     Build Warning: Layout 'nav_menu_item' requested in _posts/2012-11-27-1132.html does not exist.
  Liquid Exception: Liquid syntax error (line 40): Variable '{{$r['catid']}}' was not properly terminated with regexp: /\}\}/ in /home/whidy/blog/_posts/2012-11-29-phpcms-page-solution.html
jekyll 3.7.3 | Error:  Liquid syntax error (line 40): Variable '{{$r['catid']}}' was not properly terminated with regexp: /\}\}/

查了下大概是説Liquid的正則規則, 面對{{這種玩意就掛了. 把它改成{ {, 參閲: Liquid Exception: Variable '{{ {0}' was not properly terminated with regexp: /}}/ in #466, 然後我就去_posts目錄把這篇文章手動改了... 再jekyll b一下.

[whidy@VM_0_3_centos blog]$ jekyll b
Configuration file: /home/whidy/blog/_config.yml
            Source: /home/whidy/blog
       Destination: /home/whidy/blog/_site
 Incremental build: disabled. Enable with --incremental
      Generating...
      ... 幾十條這樣的信息開始...
     Build Warning: Layout 'nav_menu_item' requested in _posts/2012-11-27-1107.html does not exist.
     ... 幾十條這樣的信息結束...
     Build Warning: Layout 'bnfw_notification' requested in _posts/2018-01-16-%e8%af%84%e8%ae%ba.html does not exist.
     Build Warning: Layout 'nav_menu_item' requested in _posts/2018-02-26-3119.html does not exist.
                    done in 9.708 seconds.
 Auto-regeneration: disabled. Use --watch to enable.

這樣就算完成了? 刷新一下我才配置的Nginx二級域名頁面, 方法大致如原文, 我靠, 昨天不是搞好了403錯誤嗎? 咋又來, 不過不怕, 已經知道是權限問題了, 我們在分析下哪裏出問題. (然後一陣胡亂修改權限後就好了- -,), 我認為估計有效的命令是這一條

# chmod 755 -R /home/whidy/blog/

然後刷新頁面, 就好了. 當然我這是裸奔的Jekyll, 沒有主題, 所以看起來很樸素. 不過還是有些問題的.

Jekyll遷移圖

比如, 之前加密的單頁面被放在導航上了. 文章列表中有一些帶數字的文章, 還有評論, 這些本不該存在- -, 所以遷移後的優化也是少不了的, 不過至此關於Wordpress遷移到Jekyll的工作已經完成.

遷移後的思考

遷移完成後, 也有一些問題是需要解決的, 大致想到的如下

  • 現有的不正確內容的修正(資源文件管理, 文章內圖片的鏈接等)
  • 主題及相關功能開發
  • 評論系統的植入, 考慮使用disqus
  • seo方面, url規則匹配舊的wordpress(考慮Nginx定向或其他方案)
  • 其他暫未想到...
如果你也想把wordpress站點內容遷移至Jekyll, 閲讀該文中發現錯誤, 或者通過該文示例過程中的嘗試發生了一些無法解決的問題, 歡迎留言~
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.