在Go + FastCGI中,使用多个处理程序有意义吗?

问题描述 投票:1回答:1

地鼠新手在这里。请客气:-)

我有一个设置,在共享服务器上确实有一个帐户,该服务器运行我无法控制的Apache + FastCGI。不过,它可以与Go顺利交互。我更习惯将Go与net/http一起使用,但是弄清楚如何与net/http/fcgi一起使用似乎很简单。这是我的最小测试应用程序:

package main

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

func handler(w http.ResponseWriter, r *http.Request) {
    w.WriteHeader(http.StatusOK)
    w.Header().Set("Content-type", "text/plain; charset=utf-8")
    fmt.Fprintln(w, "This was generated by Go running as a FastCGI app")
}

func main() {
    /*
     *  
     *  Everything that is done here should be setup code etc. which is retained between calls
     *  
     */
    http.HandleFunc("/", handler)
    // This is what actually concurrently handles requests
    if err := fcgi.Serve(nil, nil); err != nil {
            panic(err)
    }
}

现在,它可以完美无瑕地工作:将其编译为例如go-fcgi-test.fcgi并将其放在适当的目录下之后,可以从类似http://my.shared.web.server/go-fcgi-test.fcgi的URL运行Go代码。为了简单起见,我省去了大部分实际处理-但这与提取表单参数,ENV变量(在Go 1.9下!)等等非常完美,因此我知道基本设置必须可以。 >

让我们尝试一个稍微复杂的示例:

package main

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

func handler1(w http.ResponseWriter, r *http.Request) {
    w.WriteHeader(http.StatusOK)
    w.Header().Set("Content-type", "text/plain; charset=utf-8")
    fmt.Fprintln(w, "This comes from handler1")
}

func handler2(w http.ResponseWriter, r *http.Request) {
    w.WriteHeader(http.StatusOK)
    w.Header().Set("Content-type", "text/plain; charset=utf-8")
    fmt.Fprintln(w, "This comes from handler2")
}

func main() {
    http.HandleFunc("/first", handler1)
    http.HandleFunc("/", handler2)
    if err := fcgi.Serve(nil, nil); err != nil {
            panic(err)
    }
}

现在,在这种情况下,我希望http://my.shared.web.server/go-fcgi-test.fcgi输出This comes from handler2,的确是这样。

但是为什么http://my.shared.web.server/go-fcgi-test.fcgi/first实际上也会调用handler2,即handler1被完全忽略?注意,handler2 does

获得URL的/first位— Apache正在not剥离它—因为我可以读取r.URL.Path[1:]并确认这是发送到Go的完整路径。申请。

我在Web上使用类似的FastCGI框架发现的所有示例仅显示one

处理程序。这是FastCGI包本身的限制吗? FastCGI协议的限制(但是,为什么正确发送了整个路径?)?在Apache配置上完成了一些操作,施加了此限制(请记住,我无法触摸Apache配置)?还是我做错了什么?

((为了完整起见,我应该补充一点,我已经尝试了上述几种变体,重命名Go应用程序,使用子文件夹,使用several

处理程序,而不仅仅是一个处理程序,依此类推,等等。 )

我的现实世界场景实际上是一个小型应用程序,在不支持独立模型的情况下,应该将其作为独立Web服务器使用net/http

作为FastCGI应用程序运行甚至禁止使用(某些共享环境的提供商就是这种情况)。由于两种情况下的实际处理方式完全相同,因此唯一的区别是调用了fcgi.Serve(),而不是http.ListenAndServe()。但是,也可以在FastCGI下将net/http程序包的路由功能与不同的处理程序一起使用。

谢谢您的任何见解。即使答案是“是的,这也就是[精确地

FastCGI实现在Go下的工作方式-仅一个处理程序!”仍然有用-意味着我只需要处理自己的代码并做不同的事情(基本上,基于通过Form接口传递的参数创建自己的路由器/分派器-没关系,这是可行的!)地鼠新手在这里。请客气:-)我有一个设置,在共享服务器上确实有一个帐户,该帐户运行我无法控制的Apache + FastCGI。不过,它可以与Go顺利交互。我是...
go fastcgi
1个回答
0
投票
我意识到这是一篇老文章,但是我自己才开始玩Go和fcgi,并遇到了同样的问题。
© www.soinside.com 2019 - 2024. All rights reserved.