Ubuntu上部署Ghost博客
所有文章搬运自我的个人主页:sheilasun.me
刚刚成功把自己的ghost博客部署到Linode VPS上了,在这里回顾并顺便整理一下从购买域名到部署代码到服务器的整个过程。
购买域名
万网或者Godaddy都可以购买,我是在后者购买的。最想要的名字全拼形式的域名已经被注册掉了,只好随便选了一个,sheilasun.me,全年收费9.99刀,还是比较实惠哒。
购买VPS
如果VPS买在大陆的话是需要备案的,比如阿里云的使用须知里就有说:
Tips:大陆地区作为网站服务器的ECS,必须完成备案接入之后方可通过域名访问。大陆之外地区暂不需要备案。
为什么我会知道呢?因为之前我就急吼吼地买了一个月阿里云,看了使用须知才后知后觉还有这回事。。。。。。当时的想法是,我马上就要看到博客布上去长什么样子,等不了了!现在!立刻!于是只好转去了国外的Linode,因为只有香港和国外的VPS是不需要备案的。
我购买Linode时选的是Fremont的机房,据说是除了东京机房以外对于国内来说速度最快的了(我买的时候压根就没有"东京机房"供选择),但就目前使用情况来看还是觉得偏慢,后面还是打算备案搬到国内VPS上。
我选了个最便宜的1024套餐,月付10刀。跟之前买的阿里云(CPU1核、内存1GB)上海区68的价格差不多,不过建议在阿里云下单前可以查查有没有优惠活动,比如说我就找到了一个九折码哈哈。
绑定域名和IP
我们都知道,每次我们访问一个网页,在浏览器中输入网址按下回车之后,浏览器得先去找DNS(Domain Name System)把域名“翻译”成ip,然后根据ip向真正的web服务器发出http请求。
关于“输入网址敲下回车之后发生了什么事情”这个问题,可以参考这篇文章在浏览器输入网址,Enter之后发生了什么?或者观看这个视频从URI到页面展现发生了什么
Godaddy有自己的DNS服务,但是据说国内访问不太稳定,如果买了Linode,可以改用Linode的DNS服务。具体做法:
Linode端:
-
登陆Linode,进入DNS Manager
-
点击"Add a domain zone"
-
填写在Godaddy买的域名、email后提交
Godaddy端:
-
登陆Godaddy,进入name server
-
将Linode的几组DNS服务添加进去
这样就完成DNS和ip的绑定了。
接下来就是操作系统的安装和运行环境的搭建了。
安装操作系统
Linode官方推荐安装Ubuntu 14.04 LTS,详细安装可以参考官网deploying-an-image,需要注意的是,root密码一定要记好,之后在本地终端或借助putty(windows下)用SSH登录到你的linode时候需要它。
安装需要一点时间,装好之后在本地用root登录试试:
sunjingdeMacBook-Pro:demo sunjing$ ssh root@45.79.97.45
root@45.79.97.45's password:
Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 4.0.4-x86_64-linode57 x86_64)
可以创建一个新用户testuser,按提示输入:
root@localhost:~# adduser testuser
Adding user `testuser' ...
Adding new group `testuser' (1001) ...
Adding new user `testuser' (1001) with group `testuser' ...
Creating home directory `/home/testuser' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for testuser
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] Y
这里分享我遇到的一个问题,我安装完系统并在本地登录成功以后,我又把linode重装了一次,再次在本地用ssh登录就出问题了,提示错误:
...
RSA host key for 45.79.97.45 has changed and you have requested strict checking.
Host key verification failed.
...
解决办法:
执行
vi ~/.ssh/known_hosts
...
45.79.97.45 ssh-rsa AAAAB3NzaC1yc2EAAAADAQA...
删除与主机45.79.97.45 rsa相关的行即可。
安装NodeJS
sudo apt-get install nodejs
npm也会一并安装的,不用做单独安装了。查看一下node和npm的版本,确认一下安装是否成功:
root@localhost:/# node -v
v0.10.38
root@localhost:/# npm -v
1.4.28
运行
把本地写好的ghost程序复制到服务器的/var/www目录下:
scp ghost.zip sheilasun@45.79.97.45:/var/www
解压之后跑起来瞅瞅:
sheilasun@localhost:/var/www$ unzip ghost.zip
sheilasun@localhost:/var/www/ghost$ node index.js
Ghost is running in development...
Listening on 127.0.0.1:2368
看起来还是挺正常的。但是一旦访问时触发了代码里的隐含bug,网站就挂了,它没有自动重启功能,所以我们用forever来守护进程。
安装forever
npm install -g forever
用forever的好处是,用forever来启动node子进程,它会监控其运行情况,当你的程序崩溃了之后,它会帮你重新启动。
生产环境下用forever启动:
sheilasun@localhost:/var/www$ NODE_ENV=production forever start index.js
warn: --minUptime not set. Defaulting to: 1000ms
warn: --spinSleepTime not set. Your script will exit if it does not stay up for at least 1000ms
info: Forever processing file: index.js
查看一下forever进程:
sheilasun@localhost:/var/www$ forever list
info: Forever processes running
data: uid command script forever pid id logfile uptime
data: [2] QNdW /usr/bin/nodejs index.js 918 923 /home/sheilasun/.forever/QNdW.log 0:0:2:27.978
我们手动把进程杀死,forever马上又会启动它:
sheilasun@localhost:/var/www$ kill -9 923
sheilasun@localhost:/var/www$ forever list
info: Forever processes running
data: uid command script forever pid id logfile uptime
data: [2] QNdW /usr/bin/nodejs index.js 918 931 /home/sheilasun/.forever/QNdW.log 0:0:0:3.411
这样就可以放心地把程序跑在服务器上啦。
反向代理
现在已经可以用域名加端口访问到网站了,但是加了端口之后网址看上去一点也不简洁,怪讨厌的,如果把我们的ghost程序跑在80端口呢?那就可以直接用域名访问了,因为80是默认端口嘛。但是这一台服务器又不仅是跑这一个ghost博客的,假如这台机子上还有一个microblog网站,我们仍然希望网址可以简洁些,访问http://microblog.me 的时候进入这个网站,那就需要microblog也跑在80端口,显然不行,因为80端口已经被ghost博客程序霸占了。这个时候,就可以用nginx在前端做反向代理解决这个问题了。
安装nginx
执行:
sudo apt-get install nginx
配置nginx
在具体的配置之前,需要先简单了解一下linux中的软连接和硬连接的概念,详细地了解可参考linux软连接硬连接概念区别。
首先看一下它们的定义:
硬连接:
The specific location of physical data.
软连接:
A symbolic path indicating the abstract location of another file.
在linux中,每个文件都会被分配一个inode(索引节点号),系统通过这个inode来定位每个文件。
通过硬连接(hard link),可以让多个文件名指向同一个inode,硬连接和原文件对应的是同一个inode。用ln命令创建硬连接:
ln originfile hardlinkfile
如果有为一个文件创建硬连接的话,只有删除了这个原文件以及其所有相关硬连接,这个文件才会被真正删除。
软连接(Symbolic Link, Soft link)则类似于Windows中的快捷方式,它的inode与原文件不同,但是内部包含了原文件的位置信息。通过它可以访问到原文件,但是它的删除与否不会影响到原文件。用ln -s 命令创建软连接:
ln -s originfile softlinkfile
简单了解了这两个概念,下面来做nginx的配置。
nginx安装完后,它的配置文件在/etc/nginx/nginx.conf,打开来瞅瞅:
sheilasun@localhost:/etc/nginx$ cat nginx.conf
...
http {
...
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
...
可以发现,在http部分底部有一行
include /etc/nginx/sites-enabled/*;
所以nginx.conf里包含了所有sites-enabled下的文件,而同时sites-enabled是连接到sites-available的。这种方式可以方便保存和应用不同站点的配置。可以为你所有的站点(在用的、停用的)各保存一个配置文件放在sites-available下,想启用某个站点配置,就在sites-enabled下为其创建一个软连接到sites-available,这样这个站点的配置内容就进入nginx.conf了,想停用了,就把这个软连接删除。
我们在sites-available下创建一个ghost的配置文件
sudo vi /etc/nginx/sites-available/ghost
拷入以下内容:
server {
listen 0.0.0.0:80;
server_name sheilasun.me;
access_log /var/log/nginx/sheilasun.me.log;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header HOST $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://127.0.0.1:2368;
proxy_redirect off;
}
}
创建软连接:
ln -s /etc/nginx/sites-available/ghost /etc/nginx/sites-enabled/ghost
这段配置的作用是监听sheilasun.me 80端口的请求,并将它转发给http://127.0.0.1:2368 处理,也就是我们的ghost程序。这样我们只要访问http://sheilasun.me 就可以打开ghost博客了。同理,我们可以再配置一个 /etc/nginx/sites-available/microblog 文件,在其中配置http://microblog.me 80端口的请求转发给http://127.0.0.1:3000处理。
最后,重启一下nginx,让配置生效:
sudo service nginx restart
至此,Ghost就部署上啦,如有错误或不当之处,欢迎大家指正!
欢迎戳→http://sheilasun.me/