代码之家  ›  专栏  ›  技术社区  ›  Maestro

Netcat网络服务器不可靠?

  •  1
  • Maestro  · 技术社区  · 3 年前

    如果您在Bash中创建一个非常简单的Web服务器:

    #!/usr/bin/env bash
    
    HTML="<!DOCTYPE html><HTML><BODY>Test</BODY></HTML>"
    
    LENGTH="${#HTML}"
    RESPONSE="HTTP/1.1 200 OK\nContent-Length: ${LENGTH}\nConnection: close\n\n$HTML\n\n"
    
    while true; do
      echo -en "$RESPONSE" | nc -lp 80
    done
    

    那么它在Chrome上就不可靠了。很多时候页面都会超时 ERR_CONNECTION_RESET ,其他时候效果很好。

    我试着调试这个问题,结果似乎是Chrome同时触发了两个请求(因为它还想获取 favicon.ico 文件),因为netcat在每次请求后都会重新启动,所以第二次请求为时已晚。此问题也记录在此处: https://carltonhenderson.github.io/nc-makes-a-bad-web-server/ 即使是 -k 这个选项似乎并没有帮助。

    有什么办法解决这个问题吗?因为文章建议使用nginx,但我想继续使用netcat。

    1 回复  |  直到 3 年前
        1
  •  2
  •   Ted Lyngmo    3 年前

    我会将服务部分与响应分开,并用 --exec 并保持与的连接打开 --keep-open 以下为:

    serv.sh

    #!/usr/bin/env bash
    nc -lp 80 --exec ./resp.sh --keep-open
    

    然后把你的反应转移到 resp.sh 以下为:

    分别

    #!/usr/bin/env bash
    
    HTML="<!DOCTYPE html><HTML><BODY>Test</BODY></HTML>"
    
    LENGTH="${#HTML}"
    RESPONSE="HTTP/1.1 200 OK\nContent-Length: ${LENGTH}\nConnection: close\n\n$HTML\n\n"
    
    echo -en "$RESPONSE"
    

    注意:您可以使用修改最大连接 --max-conns 选项

    注意:我正在使用 “Ncat:版本7.93( https://nmap.org/ncat )”