lighttpd,stdin处理并将HTTP请求转换为套接字连接/隧道



在如何处理stdin方面,我在lighttpd和CGI脚本方面遇到了一些问题。Lighttpd 似乎在客户端发出 GET 请求后立即关闭 stdin。以前,我能够使用 thttpd 允许 http 客户端连接到端口 80,然后透明地重定向到单独的内部端口。这让我可以使用Adobe Flash和XML套接字做一些有趣的事情。我应该更多地解释这一点。客户端可以是任何东西,一个Adobe应用程序,一些移动应用程序,它向服务器发送GET/redirect.cgi,然后服务器的Web服务器将其交给CGI,然后CGI进程与该客户端有一个套接字连接,它可以通过该客户端发送/接收任何它想要的东西。 下面是一个使用 netcat 作为服务器的简单 CGI 示例:

(服务器只是NC -L 9999)

test@test:/var/www/cgi-bin$ cat > redirect.cgi <<EOF ; chmod 0755 redirect.cgi
#!/bin/sh
echo -e "Content-type: text/htmlrnrn";`
nc 127.0.0.1 9999
EOF

现在我们连接到 Web 服务器并向 CGI 发出 GET,然后在客户端和服务器上进行交谈:

-- client test
nc 127.0.0.1 80
GET /cgi-bin/redirect.cgi HTTP/1.0
HOST: test.example.com
HTTP/1.0 200 OK
Content-type: text/html
server: this is the server speaking
client: this is is a test

正如你在上面看到的,客户端的 GET 请求导致 thttpd 执行重定向.cgi并且 stdin 保持打开状态,从而允许我们继续向服务器发送数据,直到我们关闭客户端套接字。相比之下,使用 lighttpd,我看到:

GET /cgi-bin/redirect.cgi HTTP/1.0
HOST: test.example.com
HTTP/1.0 200 OK
Content-type: text/html
Connection: close
Date: Tue, 29 May 2012 11:35:37 GMT
Server: lighttpd/1.4.26

使用lighttpd,CGI的stdin立即关闭。有没有办法将 lighttpd 配置为不同的行为?或者,是否有不同类型的请求(可能是 POST 或 CONNECT?)可用于实现所需的行为?我尝试了 POST,但似乎有一个固定的内容长度对我不起作用,CONNECT 的行为似乎与 GET/相同。我需要lighttpd来保持CGI的stdin打开,直到客户端关闭其套接字。欢迎任何建议。

我也尝试使用mod_proxy。所以我做到了:

$HTTP["host"] =~ "" {
        proxy.server = (
                "/testport" => (
                        "test" => (
                                 "host" => "127.0.0.1",
                                 "port" => 9999,
                         )
                )
        )
}

我看到的是:

$ nc -C -l 9999
GET /testport HTTP/1.0
Host: www.example.com
X-Forwarded-For: 127.0.0.1
X-Host: www.example.com
X-Forwarded-Proto: http
server: saying hello
blah

但是"服务器:打招呼"的东西永远不会回到客户端,所以这对我也不起作用。

更新:lighttpd 1.4.46(2017 年发布)添加了多种接受 WebSocket 连接的方法:

  • Lighttpd mod_wstunnel
  • Lighttpd mod_proxy
  • Lighttpd mod_cgi

虽然你可以使用HTTP/1.1 Transfer-Encoding: chunked以及lighttpd mod_proxy和lighttpd.conf server.stream-request-body = 1server.stream-response-body = 1,但使用WebSockets可能是更好的解决方案。

最新更新