不使用Nginx搭建网站需要特别注意什么?

Nginx 主要的工作就是反向代理,负载均衡等。如果是做 php 开发的程序员应该对 nginx 更熟悉,因为一般会用它和 php 配合做伪静态,大型的一些网站用它+lua做一些简单的页面等等。

php 和 nginx 简直是绝配,但如果是使用Go语言开发一个单体结构的服务(特别是Web服务 ),我个人就觉得它就有些多余了,本站(www.golang-mix.com)就没有使用nginx,也没有使用其他类似于 apache 这样的反向代理。而是golang程序直接监听了80端口对外提供服务,所有请求是直接到达Go程序的。

之所以不使用 nginx 是因为这样的话就多了一层TCP连接,对于单体结构,请求到达 nginx 再由它转发给go,显得有点多余。我并不使用它去做路由,也不用负载均衡这些特性。

Go语言是静态语言,编译后的程序就是一个常驻程序,而 php 是解释型语言(尽管它也有 cli 模式,但总体很少人这样用它),所以在 php-fpm 模式下,它只能借助反向代理。

如果不使用 nginx 会有什么问题?

主要是在运营层面需要做好处理,否则会严重影响网站收录。我的网站刚上线的不久,当时还开着shell观察log,就发现有一个域名解析到了我的IP,我试着访问一下这个域名,果然直接就跳到我自己网站了。这个域名是海外域名,在国外很多人开发这样的垃圾程序,在网络上每时每刻随机扫描各种IP的80端口,发现能够正常返回 200 这个HTTP状态码,就将它自动解析过去。

没过多久又有一个域名解析到了我的IP,我立刻暂停网站,重新编写了一段代码,大致是这样的

  1. referer := strings.ToLower(strings.Trim(r.Host, "/"))
  2. if referer != "www.golang-mix.com" && referer != cfg.IP {
  3. log.Printf("非法域名 %s", r.Host)
  4. // 永久重定向 301
  5. http.Redirect(w, r, cfg.Index, http.StatusMovedPermanently)
  6. // 返回 502
  7. // http.Error(w, http.StatusText(http.StatusBadGateway), http.StatusBadGateway)
  8. return
  9. }

以上golang代码主要实现简单的域名绑定功能,生产环境下请做更严格的修改。主要实现的工作是,访问这个域名的时候仍然让它跳转到我的网站,但是通过返回一个301的response将它永久重定向到我的域名,这样它就没办法假冒我的网站了,不然会导致百度或者谷歌只收录这个域名而不收录我的域名。

本来我想返回502的,仔细查询了一下,返回301重定向是最合适的做法。因为这样是告诉搜索引擎,真正的域名需要重新跳转。