apache - 将 yesod 应用程序作为(快速)CGI 服务
问题描述
我正在尝试将 yesod 应用程序作为 CGI(或 FastCGI)程序提供,但 Apache 向我显示 500 错误:
[Mon Sep 21 17:35:41.425565 2020] [http:error] [pid 2758] [client 10.0.2.2:43872] AH02429:响应标头名称“21/Sep/2020”包含无效字符,正在中止请求
从一个新模板开始stack new project yesodweb/sqlite
,我尝试通过更改将其转换为 CGI 程序src/Application.hs
。
我已经导入了 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 的关于部署 Web 应用程序的书籍章节,该章节很方便编写适当的 Apache 配置,以便服务器可以运行应用程序。它没有说明对应用程序代码的 nedded 更改,我认为这是问题所在。
我也检查了这个stackoverflow 问题,但它是近 8 年前的,所以现在已经过时了。
解决方案
问题是默认makeFoundation
日志到标准输出,这也是 CGI 程序应该发送其响应的地方,因此您将响应标头与日志输出混合在一起,并且 Apache 尝试将日志行解析为 HTTP 标头等.
如果你替换newStdoutLoggerSet
为newStderrLoggerSet
,它应该可以工作,并且日志输出将在 Apache 的“error.log”或等效文件中结束。
推荐阅读
- django - Django Admin:如何动态设置 list_per_page
- c++ - int i = f1() * f2() 的未定义行为
- javascript - 遍历 JSON 的每个键
- java - 如何将文件中的对象添加到 ArrayList 中?获得 EOFException
- javascript - 如何在JS中强制添加换行符
- angular - 打字稿http获取请求
- c# - unity 将画布面板中的选定卡片添加到字典
- vaadin - Vaadin Portlet maven依赖问题
- html - 如何让弹性项目根据内容增长,直到两者都溢出
- firebase - 如何在 Flutter Firebase 中创建文档时将文档 ID 保存在文档字段中