本文讲的是,怎么利用家用宽带的公网ip,部署个人博客。

前言

由于云服务器要到期了,不知道为啥,现在续费没有学生优惠了。一个月要一百多,根本养不起啊。然后想到自己家的宽带有公网ip,之前买的一台小主机只用来当软路由,性能有点浪费。所以我决定把博客部署在自己家的小主机上面。我家的小主机装了pve系统,之前只开了一个虚拟机开了openwrt,当作软路由用,现在要当作博客服务器,需要用pve再开一个centos的虚拟机。本文前置条件是需要一个公网ip和一个虚拟机,没有这些玩不了的哈。公网ip可以打电话给宽带运营商,先说要把宽带改成桥接,用路由器拨号,然后说家里要装监控,需要公网ip。千万不要说要公网ip是为了搭建网站。

网络拓扑图

传统的方式是使用ddns直接更新域名解析的ip,这种方式的缺点就是dns更新太慢,如果ip变了,会导致网站有几十分钟的时间访问不了。
直接更新cdn回源ip则要快的多

实测从断网到恢复网站访问,只需要1-2分钟。

大大增强了网站的稳定性。

回源ip更新脚本

这里贴出我写的更新七牛云回源ip脚本,仅供参考

import json

import schedule
import time
import requests
from qiniu import Auth

localIp = ""
queryIpUrlInterface = "https://ip.dhcp.cn/json"
access_key = "七牛云access_key"
secret_key = "七牛云secret_key"
domain = "你的网站域名"
port = "开放的公网端口"


def loopTask():
    try:
        # 需要修改全局变量,需要声明
        global localIp
        req = requests.get(queryIpUrlInterface)
        resp = req.json()
        publicIp = resp["IP"]
        print(time.ctime() + ">>>>>当前公网ip:" + publicIp)
        if localIp == publicIp:
            return
        print("当前ip与公网ip不一致,开始进一步检查")
        localIp = publicIp
        # 进一步的检查,是否真的访问不了
        req = requests.get("https://" + domain)
        if req.status_code == 200:
            print("网站状态正常,不更新公网ip")
            return
        print("推送公网ip到七牛云")
        auth = Auth(access_key, secret_key)
        reqBody = {
            "sourceType": "advanced",
            "sourceURLScheme": "https",
            "advancedSources": [{
                "addr": publicIp + ":"+port,
                "weight": 1,
                "backup": False
            }],
            "testURLPath": "/404.html"
        }
        reqBody = json.dumps(reqBody)
        print(reqBody)
        url = "/domain/" + domain + "/source"
        token = auth.token_of_request(url, reqBody)
        print(token)
        headers = {"Authorization": "QBox " + token, "Content-Type": "application/json", "Host": "api.qiniu.com"}
        resp = requests.put("https://api.qiniu.com" + url, data=reqBody, headers=headers)
        if resp.status_code != 200:
            print("七牛云cdn回源地址更新失败")
            localIp = ""
        print(resp.status_code)
        print(resp.json())
    except:
        print("出现异常,跳过异常")
        return


if __name__ == '__main__':
    print("主程序开启,开启定时任务")
    loopTask()
    schedule.every().minutes.do(loopTask)
    while True:
        schedule.run_pending()  # 运行所有可以运行的任务
        time.sleep(1)