开发Web服务器的提示

Óla*_*age 10 webserver projects

在这里做了一些搜索后,我发现没有关于开发Web服务器的问题.

我主要是出于两个原因这样做.作为一个侧面项目,并了解有关开发服务器程序的更多信息.这不会变成一个可用的应用程序,更像是一个学习工具

所以问题很简单.

  • 你开发了一个Web服务器吗?(不管用什么语言)
  • 你可以提供什么问题和其他好的技巧

欢迎链接到有用的网站,但不要链接到开源的工作项目,因为这是关于学习的过程.

Cha*_*tin 17

Web服务器最初只是一段非常简单的代码:

  • 在端口80上打开TCP/IP套接字
  • 虽然没有终止
    • 等待该套接字上的连接
    • 当有人向您发送HTTP标头时
      • 找到文件的路径
      • 将文件复制到套接字

所以代码的轮廓很简单.

现在,您需要处理一些复杂问题:

  • 在最简单的代码版本中,当您与一个浏览器通话时,所有其他浏览器都无法连接.您需要提出一些处理多个连接的方法.
  • 能够发送除静态文件之外的东西通常很方便(尽管第一个HTTP服务器就是这样做的)所以你需要能够运行其他程序.

处理多个连接的可能性也相对容易,有许多可能的选择.

  • 最简单的版本(再次,这是它最初的方式)是让侦听端口80的代码为该连接设置一个特定的套接字,然后分叉自己的副本来处理那个连接.该进程一直运行直到套接字关闭,然后终止.然而,这是相对昂贵的:一般来说,fork需要几十毫秒,因此限制了你运行的速度.
  • 第二种选择是创建一个轻量级进程 - 一个/ k/aa 线程 - 来处理请求.

运行程序实际上也相当容易.通常,您定义CGI目录的特殊路径; 具有通过该目录的路径的URL然后将路径名称解释为程序的路径.然后,服务器将使用fork/exec创建子进程,并将STDOUT连接到套接字.然后程序运行,将输出发送到STDOUT,然后将其发送到客户端浏览器.

这是基本模式; Web服务器所做的一切只是为这个基本模式添加了多余的功能和附加功能.

以下是一些其他来源,例如代码:


它几乎没有你真正想要的东西,但简单来说,很难从http://www.commandlinefu.com击败这个:

$ python -m SimpleHTTPServer


rei*_*ein 9

首先,请不要让它成为一个可用的项目 - 获得Web服务器的安全性非常困难.

好的,这里要记住的事情:

  1. 接受连接的线程需要尽快切换到后台线程.
  2. 你不能为每一个连接都有一个线程 - 大容量你将超出你的线程限制.
  3. 使用某种工作线程池来处理您的请求.
  4. 确保在收到HTTP GET请求时清除URL.所以我不能做像http://localhost/../../Users/blah/这样的事情 来获得更高级别的访问权限.
  5. 确保始终设置相关内容和mime类型.

祝你好运 - 这是一份很糟糕的工作.