VPS 的折腾之路

<img src=http://7xjh3j.com1.z0.glb.clouddn.com/2016-04-30-qcloud-logo.jpg />

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

以前玩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的地址要快上很多:

<img src=http://7xjh3j.com1.z0.glb.clouddn.com/2016-04-30-qcloud-ping.jpg title=”Ping值测试”/>

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

腾讯域名解析

虽然我原来已经在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 建个网盘,平时稍微传传东西。

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


0%