如何使用Haskell编写CGI脚本?

时间:2009-12-29 15:59:00

标签: apache haskell cgi apache-modules

我想在Haskell中创建一个Web应用程序(例如,它可能是一个博客,论坛或一些动态网页),我需要什么?

(我知道我需要一个http服务器(例如apache或lighttpd)。我也知道我应该知道一些Haskell编程。)

如何让所有人一起工作?我不明白整个包/设置。

我需要mod_haskell或其他模块吗?

请问有人可以向我解释apache模块的工作原理以及如何安装它们吗?

3 个答案:

答案 0 :(得分:6)

对标题问题的简短回答:是。

请参阅http://hackage.haskell.org/package/cgi

  

<强> Network.cgi

     

用于编写CGI程序的简单库。看到   http://hoohoo.ncsa.uiuc.edu/cgi/interface.html   对于CGI规范。

     

这是一个简单的例子,包括错误处理(并不是说有很多东西可以去   Hello World错误了)

 import Network.CGI

 cgiMain :: CGI CGIResult
 cgiMain = output "Hello World!"

 main :: IO ()
 main = runCGI (handleErrors cgiMain)

关于部件的整合。

CGI是Web服务器和某些外部程序之间的编程协议和接口,通过标准输入和输出以及共享环境变量进行通信。

您需要一个支持CGI的Web服务器(大多数都这样做),您必须配置服务器,以便对于某些特殊请求(例如,具有一些特殊文件扩展名的URL),它会调用CGI程序。对于Apache Web服务器,请参阅http://httpd.apache.org/docs/2.0/howto/cgi.html

答案 1 :(得分:6)

让我们假设您正在使用您选择的编程语言创建一个动态网站。

当用户访问您的网站时,他们向http://name-of-your-site.com发出请求,并将其传递给您的服务器。

当请求到达端口80时,它由HTTP服务器(可能是Apache)收集,但可能是LightHttpd或任何其他HTTP服务器。这将收到请求并决定如何处理它。

现在想象你的网站是用python编写的,它会被存储为一堆.py文件,因此需要将请求传递给python运行时,并提供运行文件和返回文件的说明。该文件的输出。这是mod_python的作用 - 从服务器接收请求并将它们交给运行时。大多数mod还处理线程池 - 假设一分钟内有20个请求,如果每个请求以简单的方式传递给python运行时,那么你将有20个python线程全部启动,一起运行然后在进程完成时死掉。通常,Apache mods将保持一些线程的运行,以节省启动时间并将新请求传递给其中一个现有线程,这样当它完成一个请求时,它将通过接口传递另一个请求。 CGI容器以一种略微不同的方式执行相同的工作,您可能选择一个而不是另一个的原因可能与您使用的HTTP服务器有关(mod_python是为Apache设计的,例如,像FastCGI这样的东西更多地用于LightHttpd)和性能方面的考虑。如果您正在使用类似FastCGI的东西,那么您可能需要CGI Container和编程语言运行库之间的第二层接口。

所以你正在使用的图层看起来有点像这样:

HTTP Server->  CGI Layer          ->  Programming Language Runtime -> your code
Apache     ->  mod_python         ->  Python Runtime               -> index.py
LightHttpd ->  FastCGI+python_cgi ->  Python Runtime               -> index.py 

显然,我在这里使用Python作为例子,但你可以找到大多数主流语言(以及很多深奥的语言)的等效mods和cgi容器,你正在使用的Http堆栈在大多数情况下会大致相似

答案 2 :(得分:1)

也许您可能会发现HAppS有用。