【问题标题】:Serving a yesod application as a (Fast)CGI将 yesod 应用程序作为(快速)CGI 服务
【发布时间】:2021-01-07 21:27:56
【问题描述】:

我正在尝试将 yesod 应用程序作为 CGI(或 FastCGI)程序提供,但 Apache 向我显示 500 错误:

[2020 年 9 月 21 日星期一 17:35:41.425565] [http:error] [pid 2758] [client 10.0.2.2:43872] AH02429:响应标头名称“21/Sep/2020”包含无效字符,正在中止请求

stack new project yesodweb/sqlite 的新模板开始,我尝试通过更改src/Application.hs 将其转换为CGI 程序。

我已经导入了 Wai CGI 库

import Network.Wai.Handler.CGI              (run)

并将appMain的最后一行更改为run app

-- | The @main@ function for an executable running this site.
appMain :: IO ()
appMain = do 
    -- Get the settings from all relevant sources
    settings <- loadYamlSettingsArgs
        -- fall back to compile-time values, set to [] to require values at runtime
        [configSettingsYmlValue]
 
        -- allow environment variables to override
        useEnv
 
    -- Generate the foundation from the settings
    foundation <- makeFoundation settings
 
    -- Generate a WAI Application from the foundation
    app <- makeApplication foundation
                                             
    -- Run the application with Warp
    --runSettings (warpSettings foundation) app
    run app

我认为这是将其用作 CGI 程序的最小更改,但显然不起作用。

我已经查看了 yesod 的书 chapter on deploying your Webapp,它可以方便地编写适当的 Apache 配置,以便服务器可以运行应用程序。它没有说明我认为问题所在的应用程序代码的 nedded 更改。

我也检查了这个stackoverflow question,但它是近 8 年前的,所以现在已经过时了。

【问题讨论】:

  • 是的,我已经研究过了,但我找不到任何有用的东西,除了 Apache 配置,除了重写规则之外,它和我的一样。
  • 这似乎不是管理程序重启的问题,因为错误是关于响应头和它的第一次执行。

标签: apache haskell cgi yesod haskell-wai


【解决方案1】:

问题是默认的 makeFoundation 记录到标准输出,这也是 CGI 程序应该发送其响应的地方,因此您将响应标头与日志输出混合在一起,并且 Apache 尝试解析日志行作为 HTTP 标头等。

如果您将newStdoutLoggerSet 替换为newStderrLoggerSet,它应该可以工作,并且日志输出最终会出现在Apache 的“error.log”或等效文件中。

【讨论】:

  • 非常感谢,这正是问题所在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
  • 2020-11-20
相关资源
最近更新 更多