我新买了个主机,准备新建一个博客,用来记录平常遇到的各种BUG、BUG产生的原因以及解决方法。 被安利了Firekylin博客系统好几次,看起来确实也不错,也比较省心,所以就选择它了。下面记录下完整的配置过程。
主机
我买的是VIRMACH的256M的VPS,6刀一年。这个配置的VPS在官网中不显示,必须通过链接才能进入。比较便宜,而且这个配置已经足够支撑我的需求。测试发现水牛城的VPS延迟比较低,其他更低的要么断货要么要花钱。
系统果断选择了Ubuntu 14.04 Server,用起来最省心。为了省空间,选了minimum版,不过这样很多软件就都要自己装。
服务器基本配置
- 在
/etc/ssh/sshd_config
中修改SSH端口,然后service ssh restart
。 apt-get update
apt-get install htop python w3m
等等- 将
export PS1='[\u@\h: $PWD]\$ '
加入/etc/profile
以修改命令行格式。 - 同上,
TZ='Asia/Shanghai'; export TZ
以修改时区为CST。
安装事项
我的node和firekylin以及SSL证书都是安装在/opt
目录下的,这是为了方便,以及防止发生权限的问题。
首先,/opt
目录的权限必须是755,其次,firekylin文件夹及其子文件的用户名和用户组最好是Nginx的www-data,防止产生权限问题导致的CSS无法加载等问题。
安装node
在Node.js官网上下载最新的Linux x64二进制包。二进制安装的好处是,你不需要安装进行编译的库。我的minimum版本的系统连gcc和make都没有。
例如wget --no-check-certificate https://nodejs.org/dist/v6.10.3/node-v6.10.3-linux-x64.tar.xz
,执行xz -d node-v6.10.3-linux-x64.tar.xz
进行xz解压,再执行tar xvf node-v6.10.3-linux-x64.tar
对tar解包。
接着,将node目录下的bin文件夹加入PATH,例如:修改/etc/profile
文件,增加一行export PATH=$PATH:/opt/node-v6.10.3-linux-x64/bin
。之后执行该脚本或者重启终端。
安装服务器软件
- 安装Nginx:
apt-get install nginx
。 - 安装MySQL:
apt-get install mysql-server
。安装MySQL的过程中可能会报错debconf: unable to initialize frontend: Dialog
,只需执行apt-get --reinstall install bsdutils
更新一下bsdutils即可。如果还是不行就再apt-get install dialog
一下。中间要设置MySQL的root密码,自己记住。
安装Firekylin
可参考官方文档。下面简单介绍一下,以安装到/opt/firekylin/
为例。
先下载最新版本,解压。进入目录后执行npm install
安装node库依赖。但由于我的VPS内存只有256M,不够执行这个操作,会报错Killed ....] - extract:xml2js: sill doParallel extract 286
。关键是OpenVZ的VPS也不能通过建立swap文件来设置虚拟内存。因此,我是在我的Ubuntu 14.04里安装好后,直接复制node_modules文件夹过来的,这样也不麻烦。
执行npm install -g pm2
安装pm2管理器。cp pm2_default.json pm2.json
后修改pm2.json
中的cwd
为当前路径。
执行pm2 start pm2.json
启动firekylin。
执行pm2 startup upstart
以实现开机启动。
配置Nginx
cp nginx_default.conf nginx.conf
后,修改server_name
、root
。上半部分是http的配置,如果你是要用https的,可以把上半部分注释掉,下面部分取消注释,只修改下半部分即可。以本博客为例,我的nginx.conf配置如下
#server {
# listen 80;
# server_name debug.fanzheng.org;
# root /opt/firekylin/www;
# set $node_port 8360;
#
# index index.js index.html index.htm;
#
# location ^~ /.well-known/acme-challenge/ {
# alias /opt/ssl/challenges/;
# try_files $uri = 404;
# }
#
# location / {
# proxy_http_version 1.1;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_set_header Host $http_host;
# proxy_set_header X-NginX-Proxy true;
# proxy_set_header Upgrade $http_upgrade;
# proxy_set_header Connection "upgrade";
# proxy_pass http://127.0.0.1:$node_port$request_uri;
# proxy_redirect off;
# }
#
# location = /development.js {
# deny all;
# }
# location = /testing.js {
# deny all;
# }
#
# location = /production.js {
# deny all;
# }
#
#
# location ~ /static/ {
# etag on;
# expires max;
# }
#}
#https nginx conf
server{
listen 443;
server_name debug.fanzheng.org;
root /opt/firekylin/www;
set $node_port 8360;
ssl on;
ssl_certificate /opt/ssl/chained.pem;
ssl_certificate_key /opt/ssl/domain.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA;
ssl_session_cache shared:SSL:50m;
ssl_dhparam /opt/ssl/dhparams.pem;
ssl_prefer_server_ciphers on;
index index.js index.html index.htm;
location ^~ /.well-known/acme-challenge/ {
alias /opt/ssl/challenges/;
try_files $uri = 404;
}
location / {
proxy_http_version 1.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://127.0.0.1:$node_port$request_uri;
proxy_redirect off;
}
location = /development.js {
deny all;
}
location = /testing.js {
deny all;
}
location = /production.js {
deny all;
}
location ~ /static/ {
etag on;
expires max;
}
}
server {
listen 80;
server_name debug.fanzheng.org;
rewrite ^(.*) https://debug.fanzheng.org$1 permanent;
}
然后将firekylin目录下的nginx.conf文件软链接到真正的nginx目录下:ln -s /opt/firekylin/nginx.conf /etc/nginx/conf.d/debug.fanzheng.org.conf
。
执行nginx -s reload
让nginx配置生效。
配置网站
打开网站,会进入安装页面。正确输入MySQL用户名和密码后,它会自动创建数据库。
访问/admin
即可进入后台。评论系统和统计系统都比较容易在后台里修改。这里我用的是网易云跟帖和Google Analytics。
顺便再修改一下Logo和Favicon。
开启https支持
按照我的这篇文章里说的方法,进行一遍就可以了。
不过我那里用的是Apache,而这里是Nginx,因此会有点细微的差别。
主要是/.well-known/acme-challenge/
路径要手动改一下,nginx.conf
文件里已经设置了alias,按照路径对应一下就可以了。
接下来生成证书。具体来说,执行这些就可以:
mkdir ssl
mkdir ssl/challenges
cd ssl
openssl genrsa 4096 > account.key
openssl genrsa 4096 > domain.key
openssl req -new -sha256 -key domain.key -subj "/" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:debug.fanzheng.org")) > domain.csr #这里要修改一下域名
wget https://raw.githubusercontent.com/diafygi/acme-tiny/master/acme_tiny.py
openssl dhparam -out dhparams.pem 4096 #这个时间比较长,要耐心等待一下
然后把下面的代码存成脚本,执行一次就可以更新证书了。
cd /opt/ssl/
python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir /opt/ssl/challenges/ > ./signed.crt
wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
cat signed.crt intermediate.pem > chained.pem
service nginx restart
备份
使用Navicat登录到服务器的MySQL上可以很轻松地进行数据库的备份。
文件也可以通过打包下载的方式进行备份。一旦服务器挂了,也不要紧,nginx配置文件、npm库等都在网站目录下。基本上只要进行一些基本的软件安装就可以了。
Comments
注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。