0%

VPS 的折腾之路

果然经常跟着实验室的师兄混,总能发现点好东西。

以前玩 Ingress 的时候其实就想买一台自己的 VPS 了,因为平时用的一些简易的梯子不太稳,很想自己搭一个用,还能往上面挂博客什么的。

后来忙了,Ingress 上的也比较少了,平时对科学上网的需求也少了,博客还直接用 Hexo+Github 搞定了,于是就再也没想过买台 VPS 能用来干嘛了。

来到科大以后,我发现我们自己实验室里的服务器就多得都没人用了,然后貌似等正式入学之后还能拿学号在科大的学校云上申请服务器空间用╮(╯_╰)╭,巨大的幸福感袭来。

Anyway,今天的主题是这个:


VPS

腾讯在 15 年 10 月启动的这个校园优惠计划,简单来讲就是在腾讯云上面创建最低配置的 VPS 是 65 元 / 月,通过腾讯校园认证之后,腾讯云会每个月发一张 64 块钱的优惠券,这样就相当于能每月 1 元使用云主机了。

另外还会每年送一张 38 元的域名优惠券,应该是在腾讯云上申请域名也是每年 38 元,这样就相当于白送了个域名。

认证需要通过学信网来完成,优惠只在大学生在校期间有效。


其实国内的 VPS 服务感觉相对国外来说还是偏贵的,从下面这个知乎提问的回答上来看:

国外好多 VPS 动辄 5$ 一个月,19.99$ 一年的价格,相比腾讯云最便宜的也要 65 元 / 月,阿里云我看了下也不比腾讯便宜。相较国外的有的差不多能有 10 倍的差价了。

更重要的是国内的 VPS 不止贵,而且节点还在墙内。。拿来搭梯子都不行。。-_-

额,写到这里突然发现 BAT 三家里面两家都做了云服务,没听说过百度的不太应该啊。查了一下果然百度也有个开放云,不过似乎知名度不高的样子,以前我都没怎么听说过这个。

也真是坑啊~~

不过从另一个角度来看,国外的服务毕竟远,说不定什么时候倒掉了也不一定,流量还有被大墙杀掉的危险性。国内的 VPS 至少在访问上还是相当稳定的,速度也比较快,而且如果是用来搭网站,经过备案之后还可以开 CDN 加速,个人感觉体验上会更好一点。

校园计划

阿里云也针对在校大学生推出过校园计划,9.9 元 / 月的价格,可惜想要得到这个资格貌似需要抢购?每天只有限量 30 台的样子。

腾讯云的 1 元服务器还送域名已经是非常良心了,我之前注册域名的地方是 DNSPOD,在 14 年 8 月已经直接并入腾讯云了,从域名的解析体验上来看,还是相当不错的,这也让我对腾讯云的服务有着不错的信心。

这份安利我吃了!!

开始折腾

昨天在腾讯云上完成了注册和学生认证(现在用的还是本科的身份认证的,下半年应该需要拿研究生的身份重新认证一次),今天早上就收到了发过来的优惠券,然后果断开始动手了。

搭站的过程其实没什么可说的,整个流程非常简单。

选好服务器节点的位置、配置、操作系统等等参数,再选上优惠券刷个一元钱,就能在腾讯云的管理界面上看到 VPS 正在生成了。

创建完成的 VPS 会分配一个公网的 IP,可以用之前设定的密钥来登录,如果有多台 VPS 选在同一个服务器大区里面的话,还能通过内网地址来互相访问。


由于实验室里面的服务器用 CentOS 的比较多,也相对稳定一些,在师兄的建议下我还是选装了 CentOS7.1。

装一些基本的软件,创建个非 root 账户,然后再配一下自己常用的环境,之后就可以把 LAMP 环境给搭起来用了。MySql 和 Php 我暂时还没想好要用来做什么,所以准备先装个 Apache,考虑可以把 Github 上的静态博客迁移到腾讯云上去。

Apache

比较神奇的是,Apache 在 CentOS 软件库里面不叫 Apache,叫 httpd。除了 Ubuntu Server 我没在其他发行版下装过这个,不知道别的是不是也这样。

简单地使用 yum 指令装上即可。

1
$ yum install httpd

然后启动 httpd 的服务,并添加开机启动。

1
2
$ systemctl start httpd
$ systemctl enable httpd

这样就可以了。Apache 会自动把 /var/www/html/ 目录映射给 80 端口,访问服务器的 IP 地址即可看到其中的页面。

然后要在腾讯云的管理台上打开这台 VPS 的 80 端口,我在创建时默认只打开了用来 ssh 登录的 22 端口。

在安全组里面添加一个 80 端口的配置文件,然后把这台 VPS 的安全组加上即可。

可以直接在浏览器里面输入服务器 IP 来测试 Apache 是否生效。

Swap 空间

云服务器给的 1G 内存有可能会不够用,例如要在上面跑某些大内存需求的服务时。

配置 swap 分区 /swap 文件可以防止当内存用满时操作系统强杀进程的情况。

这里有一篇写得不错的教程:

使用这两个命令可以查看当前系统中的 Swap 空间和内存情况:

1
2
3
$ swapon -s
$
$ free -m

不想额外分一个 Swap 区的话,就简单地创建 Swap 文件好了。

首先创建一个文件空间:

1
$ sudo fallocate -l 2G /swapfile

fallocate 命令用于在硬盘上预留一部分空间,正常情况下命令运行完了会在根目录生成一个名为 swapfile 的文件夹,使用 ls -lh 命令可以查看。

我在服务器上运行的时候不知道是什么问题给我报错了:

1
$ fallocate: /swapfile: fallocate failed: Operation not supported

google 了好久也没有搞明白原因,只好换个方法:

1
$ sudo dd if=/dev/zero of=/swapfile bs=512M count=4

dd 命令是用于直接按照物理参数来复制文件,if 是输入,of 是输出,bs 参数表示每次写入的大小,count 参数表示写入的次数。

创建完成之后改一下权限:

1
2
3
$ sudo chmod 600 /swapfile
$ ls -lh /swapfile
-rw------- 1 root root 2.0G May 4 18:12 /swapfile

然后就可以设定 Swap 空间了:

1
2
$ sudo mkswap /swapfile
$ sudo swapon /swapfile

再使用 swapon -sfree -m 命令查看,swapfile 文件应该已经生效了。

要使 swapfile 永久生效还需要把这个写进 fstab 挂载文件中,在 fstab 最后加上:

1
/swapfile	swap	swap	sw	0	0

重启机器即可。

Gitlab

咳咳,上面搞 Swap 空间主要是为了弄这个。Gitlab 要求安装需要 2G 内存,以支持至少 100 个用户同时协作。如果内存不足的话,可以用 Swap 空间来补充,但是性能应该会比较受影响,当然我目前是准备自己一个人用着玩,应该还是可以承受的。

Gitlab 是一个开源的 git 服务器软件,提供完整的网站页面和 git 托管功能,简单地说就是个私人定制的 Github。

官网上的安装教程非常简单,Gitlab 已经集成好了 rpm 包,只需要添加一下 Gitlab 的源站网址,然后 yum install gitlab-ce 即可。

Gitlab 的 CE 版意思为 Community Edition,免费但功能不完全,Enterprise Edition 则支持得更为完整,例如像 Github 一样的静态 pages 功能都有。

如果是手动编译安装的话,可以指定数据库使用 MySQL 或者 PostgreSQL,网页服务器也可以选择 Apache 或者 Nginx,但是直接用 rpm 包安装的话就没有办法自己定制了,默认使用的是 PostgreSQL+Nginx。

Nginx 默认用的也是 80 端口,安装 Gitlab 的时候需要把 Apache(在这里也就是 httpd 服务)关掉,不然可能影响到成功安装和测试。

不出意外的话,输入地址就能成功打开页面了。首次登录需要设置 root 的密码。


为了使 Apache 服务能正常使用(毕竟我还是想把博客移上去),我选择改掉 Nginx 的服务端口。

找到 /etc/gitlab/gitlab.rb 文件,其中记录了 gitlab 的配置信息。需要修改的地方有两个:

1
2
3
external_url 'http://localhost:16666'

unicorn['port'] = 16667

第一个是 Gitlab 对外服务的地址,默认是 80,也就是 Nginx 的地址;第二个是 Gitlab 后台使用的 Unicorn 的服务地址,默认是 8080。

重新配置所有 Gitlab 服务 gitlab-ctl reconfigure 即可。在腾讯云的安全组上打开 16666 端口,应该就可以看到配置成功生效了。


其实我原本的想要的结果是多个域名都解析到一台 VPS 的不同服务上去。比如 gitlab.jcf94.com 解析给 Gitlba,blog.jcf94.com 或者 jcf94.com 解析给博客。

在网址后面加端口号这事看上去就让人觉得不爽,尤其是 DNS 解析的时候,后面的主机记录没有办法只解析某个 ip 的端口。DNSPOD 倒是提供了一种隐性 url 的解析方式,可以把 gitlab.jcf94.com 这样的地址解析给另外一个带端口号的 ip,不过这个功能是要收费的。

Google 了一下,看来要继续从 Nginx 和 Apache 上面下手了。

我用 Nginx Apache 共存Nginx 多域名Nginx 转发 Apache 这样的关键字去找,搜出来一些还算有用的结果,然后综合了一下,最终想出了这样的方法:

Nginx 监听 80 端口,httpd 监听 16666 端口,Nginx 发现 80 端口的目标地址是 qcloud.jcf94.com 时就把服务转发给 16666 端口,交给 Apache 来处理,如果 80 端口的目标地址是 gitlab.jcf94.com,那么就自己解决。

好,首先是改端口,Nginx 的端口修改方法在上面已经写了,Nginx 改成 80,unicorn 还是 16667 吧,改完 gitlab-ctl reconfigure 一下,会重新生成包括 Nginx 在内的配置文件。

然后是 Apache 的端口,修改 /etc/httpd/conf/httpd.conf 文件,找到 Listen 80 改成 Listen 16666 即可。

然后在 /var/opt/gitlab/nginx/conf 下新增一个配置文件 apache.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
server {
listen *:80;


server_name qcloud.jcf94.com;
server_tokens off;

location / {
proxy_read_timeout 300;
proxy_connect_timeout 300;

proxy_http_version 1.1;

proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto http;

proxy_pass http://localhost:16666/;
proxy_redirect default;
}
}

主体是我直接拷的原来的 gitlab-http.conf 然后改的,关键的内容在于 server_name 和后面的 proxy_转发配置上。

然后对 gitlab-http.conf 也需要作一下修改,找到 server_name 加上 gitlab.jcf94.com 即可。

我直接重启了 Nginx 服务,发现没有生效…

原来 Nginx 加载时其实读的是这个目录下的 nginx.conf,在这个配置文件中有一句引用 gitlab-http.conf 的话,那么在下面仿照这个样子把新创建的 apache.conf 也引用进去就好了。

gitlab-ctl restart nginx 单独重启 Nginx 的服务,然后测试 gitlab.jcf94.comqcloud.jcf94.com 的情况。

完美!!

注:每次 gitlab-ctl reconfigure 之后,gitlab-http.confnginx.conf 都会重写,这里修改的内容都要重新改一遍。想要永久生效应该是需要改掉 /etc/gitlab/gitlab.rb 里面的某些东西,不过我还没找到合适的修改方法。

话说其实没事一般也不会 reconfigure,所以这个问题应该不会成为太大的困扰吧。

转移博客

开始着手把博客移到 VPS 上。

其实想了一下,只用 Nginx 已经足够支持我原来的静态博客了,非要上 Apache 主要是为了以后能往上面放一点 php 的东西上去。(至于未来到底会不会真的去折腾 php 就要以后再看啦~)。

网上推荐的教程都是在服务器上创一个 git 的用户,然后在 git 用户下建立远程库地址,但是我这台 VPS 由于前面装过 Gitlab,结果 git 帐号已经被改掉了,我也不知道这玩意默认的密码是什么,于是决定直接放到我自己的用户目录下好了。

1
2
3
4
$ cd ~
$ mkdir blog.git
$ cd blog.git
$ git init --bare

后面的 --bare 选项必须要加上,否则创建的不是远端仓库的格式,没有办法接受客户端传上来的数据。

然后可以测试一下上传是否成功,打开 hexo 的站点配置文件_config.yml,把服务器的仓库地址加到 depoly 列表里面去:

1
gitlab: jcf@qcloud.jcf94.com:blog.git,master

hexo d 上传成功即可。

然后由于这只是在我的用户目录下,接下来要做的是把上传上去的文件复制到 Apache 的网页目录下,这个可以交给 Git Hooks 来自动完成。Git Hooks 是一些运行脚本,可以设定在 git 服务器和客户端交互的多个阶段自动执行。

打开 ~/blog.git/hooks 目录,里面应该有一些写好的 sample,不过对我们来说暂时没什么用,创建一个名为 post-receive 的文件:

1
2
3
4
5
6
7
8
9
10
#!/bin/bash -l

GIT_REPO=/home/jcf/blog.git
TMP_GIT_CLONE=/tmp/blog
WWW=/var/www/html

rm -rf ${TMP_GIT_CLONE}
git clone ${GIT_REPO} ${TMP_GIT_CLONE}
rm -rf ${WWW}/*
cp -rf ${TMP_GIT_CLONE}/* ${WWW}

脚本的内容非常简单,即首先从 blog.git 中 clone 出能够正常读写的文件,然后把文件复制到 Apache 的网页目录下。

处理一下权限问题:

1
2
3
$ chmod +x post-receive
$
$ sudo chmod 777 -R /var/www/html

一个是 post-receive 这个文件的运行权限,另外就是对 html 目录的读写权限,为了省事我直接 777 了。。。简单粗暴。这样就完成了全部的设置。

可以 sh post-receive 测试一下脚本是否可用,之后每次 hexo d 上传成功之后,都会执行这个脚本的内容。


当然,博客移到 VPS 之后,后面还需要处理一下域名解析等等其他的小问题,这个就不详细记录了。

例如做一下博客站双机备份切换,原来用的是 Github+Gitcafe,现在用 VPS 作主站,Github Pages 仍然可以作为备份站来使用。

VPN 跳板

有时候需要在校外远程 vpn 到实验室的机器上,实验室本来是有搭好了 vpn 可以直接用的,但是坑爹的是当地的网络可能会出现各种问题:例如路由器没开 vpn 穿透、本地存在重名 ip 等等。然后就连不上。

试了下腾讯云跟实验室之间是通的。

最后想到个办法就是 ssh 连到腾讯云上去,腾讯云连实验室 vpn,然后再 ssh 到机器上工作,相当于把腾讯云做了个跳板。

首先确定软件都已经装上了:

1
$ sudo yum install pptp pptp-setup

需要用到的主要是这个 pptpsetup,设置的方式很简单:

1
$ sudo pptpsetup --create VPN_Name --server VPN_IP --username VPN_Username --password VPN_Password --encrypt --start

最后两个选项 --encrypt 是采用加密,--start 是立即启动,只是创建配置文件的话可以不加 --start

创建好文件之后用:

1
$ sudo pppd call ACSA

即可开启 vpn,然后可以用 ifconfig 看看出现了 ppp0 就连接成功了。

不过这样还不能直接用,因为路由没走 vpn,虽然连上了但是流量还是按照原来的路由走,需要手动加上路由。

1
$ sudo ip route add xxx.xxx.xxx.xxx dev ppp0

把实验室那几台机器的 ip 加上即可。

添加 default 和 0.0.0.0 的话就是全局用 vpn,我测试的时候发现全局转完之后我电脑和腾讯云的 ssh 就断了,还好在腾讯云网页上的终端还能进,赶紧把网络重置了,差点就悲剧了

顺手写了两个用于开关 VPN 的脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#! /bin/bash

# Start The VPN

VPN=`ifconfig|grep ppp0`
if [ -z "$VPN" ]
then
sudo pppd call ACSA
fi

VPN=`ifconfig|grep ppp0`
while [ -z "$VPN" ]
do
VPN=`ifconfig|grep ppp0`
done

# NODE 7

sudo ip route add 114.214.166.246 dev ppp0

# SUGON

sudo ip route add 202.38.79.157 dev ppp0
1
2
3
4
5
6
7
8
9
#! /bin/bash

# Stop The VPN

sudo killall pppd

# Reset The Network

sudo systemctl restart network

后话

从 ping 值上来看,腾讯云的地址响应速度比 Github 的地址要快上很多:

这张图是在我迁移博客之前截的。

腾讯域名解析

虽然我原来已经在 DNSPOD 上面买过域名了,本着不用白不用的原则,迅速建了个域名。

腾讯云上的域名解析虽然写着说是基于 DNSPOD,但是感觉这个功能特别简陋,几乎没有任何进阶的设置功能。然后解析能够支持的记录类型也不如 DNSPOD 多。

不知道是不是这个域名的实名审核还没结束的问题,添加一条 CNAME 记录之后一直没有生效。在 DNSPOD 上面加完几乎是刷新几遍的时间就能正常使用了。

似乎腾讯云上面注册的域名不备案真的解析不了… 完成实名审核之后还是没有生效。只好把这个域名放到 DNSPOD 里面去解析了。所有权还是在腾讯云上,解析交给 DNSPOD 来完成,完美解决。


如果这台 VPS 只是拿来挂个博客,感觉确实是有点没意思哈哈。


再后话

本科毕业前夕,我问过客服升学之后能不能继续,他们说到时候重新验证一下就行了。所以我在中间补上了 2 个月的费用,结果后来系统上就更新了,升学不能重新认证。

然后就呵呵了。

最后觉得,有需求还是花点钱上个国外的 VPS 吧,现在拿了 Github 的学生优惠,在 DigitalOcean 上开了一个。

再再后话

2017 年更新

Google Cloud Platform 上面提供一个一年期 300 刀的试用服务,在控制台的 Compute Engine 里面,貌似每个新的谷歌账号都能享受。

嗯,上面那个 Google 云的控制台地址在国内是被墙了的。

east-asia 的台湾机房速度快的飞起!!!

目前我的服务已经全面迁移到这个上面。

Apache 单 ip 多域名

除了这个博客以外,还放了其他的一些页面在 VPS 上,幸好 Apache 本身就是支持这种多域名的解析的,而且配置起来很方便,这个功能在 Apache 里面叫 VirtualHost。

/etc/httpd/ 目录下面新建一个 conf.vhost.d 的目录,里面就用来放不同域名的 VirtualHost 配置文件。

/etc/httpd/conf/httpd.conf 末尾加上:

1
IncludeOptional conf.vhost.d/*.conf

这样 conf.vhost.d 目录下的所有配置文件就能起效了。

然后对每个域名写个配置文件就好了,例如 jcf94.conf

1
2
3
4
5
6
7
8
9
10
11
12
<VirtualHost *:80>
Serveradmin jcf94@outlook.com
ServerName jcf94.com
DocumentRoot /var/www/html

<Directory "/var/www/html">
Options FollowSymLinks
AllowOverride All
#Require all denied
Require all granted
</Directory>
</VirtualHost>

别的域名:

1
2
3
4
5
6
7
8
9
10
11
<VirtualHost *:80>
ServerName www.xxxx.com
DocumentRoot /var/www/xxxx

<Directory "/var/www/xxxx">
Options FollowSymLinks
AllowOverride All
#Require all denied
Require all granted
</Directory>
</VirtualHost>

再再再后话

2018-03-04 更新

Google 云快到期了,所以最近正在着手找下家。

DigitalOcean 以前用了倒是还不错啦,但是以前开过的旧金山 1 号机房没货了,据传 SFO2 速度不太好,于是现在在尝试 Vultr 的日本机房。

话说 Google 云的台湾机房真的是很满意的,ping 值低的飞起,网速快的飞起,就是流量要单独收费,算下来一个月平均要 7、8 刀左右了,稍微多用点可能就要 10 刀了,想想还是算了。


现在开了 Vultr 的东京机房,比较坑爹的是日本 ip 好像没了,刷了几次刷出来的都是加拿大的,解析的时候要绕一圈,不过速度上测了一下还是要比其他地方稍微好点。

准备之后长期用了。

每月 5 刀,25G 的 SSD,1G 内存,1 T 流量,还是挺便宜的了。部分地区能买到 2.5 刀每月的机器。(这时候只有纽约和迈阿密机房有货,但是试了下这两个地方给我的 ip 似乎都被墙了)

Seafile

从 Google Cloud 移出来之后其实还有个好处,1 T 流量啊!1 T 流量!

平时很少看 YTB,科学上网对我来说主要还是在 Google 上搜搜资料,Google Play 更新一下软件,然后科学领个 Steam 游戏什么的,基本上流量用的特别少。

于是顺手用 Seafile 建个网盘,平时稍微传传东西。

官方的中文手册写的有的地方不太清楚,不过基本上搭这个还算容易。