使用Go语言建立静态文件服务器


上篇关于Go模板库应用的文章最后咱们留下一个问题,页面模板是经过CDN引用的BootStrapcssjs文件。到目前位置咱们的服务器还没法伺服客户端的静态文件请求把服务器磁盘上的文件响应给客户端。使用和配置过Nginx服务器的必定知道Nginx自然支持静态资源的访问,那么咱们是否是也要借助Nginx才能实现处理静态文件请求呢?其实不是,在最开始的文章咱们说过“Go语言不须要依赖任何第三方组件就能构建并启动一个高并发的 HTTP 服务器。”,这篇文章就让咱们了解一下如何用Go语言的net/http库实现处理静态资源请求的问题。css

咱们先用一个简单的例子学习一下使用net/http如何建立一个静态资源服务器,而后再应用到咱们的http_demo项目中。html

Go Web 编程系列的每篇文章的源代码都打了对应版本的软件包,供你们参考。公众号中回复 gohttp08获取本文源代码

建立静态资源服务器

咱们新建一个main.go存放建立静态资源服务器和监听请求的代码,同时在相同目录下建立assets/cssassets/js目录用于存放上篇文章页面模板使用到的静态文件。数据库

main.go
assets/
└── css
    └── bootstrap.min.css
└── js
    └── bootstrap.min.js

main.go中的代码以下:编程

package main

import "net/http"

func main() {
    fs := http.FileServer(http.Dir("assets/"))
    http.Handle("/static/", http.StripPrefix("/static/", fs))

    http.ListenAndServe(":8080", nil)
}
  • 首先咱们使用http.FileServer建立一个使用给定文件系统的内容响应全部HTTP请求的处理程序。
  • http.Handle("/static/", http.StripPrefix("/static/", fs))让文件服务器使用assets目录下的文件响应URL路径以/static/开头的全部HTTP请求。
  • assets被设置为文件服务器的文件系统根目录,文件服务器会处理以/static开头的URL的请求,因此咱们须要使用http.StripPrefix()static前缀去掉才能在assets目录中搜索到请求的文件。

运行程序,而后用cURL请求一下css文件,看看有没有奏效。bootstrap

$ go run main.go

$ curl -s http://localhost:8080/static/css/bootstrap.min.css

/*!
 * Bootstrap v3.3.7 (http://getbootstrap.com)
 * Copyright 2011-2016 Twitter, Inc.
 ......

结合gorillia/mux使用文件服务器

上面的例子中文件服务器的处理程序是注册到net/http库提供的标准的ServeMux(服务复用器)中的,咱们http_demo项目为了支持复杂的路由注册使用的是gorillia/mux库提供的服务复用器。二者的工做方式不太同样,因此把文件服务器应用到咱们项目里还须要作些调整才能起做用。服务器

首先咱们先把assets目录整个拷贝到项目的根目录。并发

func RegisterRoutes(r *mux.Router) {
   // serve static file request
   fs := http.FileServer(http.Dir("assets/"))
   serveFileHandler := http.StripPrefix("/static/", fs)
   r.PathPrefix("/static/").Handler(serveFileHandler)
   ......
}
  • 使用router.PathPrefix("/static")建立一个匹配有/static前缀请求的路由。
  • 而后使用route.Handler方法将文件服务器注册成路由对应的处理程序(Handler*mux.Route上的方法)。

注册好文件服务器后,咱们把以前页面模板引用的CDN上的jscss文件换成本身服务器上的文件连接。curl

<html lang="en">
<head>
    ......
    <link href="/static/css/bootstrap.min.css" rel="stylesheet">
</head>

<body>

{{ template "nav" .}}

<div class="container">
    {{template "content" .}}
</div> <!-- /container -->

<script src="/static/js/bootstrap.min.js"></script>
</body>
</html>

而后重启服务器,访问以前的页面http:localhost:/view/index,验证一下咱们的服务器如今是否能伺服静态文件的请求了。高并发

页面样式正常,如今只要在服务器这个assets目录下的文件,咱们均可以经过http://localhost:8000/static/*路径的URL访问到。学习

今天的文章对应的源码已经打包上传,公众号回复gohttp08获取下载连接,赶快下载下来动手练习一下吧。若是文章能帮助到你,不要忘记转发、点在看分享给更多人啊。关注公众号每周第一时间获取文章更新。

前文回顾

深刻学习用Go编写HTTP服务器
使用gorilla/mux 路由器
Go Web编程--应用数据库
Go Web编程--深刻学习解析HTTP请求
Go Web 编程--超详细的模板库应用指南

相关文章
相关标签/搜索