0%

用Nginx在VPS上搭建自己的web服务器并实现HTTPS

0x01

写在最前面

用过Github Pages,Coding Pages,Gitlab Pages等免费Web托管之后gitlab、github速度太慢,Cloudflare爆了,阿里云CDN域名要备案(超级麻烦),coding虽然速度快但页面会先显示5秒广告再跳转(付费去广告超级恶心),于是想到自己搞个域名,租一台VPS,然后开干。

0x02

注册域名

国内的就不说了,阿里云、腾讯云,买了域名然后你去慢慢备案吧。

这里说一下国外域名代理商。

免费优先:Freenom提供免费的域名。

ps:单次申请免费域名最长期限为1年,快到期的两周内可以进行续期(续期的最长期限也是1年)。

然后推荐一家付费域名代理商:NameCheap,自己选吧,可能要用PayPal才能付款。

ps:NameCheap对美国在校大学生提供免费的.me域名,气死国人的节奏2333

选好之后把给域名DNS添加一条“A”记录,解析到自己VPS服务器的ip。(还没有VPS就快去搞一个)

WTF?啥是VPS服务器?VPS是”Virtual Private Server”的缩写,意思是“虚拟专用服务器”,主要面向个人及企业用户,就是相当于云端有一台永不关机的电脑专供你自己使用。WTF?在云端我如何使用?每台机器有自己的ip作为它在网络上的唯一标志。要操作云端的机器咋办?最简单的办法就是远程登录——openssh

获取一台VPS主机(如果已经有就跳过)

阿里云、腾讯云等国内VPS供应商要么贵的要死,要么性能低到不行,下面推荐国外VPS(挂网站的同时还能为科学上网做梯子2333)

国内连接速度主要看线路:

电信、联通用户推荐 搬瓦工 洛杉矶-CN2线路(月付$3.99\年付$29) 优惠码看能不能百度到了2333

移动用户推荐Vultr东京节点,不过现在貌似月付$2.5的套餐卖完了,只有月付$5的了,还可以再观望一下。

0x03

ssh登录到vps

接下来的内容以Debian 8为例,因为我的VPS上跑的Debian 8

安装nginx

1
# apt-get update && apt-get install nginx

检测Nginx是否启动

1
# ps | grep nginx

如果没有任何信息输出就说明Nginx没启动,需要手动启动

1
# systemctl start nginx

将Nginx添加到开机启动

1
# systemctl enable nginx

浏览器输入服务器ip或者域名应该能看到nginx的内置的默认页面

将博客从github上拖到vps上

1
# git clone https://github.com/yourname/yourname.github.io.git /var/www/blog

编辑Nginx配置文件

删除默认站点配置文件

1
# rm /etc/nginx/sites-enabled/default

新建自己的配置文件(名称自拟)

1
# vim /etc/nginx/sites-enabled/example.com

内容如下,注意修改时别把分号吃了

1
2
3
4
5
6
7
8
9
10
11
12
13
server {
listen 80;
listen [::]:80;

server_name edward-p.ml; #你的域名

root /var/www/blog; #博客根目录
index index.html; #主页名称

location / {
try_files $uri $uri/ =404;
}
}

保存后,重启Nginx

1
# nginx -s reload

浏览器输入服务器ip或者域名应该能看到页面应该变为你博客的页面了

0x04

获取免费SSL证书并开启https

免费证书采用letsencrypt来签发,好处是letsencrypt签发的证书受到大多数主流浏览器的信任,免费证书的缺点就是每次签发有效期只有3个月,3个月之后需要回来续期。

1
2
3
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt/
./letsencrypt-auto certonly -d example.com --nginx

根据提示,提供个邮箱地址,输入Y同意使用协议等,完成证书签发后,证书文件保存在:/etc/letsencrypt/live/example.com/fullchain.pem,密钥文件保存在:/etc/letsencrypt/live/example.com/privkey.pem

修改Nginx配置

1
# vim /etc/nginx/sites-enabled/example.com

内容如下,注意修改时别把分号吃了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#监听80端口,把http强制重写跳转到https
server {
listen 80;
listen [::]:80;
server_name _;
return 301 https://$host$request_uri;
}
#https在443端口,监听443
server {
listen 443;
listen [::]:443;

ssl on;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; #证书路径
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; #密钥路径

server_name example.com; #你的域名

root /var/www/blog; #你的博客或网站根目录
index index.html;

location / {
try_files $uri $uri/ =404;
}
#自定义 404页面
error_page 404 = /404;
server_tokens off;
fastcgi_param HTTPS on;
fastcgi_param HTTP_SCHEME https;
}

别忘了三个月后回来给证书续一下期

1
2
# cd letsencrypt
# ./certbot-auto renew

0x05

利用github的Webhook实现博客自动更新

以下内容应该是node技术的一个简单应用,虽然我也不懂node,但会用就ok(Ojbk)

安装nodejsnpm

1
# apt-get update && apt-get install nodejs npm

新建一个文件夹webhook用于存放脚本

1
2
# mkdir webhook
# cd webhook

在文件夹里安装必要插件

1
# npm install github-webhook-handler --save

新建一个Shell脚本blog_update.sh

内容如下

1
2
3
4
5
6
7
8
9
#!/bin/bash
blog_dir=/var/www/blog #path to your site
cd $blog_dir
git fetch --all
git reset --hard origin/master #get the latest version
git pull
nginx -s reload
dtime=`date`
echo "success at $dtime" > d.txt

新建一个js脚本webhook.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
var http = require('http')
var createHandler = require('github-webhook-handler')
var handler = createHandler({ path: '/hook', secret: 'Yoursecret' })
// 上面的path、 secret 保持和 GitHub 后台设置的一致,参考下面的配图,content类型选择application/json
function run_cmd(cmd, args, callback) {
var spawn = require('child_process').spawn;
var child = spawn(cmd, args);
var resp = "";

child.stdout.on('data', function(buffer) { resp += buffer.toString(); });
child.stdout.on('end', function() { callback (resp) });
}

http.createServer(function (req, res) {
handler(req, res, function (err) {
res.statusCode = 404
res.end('no such location')
})
}).listen(7777)//监听端口号

handler.on('error', function (err) {
console.error('Error:', err.message)
})

handler.on('push', function (event) {
console.log('Received a push event for %s to %s',
event.payload.repository.name,
event.payload.ref);
run_cmd('bash', ['./blog_update.sh',event.payload.repository.name], function(text){ console.log(text) }); //检测到gihub发来的push之后执行脚本blog_update.sh完成博客更新
})

后台运行脚本并将log输出到文件

1
# nodejs webhook.js > out.log &

这样你每次对gihub上的repository更新后github会向你的vps发送一个push请求,你的vps收到这个请求并确认是gihub发来的没错就会执行blog_update.sh脚本使vps本地的博客目录完成更新。

0x06

KVM架构的VPS看过来

对服务器速度不满意?装个锐速试试?

锐速破解版linux一键自动安装包