3

服务器端 Octopress 搭建及移动方案

 2 years ago
source link: https://lucifr.com/octopress-on-server-and-portable-scheme/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

玩了几天的 Octopress,又学到了不少 git 方面的知识,越发感叹 Octopress/Jekyll 和版本控制的各种美好。而看过了 @masukomi 的文章之后又学到了新东西,这里介绍一下。

不同于 Octopress 官方文档中的在本地生成静态网站再通过 rsync 同步到服务器,本文介绍的方法是在服务器上搭建环境,然后直接将 Octopress push 到自建的服务器端 Git 仓库,由服务器来生成静态页面。

这样搞的好处

除了多出一个服务器备份 repo 外,最重要的是让服务器本身具备了生成功能而不仅仅是储存页面,使整个系统得以脱离本地环境而实现功能,通过添加一些脚本(比如 JekyllMail),就让移动发布成为可能。

这样搞的问题

  • 对服务器要求较高,要支持 ssh 登录,有 root 权限,能搭建起 git 和 ruby 环境。
  • 因为要让服务器来生成静态页面,而目前 Octopress 还不能仅针对更改部分进行生成,对于有些对 CPU 限制较多的服务器,同时文章很多,生成时间过长的话,就有可能超限而生成到一半就 kill 了。
  • 需要熟悉 Linux 下的一些基础操作,当然还有 git(不过既然是玩 Octopress 的,折腾能力应该是有的哈)。

注意提前备份,折腾坏了丢数据 Lucifr 一概不负责任!

Git,RVM,Ruby,Bundle

首先需要搭建起能够生成 Octopress 的环境,这需要你能够通过 SSH 登入 root 账户。

注意:Lucifr 所使用的是基于 Centos 5.5 的 LNMP 架构,如果使用的是不同版本 Linux,过程可能会不同。

  1. 添加 Webtatic 源并安装 Git:

    rpm -Uvh http://repo.webtatic.com/yum/centos/5/latest.rpm
    yum install --enablerepo=webtatic git
    
  2. 建立 rvm 用户及组:

    groupadd rvm
    useradd -g rvm rvm
    
  3. 将 root 用户添加到 rvm 组:

    usermod -a -G rvm root
    
  4. 安装 RVM:

    bash < <(curl -Lk https://github.com/wayneeseguin/rvm/raw/1.3.0/contrib/install-system-wide)
    
  5. 将环境变量添加到 root 账户的 .bash_profile 文件:

    echo '[[ -s "/usr/local/rvm/scripts/rvm" ]] && . "/usr/local/rvm/scripts/rvm"' >> ~/.bash_profile
    source ~/.bash_profile
    
  6. 这里需要先登出再重新登入一下。然后安装 zlib 包:

    rvm pkg install zlib
    
  7. 通过 RVM 安装 Ruby 1.9.2:

    rvm install 1.9.2 --with-zlib-dir=/usr/local/rvm/usr/
    
  8. 通过 RVM 设置默认 Ruby 版本为 1.9.2:

    rvm --default use 1.9.2
    
  9. 验证下 Ruby 1.9.2 是否配置成功:

    ruby -v
    
  10. 安装 Bundle:

    gem install bundle
    

在服务器上建立 Octopress 环境

  1. 首先要先将公钥加入到服务器端,具体方法就不赘述了,网上很多。

  2. SSH 登入主机后,建立一个空的 git 仓库:

    mkdir octopress_blog.git && cd octopress_blog.git
    git init --bare
    
  3. 然后我们需要改变远程仓库的工作目录到网站需要部署的位置:

    git config core.bare false
    git config core.worktree /path/to/staging/directory
    # 上一行中你需要将 /path/to/staging/directory 换成网站的部署目录,比如:/home/wwwroot/blog
    git config receive.denycurrentbranch ignore
    
  4. 用 vi 在远程仓库的 hooks 目录中创建一个 post-receive 脚本:

    vi hooks/post-receive
    
  5. 粘贴如下,同样别忘了更改 /path/to/staging/directory 和上面一致,这个脚本会在 push 时自动 checkout 到部署目录中,并执行生成静态网站命令:

    #!/bin/sh
    GIT_WORK_TREE=/path/to/staging/directory git checkout -f
    
  6. 输入 wq 保存并退出 vi,改下权限使其可以被执行:

    chmod 755 hooks/post-receive
    
  7. 现在回到本地终端下,添加这个远程仓库,这里默认你已经在本地架起了 Octopress:

    cd my_octopress_blog
    # 将 my_octopress_blog 改成你的 octopress 所在目录
    git remote add live [email protected]:/path/to/octopress_blog.git
    # 上一行中的 me 和 example.com 分别是服务器端的用户名和主机地址,/path/to/octopress_blog.git 是刚刚建立起的远程仓库的目录,如 /root/git/octopress_blog.git
    
  8. Push 到远程仓库:

    git push live master
    
  9. 现在回到服务器端,cd 进 /path/to/staging/directory,看看是否工作目录是否正常的被 checkout 了,同时也确认下 rvm 的提示,你可以运行下 rake generate 生成下静态,看看是否正常。如果一切正常,将以下两行添加到刚才的 hooks/post-receive 的最后,这样下次再 push 时就可以自动生成静态了:

    cd /path/to/staging/directory
    bundle exec rake generate
    
  10. 最后,要将虚拟主机域名指向 /path/to/staging/directory 的子目录 public(当然也可以提前弄好)

    如果和 Lucifr 一样是用 LNMP,可以运行 /root/vhost.sh 按照提示添加新的虚拟主机,绑定目录设置为 /path/to/staging/directory/public 即可。或是直接修改已有虚拟主机的 nginx 的 conf 文件(在 /usr/local/nginx/conf/vhost 中),将 server 中的 root 改到 /path/to/staging/directory/public 也可。

关于 public 目录

在服务器端,通过修改 _config.yml 可以将 public 目录放到任何目录中。

当然要注意这样一来本地的 _config.yml 就不要再 push 上去了。

全搞定了,然后呢?

在家时这么搞

和之前的 generate 再 deploy 不同,现在本地这两个命令都不用了,写了新文章或是做了其它修改之后直接:

git add .
git commit -m "site update"
git push live master

出门时这么搞

出门在外,用他人的电脑时,只要随身 U 盘里带个 SSH 的客户端,登录自己的主机,到 /path/to/staging/directory/ 中 rake new_post,把写好的文章贴进去,rake generate 即可,免去了搭建环境的麻烦,很云端的赶脚啊有木有!

回到家之后,先到 octopress_blog.git 中 commit 了,然后再在本地 merge 一下 live 就行了。

强烈推荐下 SourceTree,懒得敲命令者的福音。

另外,@masukomi 写的 JekyllMail) 可以实现通过邮件来发新文章,目前正在完善当中,看了看 README,未来的前景非常之美好,不过这个 Lucifr 还没太整明白怎么用 =_=|||。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK