(原) 不求甚解,用go做一个静态服务,搭建Hugo内网博客

原创文章,请后转载,并注明出处。

源起

考虑到内网的Pi不要浪费,且基于安全的考虑,想将我的这个博客搬到内网这个Pi服务器上,其实外网也可以访问wyyyh.3322.org。它是做过动态域名解析的,可惜80端口和443端口被电信是整没了的。

动手

因为Hugo的博客已经是静态页面,于是两分钟做了一个静态服务器。

package main

import (
    "fmt"
	"net/http"
)
 
func main() {
    fmt.Println("Web server at 8181")
	http.Handle("/", http.FileServer(http.Dir(".")))
	http.ListenAndServe(":8181", nil)
}

Golang建立静态服务器确实简单,与Python一样。

升级

由于网上看到一些不错的404样式,希望在博客出现某些错误时,能显示有趣的样子。

之所以说不求甚解,是由于以下代码并不是常规的方式,会被高手鄙视。不过以快速解决,以及“能抓住老鼠就是好猫”的原则来处理了。

package main

import (
	"os"
    "fmt"
	"net/http"
)

func PathExists(path string) (bool, error) {
	_, err := os.Stat(path)
	if err == nil {
		return true, nil
	}
	if os.IsNotExist(err) {
		return false, nil
	}
	return false, err
}
 
func main() {
    fmt.Println("Web server at 8181")
	//http.Handle("/", http.FileServer(http.Dir(".")))
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		path := r.URL.Path[1:]
		if path=="" {
			path="index.html"
		}
		exists,_ := PathExists(path)
		if exists==false {
			path="404.html"
		}
		http.ServeFile(w, r, path)
    })
	http.ListenAndServe(":8181", nil)
}

现在内网这个博客可以在出错时看到404了。

当然,这里处理得还有点问题,比如网页状态码应该改才对,先忽略吧。

另外,家里的Pi0完全可以做一个随身携带的博客,或者其它啥的。如果能更方便的配置Wifi接入的话,那就更好了。

再升级

话说都2020年了,都在提倡https,代码本身也很简单。

package main

import (
	"fmt"
	"net/http"
	"os"
)

func PathExists(path string) (bool, error) {
	_, err := os.Stat(path)
	if err == nil {
		return true, nil
	}
	if os.IsNotExist(err) {
		return false, nil
	}
	return false, err
}

func main() {
	fmt.Println("Web server at 8181")
	//http.Handle("/", http.FileServer(http.Dir(".")))
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		path := r.URL.Path[1:]
		if path == "" {
			path = "index.html"
		}
		exists, _ := PathExists(path)
		if exists == false {
			path = "404.html"
		}
		http.ServeFile(w, r, path)
	})
	go http.ListenAndServe(":8181", nil)
	http.ListenAndServeTLS(":8182", "./wyyyh.3322.org.crt", "./wyyyh.3322.org.key", nil)

主要是最后一句。这里同时开了http和https。


自动申请证书,可以使用 acme.sh 。它会自动验证域名,并生成证书。针对现在我这种动态域名解析而且没有80端口,它是无法验证的。现在想的办法是先将解析到公网正规服务器上,证书完成后再解析回来。

相关文章