Golang Goji:如何同时提供静态内容和api

Golang Goji:如何同时提供静态内容和api,go,goji,Go,Goji,我已经和Golang玩了两个星期,终于可以做一个真正的应用程序了。它使用NGINX提供的静态HTML文件,API使用gojiweb框架作为后端。我不使用任何Golang模板,因为一切都是Angular.Js,所以静态适合我的需要 我希望可以选择是在生产环境中使用NGINX,还是使用应用程序使用的相同端口(8000)在根目录下提供静态内容。这样,开发环境就不需要安装NGINX 因此,尝试向默认mux添加一个句柄,如下所示 goji.DefaultMux.Handle("/*", serveStat

我已经和Golang玩了两个星期,终于可以做一个真正的应用程序了。它使用NGINX提供的静态HTML文件,API使用gojiweb框架作为后端。我不使用任何Golang模板,因为一切都是Angular.Js,所以静态适合我的需要

我希望可以选择是在生产环境中使用NGINX,还是使用应用程序使用的相同端口(8000)在根目录下提供静态内容。这样,开发环境就不需要安装NGINX

因此,尝试向默认mux添加一个句柄,如下所示

goji.DefaultMux.Handle("/*", serveStatic)

func serveStatic(w http.ResponseWriter, r *http.Request) {
//http.ServeFile(w, r, r.URL.Path[1:])
//http.FileServer(http.Dir("static"))
http.StripPrefix("/static/", http.FileServer(http.Dir("static")))
}

这个句柄是在所有API路径都已注册之后执行的(否则API将无法工作)

我已经尝试过任何组合,要么它将我重定向到HTTP404,要么它将HTML内容显示为文本。两者都不好。我不知道是否有人来过这里,能告诉我我做错了什么

谢谢

虽然这与我的问题无关,但以下是我正在使用的NGINX配置:

server {
listen 80;

# enable gzip compression
    gzip on;
    gzip_min_length  1100;
    gzip_buffers  4 32k;
    gzip_types    text/plain application/x-javascript text/xml text/css;
    gzip_vary on;
# end gzip configuration

location / {
    root /home/mleyzaola/go/src/bitbucket.org/mauleyzaola/goerp/static;
    try_files $uri $uri/ /index.html = 404;
}

location /api {
    proxy_pass http://localhost:8000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

}

我遇到过类似的问题,因此以下几点可能会有所帮助

  • 请记住,将用于提供静态内容的处理程序注册为最终路由。否则,它可能会匹配所有内容

  • 也许可以尝试使用绝对路径而不是相对路径

下面是我的路线是如何用Goji设置的简化版本

func apiExampleHandler(context web.C, resp http.ResponseWriter, req *http.Request) {
    fmt.Fprint(resp, "You've hit the API!")
}

func main() {
    goji.Handle("/api", apiExampleHandler)

    // Static file handler should generally be the last handler registered. Otherwise, it'll match every path.
    // Be sure to use an absolute path.
    staticFilesLocation := "Some absolute to the directory with your static content."
    goji.Handle("/*", http.FileServer(http.Dir(staticFilesLocation)))

    goji.Serve()
}

如果你能完全控制你的URL,一个简单的策略就是在顶层划分它们。我在所有应用程序URL的开头使用
/a
,在所有静态URL的开头使用
/s
。这使得路由非常简单

我用了一段时间Goji,然后切换到Gocraft网站。但是原则是一样的,URL在任何一个框架中都是明确的。Gocraft web显然可以执行子程序;我认为枸杞也能做到这一点,但这并不明显。子程序之所以有用,有几个原因:

  • 这是消除歧义的简单方法
  • 如果路由器的搜索模式更简单,它可能会更快
  • 您可以划分代码,以便更容易理解

如果您在生产中为静态资产提供服务,您可能希望对其进行度量并改进其性能。我发现预压缩(gzip)我的JS和CSS文件会有所帮助。我在同一个文件系统中有未压缩和压缩的版本,我有一个定制的静态资产包,它可以发现预压缩的文件,并将它们提供给所有理解的客户端(几乎所有浏览器)。此外,设定未来的到期日也值得探索。这两个想法都内置于Nginx中,只需稍加努力就可以很容易地编写代码。

有趣的是,我从未想到过绝对路径。是的,它确实有效。非常感谢您花时间创建回购协议。现在我只需要处理作为纯文本的HTML,我想调整响应头应该可以了。再次感谢你,朋友!如果有人到了这里,有一个绝对文件路径的替代方法:goji.Handle(“/*”,http.FileServer(http.Dir(“./static”)),其中“static”目录位于go应用程序中。是的,子例程更清晰,但我一个接一个地编写路由并没有那么糟糕。关于Gocraft Web,我在下定决心之前评估了该框架,发现Goji更易于使用。此外,如果您查看这些基准测试,您会发现Goji的表现优于Gocraft web。关于压缩,我完全同意你的看法,实际上,Nginx是为生产选择的web服务器。这个问题是由于Nginx比较麻烦的开发环境(Windows)造成的。我通常在Linux上开发,所以不用担心。无论如何,谢谢。朱利安·施密特的HttpRouter看起来令人印象深刻(尽管它们是他的基准,所以并不公正)。()我怀疑他不是在比较同类,例如Gocraft web子程序和他的自动子程序。因此,基准测试使他的API看起来不错。尽管如此,这意味着他有利于他的简单性。同意,基准不能太认真,但Goji仍然足够快,满足我的需要。除了他的基准,我昨天试用了HttpRouter——我喜欢它。