如何使用Haskell编写CGI脚本?

mon*_*ono 5 apache haskell cgi apache-modules

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

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

我如何让它们一起工作?我不明白整个包/设置.

我需要mod_haskell或其他模块吗?

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

PA.*_*PA. 6

关于标题问题的简称:是的.

http://hackage.haskell.org/package/cgi

Network.cgi

用于编写CGI程序的简单库.有关 CGI规范,请参阅 http://hoohoo.ncsa.uiuc.edu/cgi/interface.html.

这是一个简单的例子,包括错误处理(并不是说Hello World可能出错)

 import Network.CGI

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

 main :: IO ()
 main = runCGI (handleErrors cgiMain)
Run Code Online (Sandbox Code Playgroud)

关于零件的整合.

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

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


gle*_*ron 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 
Run Code Online (Sandbox Code Playgroud)

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