手把手教你在小内存VPS上安装Ghost博客系统

在DigitalOcean花5美刀/月,买了个512M内存的VPS,想要安个Ghost来写写博客。DigitalOcean也有预安装Ghost的VPS卖,竟然需要买10美刀的那个Plan,太不环保,只好自己折腾安装。安装中也是遇到各种问题,同时我也发现好多人都跟我一样遇到这些问题。自己踩过的坑,记录一下,也好给后来人铺路。

我选择的是Ubuntu 16.04的镜像,其他操作系统如CentOS的安装过程相差不多。Ghost版本是目前最新的0.11.9。最近Ghost团队可能会发布1.0版本,请注意这个教程到时候可能会不适用(就在我写这篇博客的时候,我发现官网出现了1.0beta的文档)。

增加一个普通用户

这部分需要有root权限

这个步骤我不确定是不是必须的,但是我在使用root用户运行Ghost时,报了cannot run in wd的错。后来参考了这个:Npm install failed with “cannot run in wd”,里面提到了npm用户权限的问题(文档在这)。

所以,我觉得有必要增加一个普通用户:

adduser myusername #增加一个叫myusername的用户

这时这个用户还只是个普通用户,不能通过sudo执行一些需要root权限的命令,感觉很不好用啊。那我们就把这个用户加到sudoers

首先编辑/etc/sudoers

nano /etc/sudoers

打开后找到如下内容:

root    ALL=(ALL)       ALL

仿照这一行,将myusername用户添加进去:

root    ALL=(ALL)       ALL
myusername    ALL=(ALL)       ALL

Ctrl+o保存,然后Ctrl+x退出。

设置swap交换分区

如果你的内存够用,可以跳过这一步。

添加完新用户后,安装过程中遇到的第一个问题就是内存不够。由于内存只有512M,在安装node依赖包的时候报了ENOMEM的错。后来我观察了一下,其实整个Ghost的安装过程中,需要的峰值内存在530M左右。就差了这么一点,就是安装不成功。所以需要设置一个swap分区。由于DigitalOcean已经分好区了,我们选择使用文件建立swap。

先切换到刚才的那个myusername用户并进入其home目录:

su myusername
cd ~

创建一个1G的文件,其中1024000表示1024M,你可以选择想创建的大小:

dd if=/dev/zero of=$HOME/swap  bs=1k count=1024000

$HOME/swap是在你的home目录创建的swap文件的路径,你可以选择你喜欢的路径,但要注意用户权限。

把刚才那个文件用做交换分区,并使其生效:

mkswap $HOME/swap
swapon $HOME/swap

使用free命令查看内存,确认一下是否已经启用了swap:

free

在我的VPS上可以看到已经生效了:

              total        used        free      shared  buff/cache   available
Mem:         500064      142084       35292        4108      322688      324108
Swap:       1023996       16084     1007912

准备node.js环境

我使用了nvm来管理node环境,首先安装nvm:

wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash

安装完毕后,如果执行nvm命令时报错:nvm: command not found,执行:

source ~/.bashrc

使刚才的安装生效。

接下来安装Node.js。Ghost推荐使用Node.js v4 LTS,但是Node.js v6 LTS也可以使用,具体的版本支持可以看这里

由于V4马上就要退役,我选择使用V6版本。执行以下命令就能安装最新的V6 LTS:

nvm install --lts

安装Ghost

安装好node.js环境之后就可以安装Ghost了。从官网或github上下载0.11.9“稳定版”。

mkdir ghost
cd ghost
wget https://github.com/TryGhost/Ghost/releases/download/0.11.9/Ghost-0.11.9.zip
unzip Ghost-0.11.9.zip

如果没有unzip命令,请先自行安装。

安装依赖环境:

npm install --production

一段时间之后就可以安装好了。测试一下是否安装成功:
先启动Ghost

npm start --production

在VPS的另一个终端里使用curl访问:

curl http://localhost:2368

如果有html输出,表明已经正确安装了。

配置Ghost

安装好Ghost后,还有一些地方需要配置。官方推荐需要配置的有两个地方:URL和Email。如果你只是一个个人博客的话,其实Email也可以不用配置。我就只配置了URL:
找到ghost目录下的config.js并打开,修改production段的url属性为你的域名就可以了:

...
config = {
    // ### Production
    // When running Ghost in the wild, use the production environment.
    // Configure your URL and mail settings here
    production: {
        url: 'http://2kb.co',
        mail: {},
...

更详细的配置,可以去看官方文档
Email的配置,可以参考这里

安装pm2

上面使用npm start --production启动的方法必须一直开着终端窗口,我们需要让Ghost在后台一直运行。我选择使用pm2作为node的进程管理工具,其他工具(如Forever、Supervisor)可以参考官方文档

首先安装pm2:

npm install pm2 -g

然后启动Ghost:

NODE_ENV=production pm2 start index.js --name "Ghost"

其中--name "Ghost"中的Ghost可以换成你喜欢的名字。

查看Ghost的状态:

pm2 show Ghost

可以看到我的Ghost运行了两天,目前在线,还没有被重启过。

 Describing process with id 0 - name Ghost
┌───────────────────┬──────────────────────────────────────────────┐
│ status            │ online                                       │
│ name              │ Ghost                                        │
│ restarts          │ 0                                            │
│ uptime            │ 2D                                           │
...

安装nginx

Ghost自带HTTP服务器,通过配置是可以直接运行在80端口的。但是我们不这么做,我们要在Ghost前运行nginx来反向代理它。这样做有很多好处,其中一个就是你可以在一台VPS上部署很多Ghost,也可以部署其他的网站程序。

安装nginx:

sudo apt-get install nginx

如果你从源码安装,可以参考其他博文。使用apt-get方式安装,虽然可能不是最新稳定版,但是会自动为你生成适用于nginx的服务,执行启动、停止、重启等操作会方便很多。

配置nginx

安装好nginx后要对其进行一些配置,我要做这些配置:

  1. 在nginx配置文件目录下,建立一个存放虚拟主机配置文件的目录vhost;
  2. 在vhost目录里,创建适用于指定域名的配置文件;
  3. 使nginx启动时自动加载vhost目录里的所有.conf文件。

我的nginx配置文件在/usr/local/nginx/conf/目录,据我了解,不同的发行版可能会安装在不同的目录,请先确认你的配置文件目录。

第1步的目的是方便虚拟主机配置文件的统一管理,以后把新增加的域名的配置文件都放到这个目录里:

sudo mkdir /usr/local/nginx/conf/vhost

第2步,创建Ghost的配置文件(名字可以随便起,我都是按域名命名,以.conf为后缀):

sudo touch /usr/local/nginx/conf/vhost/2kb.co.conf

文件内容为(注意把2kb.co改为你的域名):

server {
 listen 80;
 server_name 2kb.co;

 location / {
     proxy_set_header   X-Real-IP $remote_addr;
     proxy_set_header   Host      $http_host;
     proxy_pass         http://127.0.0.1:2368;
 }
}

第3步,修改nginx的主配置文件。
打开/usr/local/nginx/conf/nginx.conf,在最后一个}之前加入这样一行:

include vhost/*.conf;

重启nginx,使刚才的修改生效:

sudo service nginx restart

你也可以参考官方文档,和我的步骤不太一样。

开始使用

通过以上步骤,你就可以开始使用Ghost写作了,现在打开浏览器,输入你的博客地址就能看到Ghost的界面了。

然后通过http://你的博客域名/ghost注册一个用户,开始写作吧!

我的博客是运行在DigitalOcean的最小Plan上的,每月5美元,很便宜。我选择了荷兰的机房,一般ping值在160ms左右,速度非常不错,值得推荐。

如果是国内VPS,推荐使用阿里云

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • 这是我搭建好的Ghost博客 目前网络上对搭建Ghost的教程明显比较旧了,一个流程下来并不能成功,本人整理下这篇...
    zhiyi阅读 8,737评论 18 16
  • 首先上个成品:eric.com 一.购买域名,服务器 购买的渠道很多,我是直接在阿里云官网把两个买齐的.买域名没什...
    ericze阅读 1,369评论 4 9
  • 希望黄洞洞不再肚子疼,张球球不再犯鼻炎。
    爱吃葡萄冰的鲸阅读 95评论 0 0
  • (1) 我的老师是一个特别自信的人,讲课生动详细,听她的课是一种享受。记忆中最深刻的是有一天我老师讲着讲着课就哭了...
    nico木人阅读 312评论 3 2
  • 反射:获取Class中所有字段(Field)与方法(Method),并实现调用(invoke) Java 反射简单...
    dongbingliu阅读 277评论 0 1